日期:2014-05-20  浏览次数:20699 次

MIDP2.0写的俄罗斯方块里的按键响应问题
下面是一个由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,那么能被系统自动调用的。