我以为自己已经理解了这个问题,但这里有些不对劲。当用户(我,到目前为止)试图按键时,没有任何事情发生,我很难理解我错过了什么。
在我提出一些代码来帮助澄清我的问题之前考虑一下:我正在使用Android的Lunar Lander示例制作我的第一个“真正的”Android程序。当然,在那个例子中,存在一个类LunarView,并且类嵌套在LunarThread中。在我的代码中,这些类的等价物分别是Graphics和GraphicsThread。
此外,我可以在Android上制作2D精灵动画。我有一个Player类,让我们说GraphicsThread有一个玩家成员称为“玩家”。该类有四个坐标 - 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时,他为什么不做任何不同的事情:左?
谢谢!
答案 0 :(得分:1)
在我担心实际运动之前,我会考虑Log ...
类似的东西:
Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]");
在这样做之前,我可以先了解一下系统注册的内容,然后再担心我对所述注册数据的处理方式......之后你就可以决定是否发送了正确的东西然后担心关于线程工作等。
希望这可以帮助诊断等(所有这些都是徒手写的,可能包含错误)
答案 1 :(得分:0)
扔掉LunarLander并使用真实指南:Playing with graphics in Android