我以为我理解了这个问题,但是有些地方似乎出了问题。当用户(也就是我)尝试按键时,什么都不会发生,我很难理解我错过了什么。
在我展示一些代码来帮助澄清我的问题之前,请考虑以下内容:我正在使用Android的Lunar Lander示例制作我的第一个“真正”的Android程序。在那个例子中,当然存在一个名为LunarView的类,以及嵌套在其中的LunarThread类。在我的代码中,这些类的等效物分别为Graphics和GraphicsThread。
此外,我可以在Android上很好地制作2D精灵动画。我有一个Player类,假设GraphicsThread具有称为“player”的Player成员。这个类有四个坐标 - x1、y1、x2和y2 - 它们定义了一个矩形,在其中绘制精灵。我已经处理好了,所以我可以完美地处理它。每当调用doDraw(Canvas canvas)方法时,它将只查看这些坐标的值,并相应地绘制精灵。
现在假设 - 这并不是我想要用程序做的 - 我试图使程序仅在屏幕的一个位置显示Player精灵,直到用户第一次按下Dpad的左按钮。然后位置将更改为屏幕上的另一个位置,并且精灵将在该位置绘制,直到程序结束。
还要注意,Graphics中的GraphicsThread成员称为“thread”,而GraphicsThread中的SurfaceHolder成员称为“mSurfaceHolder”。
因此,请考虑以下类Graphics中的此方法:
在我展示一些代码来帮助澄清我的问题之前,请考虑以下内容:我正在使用Android的Lunar Lander示例制作我的第一个“真正”的Android程序。在那个例子中,当然存在一个名为LunarView的类,以及嵌套在其中的LunarThread类。在我的代码中,这些类的等效物分别为Graphics和GraphicsThread。
此外,我可以在Android上很好地制作2D精灵动画。我有一个Player类,假设GraphicsThread具有称为“player”的Player成员。这个类有四个坐标 - x1、y1、x2和y2 - 它们定义了一个矩形,在其中绘制精灵。我已经处理好了,所以我可以完美地处理它。每当调用doDraw(Canvas canvas)方法时,它将只查看这些坐标的值,并相应地绘制精灵。
现在假设 - 这并不是我想要用程序做的 - 我试图使程序仅在屏幕的一个位置显示Player精灵,直到用户第一次按下Dpad的左按钮。然后位置将更改为屏幕上的另一个位置,并且精灵将在该位置绘制,直到程序结束。
还要注意,Graphics中的GraphicsThread成员称为“thread”,而GraphicsThread中的SurfaceHolder成员称为“mSurfaceHolder”。
因此,请考虑以下类Graphics中的此方法:
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
return thread.keyDownHandler(keyCode, msg);
}
同时请考虑在GraphicsThread类中使用此方法:
boolean keyDownHandler(int keyCode, KeyEvent msg) {
synchronized (mSurfaceHolder) {
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
player.x1 = 100;
player.y1 = 100;
player.x2 = 120;
player.y2 = 150;
}
}
return true;
}
现在假设玩家坐标的初始值为(200,200,220,250),当我按下Dpad:Left时,他为什么不会做出任何不同的反应?
谢谢!