我通过扩展SurfaceView
类和Thread
类似于 Android 示例中的月球着陆器示例的类,在 Android 中创建了一个游戏循环。现在我只是想找到一种方法让用户在屏幕上拖动位图,onTouchEvent
以接收有关触摸位置的信息,然后查看它是否在我的一个位图的范围内并相应地移动该位图的 X 和 Y 位置. 这有时有效,但在其他时候它可能会将图像移动到我触摸的位置,即使它远远超出了它的范围,只要我按下靠近其他图像。
我不知道这种错误行为是从哪里来的,我还没有实现任何减慢线程速度的方法,以便它不使用最大 CPU - 这是否会导致产生这些结果的滞后?如果有人能对此有所了解,我将不胜感激。
我正在获取用户输入并传递给自定义方法handleAction'(actionName)'
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == MotionEvent.ACTION_DOWN) {
thread.handleActionDown((int) event.getX(), (int)event.getY());
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (thread.isTouched()) {
thread.handleActionMove((int) event.getX(), (int) event.getY());
}
}
if (event.getAction() == MotionEvent.ACTION_UP) {
if (thread.isTouched()) {
thread.handleActionUp();
}
}
return true;
}
这是我的处理程序方法:
tizer
是位图,TizerX & Y 是其 X 和 Y 位置的类变量,对于ball
.
public void handleActionDown(int eventX, int eventY) {
if (eventX >= (TizerX - tizer.getWidth() / 2) && (eventX <= (TizerX + tizer.getWidth() / 2))) {
if (eventY >= (TizerY - tizer.getHeight() / 2) && (TizerY <= (TizerY + tizer.getHeight() / 2))) {
setTouched(true);
if(getBitmapTouched() == "") {
setBitmapTouched("tizer");
}
} else {
setTouched(false);
setBitmapTouched(null);
}
} else if (eventX >= (BallX - ball.getWidth() / 2) && (eventX <= (BallX + ball.getWidth() / 2))) {
if (eventY >= (BallY - ball.getHeight() / 2) && (BallY <= (BallY + ball.getHeight() / 2))) {
setTouched(true);
if(getBitmapTouched() == "") {
setBitmapTouched("ball");
}
} else {
setTouched(false);
setBitmapTouched("");
}
} else {
setTouched(false);
setBitmapTouched("");
}
}
public void handleActionUp() {
// TODO Auto-generated method stub
setTouched(false);
setBitmapTouched("");
}
public void handleActionMove(int eventX, int eventY) {
if(isTouched()) {
if(getBitmapTouched() == "tizer") {
setTizerX(eventX);
setTizerY(eventY);
} else if (getBitmapTouched() == "ball") {
setBallX(eventX);
setBallY(eventY);
}
}
我的线程不断调用该doDraw
方法:
private void doDraw(Canvas canvas) {
// Draw the background image. Operations on the Canvas accumulate
// so this is like clearing the screen.
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(testBackgroundImage, 0, 0, null);
canvas.drawBitmap(tizer, TizerX - (tizer.getWidth() / 2), TizerY - (tizer.getHeight() / 2), null);
canvas.drawBitmap(ball, BallX - (ball.getWidth() / 2), BallY - (ball.getHeight() / 2), null);
}
尽管通过互联网上的无数示例和 Stack Overflow 以正确的方式查看是否已触摸位图,但我仍然没有把它弄好,我在 LogCat 中没有收到错误,所以我没有其他任何东西展示一下,如果您设法在代码中发现一些奇怪的东西,请告诉我。