下面是一个由GameCanvas继承的类的一部分,执行俄罗斯方块游戏里面的游戏界面绘制和按键响应的功能。
问题是下面按键响应有两个方法:keyPressed和keyPressedState;为什么run方法里面没有调用keyPressed方法,那keyPressed里面的代码能执行吗?
希望高手指教!
public void run() {
while (true) {
try {
Thread.sleep(50); //每50ms重画一次
} catch (InterruptedException e) {
e.printStackTrace();
}
this.keyPressedState(); //调用按键响应
this.paintCanvas(this.graphics); //调用屏幕绘制
}
}
protected synchronized void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
if(nState == GAME_RUN){
switch(action){
case Canvas.LEFT:
if (this.block.checkMove(GameBlock.MOVE_LEFT)) {
block.move(GameBlock.MOVE_LEFT); //调用block.checkMove()方法检查下坠物是否已在最左边,如果不是则调用block.move()方法将下坠物左移
}
break;
case Canvas.RIGHT:
if (this.block.checkMove(GameBlock.MOVE_RIGHT)) {
block.move(GameBlock.MOVE_RIGHT); //调用block.checkMove()方法检查下坠物是否已在最右边,如果不是则调用block.move()方法将下坠物右移
}
break;
case Canvas.UP:
case Canvas.FIRE:
if (this.block.checkRot()) {
block.rotBlock(); //调用block.checkRot()方法检查下坠物是否能旋转,如果能则调用block.rotBlock()方法旋转下坠物
}
break;
default:
break;
}
}
}
public synchronized void keyPressedState() {
int keyState = getKeyStates();
if ((keyState & DOWN_PRESSED) != 0 && nState == GAME_RUN) {
if (this.block.checkDown()) {
block.down();
}
}
}
------解决方案--------------------------------------------------------
1 看你的构造器,如果你写的super(true),那么系统将是不能捕获到你的keyPressed,KeyReleased事件的。如果需要系统来捕获你的事件,就需要设置为super(false)
2 如果条件1你写的是super(true),那么你需要对应的Game按键了。
3 如果条件1你写的是super(false),那么keyPressed方法,如果你是重写的系统的keyPressed,那么能被系统自动调用的。