2部分问题在这里。我的for循环在这里遇到了一些麻烦。我的代码的基本思想是,每当调用checkX和checkY时,它们都会比较触摸的x和玩家的x,然后如果玩家x小于touchx,则它将玩家x递增1,直到玩家x等于触摸x。对于checky来说完全一样。一切正常,问题在于它永远不会停止。玩家只是继续沿着完全相同的路径前进。

这是球员职业

package com.gametest;

import java.util.concurrent.CopyOnWriteArrayList;

import com.gametest.GameSurfaceView.MyView;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;

public class Player {
    int ID;
    static int x, y, width, height, widthEnd, currentFrame, boundsX, boundsY,
            dirTimer, dir, simx, simy;
    static Bitmap currentSprite, playerSprite, deathSprite;
    static MyView mv;

    public Player(MyView v, Bitmap orb, Bitmap explosion, int screenWidth,
            int screenHeight) {
        // TODO Auto-generated constructor stub
        playerSprite = orb;
        deathSprite = explosion;
        currentSprite = playerSprite;
        mv = v;
        height = playerSprite.getHeight();
        width = playerSprite.getWidth() / 3;
        currentFrame = 1;

    }

    public static void sprite_draw(Canvas canvas,
            CopyOnWriteArrayList<Sprite> copy) {
        // TODO Auto-generated method stub
        x = (mv.getWidth() / 2) - 50;
        y = (mv.getHeight() / 2) - 50;
        currentFrame = currentFrame + 1;
        if (currentFrame > 3) {
            currentFrame = 1;
        }
        widthEnd = (currentFrame * width) + width;
        boundsX = x + width;
        boundsY = y + height;
        Rect src = new Rect(currentFrame * width, 0, widthEnd, height);
        Rect dst = new Rect(x, y, boundsX, boundsY);
        canvas.drawBitmap(currentSprite, src, dst, null);
        for (Sprite s : copy) {
            if (s.x + 50 > x && s.x + 50 < boundsX && s.y + 50 > y
                    && s.y + 50 < boundsY) {
                GameSurfaceView.damagePlayer();
            };
        }

    }

    public void checkX(Integer touchx) {
        if (touchx > x) {
            for (int newx = x; newx < touchx; newx++) {
                GameSurfaceView.setDirection(1, 0);
                try {
                    mv.t.sleep (10);
                } catch (InterruptedException e) {
                }
            }
        }
        if (touchx < x ) {
            for (int newx = x; newx > touchx; newx--) {
                GameSurfaceView.setDirection(-1, 0);
                try {
                    mv.t.sleep (10);
                } catch (InterruptedException e) {
                }
            }
        }
    }

    public void checkY(int touchy) {
        if (touchy > y) {
            for (int newy = y; newy < touchy; newy++) {
                GameSurfaceView.setDirection(0, 1);
                try {
                    mv.t.sleep (10);
                } catch (InterruptedException e) {
                }
            }
        }
        if (touchy < y) {
            for (int newy = y; newy > touchy; newy--) {
                GameSurfaceView.setDirection(0, -1);
                try {
                    mv.t.sleep (10);
                } catch (InterruptedException e) {
                }
            }
        }
    }
}


如果这里需要的是表面视图类

package com.gametest;

import java.util.concurrent.CopyOnWriteArrayList;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;

public class GameSurfaceView extends Activity implements OnTouchListener {

