命运跟我开了一场玩笑,一个不喜欢很多游戏的人,却写起了游戏。。。
参加工作与在学校,有一点不同是:是否为强迫性的——对于工作,即使你不喜欢,同样要做。
既然在做,那就得尽力做,每个人都应该如此。
努力思考,学习。
笔记还是要做的:
笔记一:
发牌程序,对程序员来说,发牌的过程只是一个将本来排好序的数组的顺序打乱而已,这个方法耍的只是一个小聪明,使得 Random.nextInt() 方法的运行次数只等于牌的数量
笔记二:
初始化一个 TiledLayer 地图,一般情况下的 TiledLayer 地图只是一个二维数组,这个方法只是将这个二维数组正确地转化成期望的地图。
笔记三:
关于一个J2ME程序的框架,在第一次写J2ME的游戏时,只是感觉一头雾水。下面这个是总结的一点点东东:
MIDlet
GameCanvas gameCanvas;
GameThread gameThread;//如果有其它的一些事情,可以在此定义更多的线程,并在 startApp() 方法内启动线程
Display display;
startApp(){
gameThread.start();
display.setCurrent(gameCanvas);//如果有必要,可以调整显示对象
}
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
GameCanvas
LayerManager layerManager;
GameCanvas(){
super(false);
layerManager = new LayerManager(this);
}
paint(Graphics g){
switch(gameState){
case GAMING:
layerManager.paint(g, x_view, y_view);
}
}
refresh(){
layerManager.refresh();
zepaint();
}
doKeyEvent(){
int keyState = this.getKeyStates();
switch(gameState){
case GAMING:
layerManager.doKeyEvent(keyState);
break;
case ...:(other state)
//画面变化不大/非游戏状态下,调用本类的事件处理方法
break;
}
}
zepaint(){
paint(g);
flushGraphics();
}
处理静止画面在本类中
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
LayerManager
GameCanvas gameCanvas;
LayerManager(GameCanvas gameCanvas){}
refresh(){
...refresh sprites...
}
doKeyEvent(int key){
switch(key){
case ...:
handle data;
}
}
paint(Graphics g, int x, y){
super();
...paint sprites...
}
很多程序会只调用 append(Layer) 方法而不重载父类的 paint(Graphics, int, int) 方法,同样可以实现游戏中的绘画功能。而当用的是 TiledLayer 作背景时,我还不知道如果重载该方法 -_-! 本质上是对坐标系的认识不清!
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
GameThread
GameCanvas gameCanvas;
GameThread(GameCanvas gameCanvas){}
run(){
while(true){
gameCanvas.doKeyEvent();
gameCanvas.refresh();
Thread.sleep(100);
}
}
------------------------
这只是我一般程序里的框架,可不是死框架,但从我接触过的来看,这个框架还是比较经典的。
如此的笔记希望让别人能够看懂。
参加工作与在学校,有一点不同是:是否为强迫性的——对于工作,即使你不喜欢,同样要做。
既然在做,那就得尽力做,每个人都应该如此。
努力思考,学习。
笔记还是要做的:
笔记一:
发牌程序,对程序员来说,发牌的过程只是一个将本来排好序的数组的顺序打乱而已,这个方法耍的只是一个小聪明,使得 Random.nextInt() 方法的运行次数只等于牌的数量
1
/**
2 * @author liltos
3 * @param length 要发的牌数
4 *
5 * 随机发牌的程序,它的特点在于发length张牌的话
6 * 只要运行length次Random.nextInt()方法!
7 * 程序中的4个for循环,有2个用于输出,1个用于数组的初始化
8 * 只有一个for循环是用于发牌的
9 */
10 public static void randomDeliverCard( int length) {
11 int [] card1 = new int [length];
12 int [] result = new int [length];
13
14 for ( int i = 0 ; i < card1.length; i ++ )
15 card1[i] = i + 1 ;
16 for ( int i = 0 ; i < card1.length; i ++ ) {
17 System.out.print(card1[i] + " /t " );
18 if ((i + 1 ) % 9 == 0 )
19 System.out.println();
20 }
21
22 Random rand = new Random(System.currentTimeMillis());
23
24 int rand_index = 0 ;
25 int remain = card1.length;
26
27 /*
28 * 当将rand_index上的数取出后,为防止再次取到该数,
29 * 便将数组末尾的数填充到该位置上,并将数组末尾的标志remain减1
30 * 而下标随机数的取值一直是在remain范围之内的
31 */
32 for ( int i = 0 ; i < card1.length; i ++ ) {
33 rand_index = Math.abs(rand.nextInt() % remain);
34 result[i] = card1[rand_index];
35 card1[rand_index] = card1[remain - 1 ];
36 remain -- ;
37 }
38
39 System.out.println( " /n/n " );
40 for ( int i = 0 ; i < result.length; i ++ ) {
41 System.out.print(result[i] + " /t " );
42 if ((i + 1 ) % 10 == 0 )
43 System.out.println();
44 }
45 }
2 * @author liltos
3 * @param length 要发的牌数
4 *
5 * 随机发牌的程序,它的特点在于发length张牌的话
6 * 只要运行length次Random.nextInt()方法!
7 * 程序中的4个for循环,有2个用于输出,1个用于数组的初始化
8 * 只有一个for循环是用于发牌的
9 */
10 public static void randomDeliverCard( int length) {
11 int [] card1 = new int [length];
12 int [] result = new int [length];
13
14 for ( int i = 0 ; i < card1.length; i ++ )
15 card1[i] = i + 1 ;
16 for ( int i = 0 ; i < card1.length; i ++ ) {
17 System.out.print(card1[i] + " /t " );
18 if ((i + 1 ) % 9 == 0 )
19 System.out.println();
20 }
21
22 Random rand = new Random(System.currentTimeMillis());
23
24 int rand_index = 0 ;
25 int remain = card1.length;
26
27 /*
28 * 当将rand_index上的数取出后,为防止再次取到该数,
29 * 便将数组末尾的数填充到该位置上,并将数组末尾的标志remain减1
30 * 而下标随机数的取值一直是在remain范围之内的
31 */
32 for ( int i = 0 ; i < card1.length; i ++ ) {
33 rand_index = Math.abs(rand.nextInt() % remain);
34 result[i] = card1[rand_index];
35 card1[rand_index] = card1[remain - 1 ];
36 remain -- ;
37 }
38
39 System.out.println( " /n/n " );
40 for ( int i = 0 ; i < result.length; i ++ ) {
41 System.out.print(result[i] + " /t " );
42 if ((i + 1 ) % 10 == 0 )
43 System.out.println();
44 }
45 }
笔记二:
初始化一个 TiledLayer 地图,一般情况下的 TiledLayer 地图只是一个二维数组,这个方法只是将这个二维数组正确地转化成期望的地图。
1
/**
2 * @parm array 代表地图的数组
3 */
4 public void initMap( int [][] array) {
5 map = new TiledLayer(array[ 0 ].length, array.length, image, w, h);
6 for ( int i = 0 ; i < array.length; i ++ ) {
7 for ( int j = 0 ; j < array[ 0 ].length; j ++ ) {
8 map.setCell(j, i, array[i][j]);
9 }
10 }
11 }
这个方法的关键之处在于调用 构造方法和 setCell() 方法时前两个参数的顺序。
2 * @parm array 代表地图的数组
3 */
4 public void initMap( int [][] array) {
5 map = new TiledLayer(array[ 0 ].length, array.length, image, w, h);
6 for ( int i = 0 ; i < array.length; i ++ ) {
7 for ( int j = 0 ; j < array[ 0 ].length; j ++ ) {
8 map.setCell(j, i, array[i][j]);
9 }
10 }
11 }
笔记三:
关于一个J2ME程序的框架,在第一次写J2ME的游戏时,只是感觉一头雾水。下面这个是总结的一点点东东:
MIDlet
GameCanvas gameCanvas;
GameThread gameThread;//如果有其它的一些事情,可以在此定义更多的线程,并在 startApp() 方法内启动线程
Display display;
startApp(){
gameThread.start();
display.setCurrent(gameCanvas);//如果有必要,可以调整显示对象
}
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
GameCanvas
LayerManager layerManager;
GameCanvas(){
super(false);
layerManager = new LayerManager(this);
}
paint(Graphics g){
switch(gameState){
case GAMING:
layerManager.paint(g, x_view, y_view);
}
}
refresh(){
layerManager.refresh();
zepaint();
}
doKeyEvent(){
int keyState = this.getKeyStates();
switch(gameState){
case GAMING:
layerManager.doKeyEvent(keyState);
break;
case ...:(other state)
//画面变化不大/非游戏状态下,调用本类的事件处理方法
break;
}
}
zepaint(){
paint(g);
flushGraphics();
}
处理静止画面在本类中
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
LayerManager
GameCanvas gameCanvas;
LayerManager(GameCanvas gameCanvas){}
refresh(){
...refresh sprites...
}
doKeyEvent(int key){
switch(key){
case ...:
handle data;
}
}
paint(Graphics g, int x, y){
super();
...paint sprites...
}
很多程序会只调用 append(Layer) 方法而不重载父类的 paint(Graphics, int, int) 方法,同样可以实现游戏中的绘画功能。而当用的是 TiledLayer 作背景时,我还不知道如果重载该方法 -_-! 本质上是对坐标系的认识不清!
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
GameThread
GameCanvas gameCanvas;
GameThread(GameCanvas gameCanvas){}
run(){
while(true){
gameCanvas.doKeyEvent();
gameCanvas.refresh();
Thread.sleep(100);
}
}
------------------------
这只是我一般程序里的框架,可不是死框架,但从我接触过的来看,这个框架还是比较经典的。
如此的笔记希望让别人能够看懂。