命运跟我开了一场玩笑,一个不喜欢很多游戏的人,却写起了游戏。。。
参加工作与在学校,有一点不同是:是否为强迫性的——对于工作,即使你不喜欢,同样要做。
既然在做,那就得尽力做,每个人都应该如此。
努力思考,学习。
笔记还是要做的:

笔记一:
发牌程序,对程序员来说,发牌的过程只是一个将本来排好序的数组的顺序打乱而已,这个方法耍的只是一个小聪明,使得 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);
    }
  }
------------------------
  这只是我一般程序里的框架,可不是死框架,但从我接触过的来看,这个框架还是比较经典的。

  如此的笔记希望让别人能够看懂。