    double ran;
    int touchX, touchY, screenWidth, screenHeight, objX, objY;
    static boolean canUpdate;
    static int enemyCount, score, playerHealth, test1, test2;
    static MyView v;
    static Bitmap orb, orb2, explosion;
    static CopyOnWriteArrayList<Sprite> copy = new CopyOnWriteArrayList<Sprite>();
    static String hpString;
    static Player player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        v = new MyView(this);
        v.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent me) {
                touchX = (int) me.getX();
                touchY = (int) me.getY();
                for (Sprite sprite : copy) {
                    sprite.checkTouch(touchX, touchY);
                    player.checkY(touchY);
                    player.checkX(touchX);
                }

                return true;
            }
        });

        canUpdate = true;
        screenWidth = v.getWidth();
        screenHeight = v.getHeight();
        playerHealth = 250;
        hpString = "Health " + playerHealth;
        ran = 0;
        score = 0;
        test1 = 5000;
        test2 = 5000;
        orb = BitmapFactory.decodeResource(getResources(), R.drawable.blue_orb);
        orb2 = BitmapFactory.decodeResource(getResources(), R.drawable.red_orb);
        explosion = BitmapFactory.decodeResource(getResources(), R.drawable.explosion);
        player = new Player(v, orb2, explosion, screenWidth, screenHeight);
        createEnemies();
        setContentView(v);

    }



    private void createEnemies() {
        if (enemyCount < 5) {
            screenWidth = v.getWidth();
            screenHeight = v.getHeight();
            int listLength = copy.size();
            copy.add(new Sprite(v, orb, explosion, screenWidth, screenHeight, listLength));
            enemyCount = enemyCount + 1;
        }
    }

    public static void checkECount(int id) {
        canUpdate = false;
        copy.remove(id);
        enemyCount = enemyCount - 1;
        int index = 0;
        for(Sprite s : copy) {
              s.ID = index;
              index++;
            }
        score = score + 10;
        canUpdate = true;

    }

    @Override
    protected void onPause() {
        super.onPause();
        v.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        v.resume();
    }

    public class MyView extends SurfaceView implements Runnable {

        Thread t = null;
        SurfaceHolder holder;
        boolean isItOk = false;

        public MyView(Context context) {
            super(context);
            holder = getHolder();

        }

        @Override
        public void run() {
            while (isItOk == true) {
                if (!holder.getSurface().isValid()) {
                    continue;
                }
                Canvas c = holder.lockCanvas();
                    if(canUpdate){
                        canvas_draw(c);
                    }
                holder.unlockCanvasAndPost(c);
                try {
                    t.sleep (50);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }

        }

        protected void canvas_draw(Canvas canvas) {
            canvas.drawARGB(255, 50, 10, 10);
            String ranString = "Score " + score;
            ran = Math.random() * 5;
            String t = "max1" + test1;
            String t2 = "max2" + test2;
            if (ran > 3) {
                createEnemies();
            }
            Paint paint = new Paint();
            paint.setColor(Color.BLACK);
            paint.setTextSize(15);
            canvas.drawText(hpString, 10, 25, paint);
            canvas.drawText(ranString, 10, screenHeight - 25, paint);

            for (Sprite sprite : copy) {
                sprite.sprite_draw(canvas);
            }
            Player.sprite_draw(canvas, copy);

        }

        public void pause() {
            isItOk = false;
            while (true) {
                try {
                    t.join();
                } catch (InterruptedException e) {

                }
                break;
            }
            t = null;
        }

        public void resume() {
            isItOk = true;
            t = new Thread(this);
            t.start();
        }

    }

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        return false;
    }

    public static void damagePlayer() {
        hpString = "Health " + playerHealth;
        playerHealth = playerHealth - 5;
        if(playerHealth<0){
            hpString = "game over";
        }
    }



    public static void setDirection(int i, int j) {
            if(i == 0 && j == -1){
                for(Sprite s: copy){
                    s.y++;
                }
            }
            if(i == 0 && j == 1){
                for(Sprite s: copy){
                    s.y--;
                    }
            }
            if(i == -1 && j == 0){
                for(Sprite s: copy){
                    s.x++;
                }
            }
            if(i == 1 && j == 0){
                for(Sprite s: copy){
                    s.x--;
                    }
            }

        }

    }


所以我的问题的第一部分是谁能告诉我为什么for循环不会停止循环。我的问题的第二部分是,如果玩家在到达第一个位置之前选择了一个不同的点,我该如何强制checkX和checkY方法重新启动。

最佳答案

检查并检查问题是否出在checkX和checkY函数中。 Integer是一个类,而int是原始类型,因此您不能执行Integer n = 1之类的操作,但是可以执行int n = 1

public void checkX(int touchx)
public void checkY(int touchx)

10-04 20:17