0

私はゲーム開発の初心者で、現在自分のゲームで問題が発生しています.... 画像を 1 回押すだけでキャラクターの動きを表示するために、ループするたびにゲームでキャンバスを更新したいのですが... 無効にします() は、キャラクターの終了位置のみを表示するため、ここでは機能しません。これがそのコードです。

    @Override
public boolean onTouchEvent(MotionEvent event) {
    final int x = (int)event.getX();
    final int y = (int)event.getY();
    int action = event.getAction();

switch (action) {
    case MotionEvent.ACTION_DOWN:

            if (rollbounds.contains((int)x, (int)y))
            {
                //dice roll
                Random rand = new Random();

                move = rand.nextInt(6) + 1;

                //end of dice roll
                //move counting

                for (int loop=move;loop>0;loop--)
                {
                if ((charypos >= 220)&&(charxpos == 9))
                {
                    Toast toast = Toast.makeText(getContext(), "You Win", Toast.LENGTH_SHORT);
                    toast.show();
                    loop=1;
                }
                if (charxpos != 205&&charLeftMove==false)
                {

                    for (int loop2 = 28;loop2>0;loop2--)
                    {
                        charxpos+=1;
                        //update or invalidate here

                    }

これはボード ゲームで、ロール ボタンに触れると、無効にすることで即座に終了位置に移動するため、キャラクターがスペースの数だけスムーズに移動します。助けていただければ幸いです

4

1 に答える 1

0

タッチ イベントが実際に UI スレッドにあることをご存知ですか? 無効化を呼び出したとしても、コード ブロック全体が実行されるまで、キャンバスは何も描画しません。つまり、システムはコードの後に​​ UI をレンダリングします。

for (int loop=move;loop>0;loop--)

そのため、常に最後の位置に移動することがわかりました。コードを に移動する必要があります case MotionEvent.ACTION_MOVE。イベントでループを使用しないでください。タッチイベントごとに1回計算するだけです。たとえば、変数をグローバルに宣言し、touchEvent によって値を増やします

int a = 0;

public boolean onTouchEvent(MotionEvent event) {
    final int x = (int)event.getX();
    final int y = (int)event.getY();
    int action = event.getAction();

switch (action) {
    case MotionEvent.ACTION_MOVE:
                ++a;
                invalidate();
于 2013-07-29T02:58:34.623 に答える