1

Android サンプルの Lunar Lander の例に似SurfaceViewたクラスとクラスを拡張して、Android でゲーム ループを作成しました。現在、ユーザーが画面上でビットマップをドラッグして、タッチされた場所に関する情報を受け取り、それがビットマップの 1 つの境界内にあるかどうかを確認し、それに応じてビットマップの X と Y の位置を移動できるThreadようにする方法を見つけようとしています。onTouchEvent. これは機能することもありますが、他の画像の近くで押し下げている限り、画像が境界の外にある場合でも、タッチした場所に画像を移動することがあります。

このバグのある動作がどこから来ているのかわかりません。最大 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);
}

インターネット上の無数の例とスタック オーバーフローを調べて、ビットマップが変更されたかどうかを確認する正しい方法を調べたにもかかわらず、まだ正しく理解できていません。LogCat でエラーが発生しないため、他に何もありません。表示するために、コード内で奇妙に思われる何かを見つけることができた場合は、お知らせください。

4

0 に答える 0