命运跟我开了一场玩笑,一个不喜欢很多游戏的人,却写起了游戏。。。
参加工作与在学校,有一点不同是:是否为强迫性的——对于工作,即使你不喜欢,同样要做。
既然在做,那就得尽力做,每个人都应该如此。
努力思考,学习。
笔记还是要做的:
笔记一:
发牌程序,对程序员来说,发牌的过程只是一个将本来排好序的数组的顺序打乱而已,这个方法耍的只是一个小聪明,使得 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 }
笔记二:
初始化一个 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() 方法时前两个参数的顺序。
笔记三:
关于一个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);
}
}
------------------------
这只是我一般程序里的框架,可不是死框架,但从我接触过的来看,这个框架还是比较经典的。
如此的笔记希望让别人能够看懂。