对于循环不会停止

时间:2014-01-30 23:11:37

标签: java android for-loop

这里有两个问题。我的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方法重新启动。

1 个答案:

答案 0 :(得分:1)

检查您的checkX和checkY函数中的签名是否存在问题。 Integer是一个类,int是原始类型,因此您无法执行Integer n = 1之类的操作,但您可以执行int n = 1

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