1

我通过扩展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 中没有收到错误,所以我没有其他任何东西展示一下,如果您设法在代码中发现一些奇怪的东西,请告诉我。

4

0 回答 0