我在Android中创建了一个游戏循环,扩展了SurfaceView
类和Thread
类,类似于Android示例中的Lunar Lander示例。现在我只是试图找到一种方法让用户使用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
是一个Bitmap和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上查看了无数的例子以正确的方式来查看是否触摸了Bitmap我仍然没有做到正确,我没有在LogCat中收到错误因此我没有还有其他什么可以展示,如果你设法在代码中发现看似奇怪的东西,请告诉我。