02塔克大战

1.repaint->update->paint。repaint调用update,update更新要调用paint()或super.update()。双缓冲画图在于重写update方法。

2.闪烁:在不重写update方法下,repaint只是调用update,update调用paint。而paint方法也有系统自动随机调用的,(paint没有调用执行完成就又可能被线程重画),故闪烁。

3.双缓冲画图:重写update方法,将图画先画在一张虚拟图片上,然后再将虚拟图片再画上屏幕即可。

    //虚拟图片设置为成员变量
    Image offScreenImage = null;
    
    public void update(Graphics g) {
        if (offScreenImage == null) {
            offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
        }
        Graphics gOffScreen = offScreenImage.getGraphics();
        Color c = gOffScreen.getColor();
        gOffScreen.setColor(Color.GREEN);
        gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
        gOffScreen.setColor(c);
        paint(gOffScreen);
        g.drawImage(offScreenImage, 0, 0, null);

    }

4.Java键盘虚拟码定义在KeyEvent中的静态成员。eg:KeyEvent.VK_Right。

    //重画和键盘操作,理论上说重画的频率快于键盘操作的速度,但是就算是不快于也没事,XY始终把下一次的
    //位置保存下来然后重画的时候画出来
    
    //加一点功能的就测试,螺旋递增式实现
    //键盘监听类,用于控制坦克的移动。监听类一般是用继承adapter类,这样你只要重写你所需要的方法即可
    private class KeyMonitor extends KeyAdapter {

    
        public void keyPressed(KeyEvent e) {
            //坦克移动
            int key = e.getKeyCode();
            switch(key) {
            case KeyEvent.VK_RIGHT:
                x+=5;
                break;
            case KeyEvent.VK_DOWN:
                y+=5;
                break;
            case KeyEvent.VK_LEFT:
                x-=5;
                break;
            case KeyEvent.VK_UP:
                y-=5;
                break;
            }
            
        }
    }

屏幕(console)

5.代码重构:容易根据需求改动的变量定义为常量,这样程序的可扩展性很好,常量名所有字母都要大写。

    //常量定义public static final 类型
    public static final int GAME_WIDTH = 800;
    public static final int GAME_HEIGHT = 600;

6.项目设计下手时要讲究螺旋递增式实现

7.类设计问题(面向对象的重要体现——简洁):类有哪些属性,这个不着急,需要的时候慢慢加。有哪些方法,合适的方法应该出现在合适的类中,一般时自己的事情自己做,做到细节隐藏。例如坦克类的设计

  • 建立Tank类
  • 为Tank类添加成员变量x y
  • 添加draw方法,使Tank类独立控制自己的画法
  • 添加Tank类处理按键的方法
  • 根据Tank类修改TankClient类

8.测试bug还是能输出变量的值来测试就输出变量的值来测试。输出中间结果是一种很好的测试方法


          //测试bug还是能输出变量的值来测试就输出变量的值来测试
          System.out.println("bU= "+bU+"  bD= "+bD+" bL="+bL+" bR="+bR);
          System.out.println("dir= "+dir);

猜你喜欢

转载自blog.csdn.net/yan_dan/article/details/81331646