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);