Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 碰撞检测不起作用_Java_Android_Eclipse_Collision_Detection - Fatal编程技术网

Java 碰撞检测不起作用

Java 碰撞检测不起作用,java,android,eclipse,collision,detection,Java,Android,Eclipse,Collision,Detection,基本上,我一直在做一个简单的游戏,现在我想在玩家和敌人之间创建碰撞检测。我已经制作了一个玩家和敌人的类,然后还有一个单独的GameView类。我的问题是根本没有发生冲突,我只是不明白为什么,我已经多次更改代码,但我似乎仍然无法破解它。我将在下面留下我的代码,如果有人看到我哪里出错了,那将是很大的帮助。多谢各位 GameView类: public class GameView extends SurfaceView implements Runnable { Canvas canvas;

基本上,我一直在做一个简单的游戏,现在我想在玩家和敌人之间创建碰撞检测。我已经制作了一个玩家和敌人的类,然后还有一个单独的GameView类。我的问题是根本没有发生冲突,我只是不明白为什么,我已经多次更改代码,但我似乎仍然无法破解它。我将在下面留下我的代码,如果有人看到我哪里出错了,那将是很大的帮助。多谢各位

GameView类:

public class GameView extends SurfaceView implements Runnable {

    Canvas canvas;
    SurfaceHolder surfaceHolder;
    Thread thread = null;
    volatile boolean playing;
    Paint paint;
    Context context;
    Player player;
    int screenX, screenY, numberOfEnemies = 4, distanceBetweenEnemies;
    int enemyX [] = new int[numberOfEnemies];
    int enemyY [] = new int[numberOfEnemies];
    private boolean paused = true;
    Enemy enemy;
    Enemy [] enemies;
    Random random;
    Rect [] enemyRectangle;

    public GameView (Context context, int x, int y) {
        super(context);
        this.context = context;

        surfaceHolder = getHolder();
        paint = new Paint();
        thread = new Thread();
        screenX = x;
        screenY = y;
        player = new Player (context, screenX, screenY);

        enemies = new Enemy[numberOfEnemies];
        enemyRectangle = new Rect[numberOfEnemies];
        enemy = new Enemy (context, screenX);
        distanceBetweenEnemies = screenX * 3 / 4;

        for (int i = 0; i < numberOfEnemies; i ++) {

            enemies[i] = new Enemy(context, screenX);
            enemyX[i] = screenX / 2 - enemy.getEnemyBitmap().getWidth() / 2 + i * distanceBetweenEnemies;
            random = new Random();
            enemyY[i] = random.nextInt(screenY - enemy.getEnemyBitmap().getHeight() / 2);
        }
    }

    @Override
    public void run() {
        while (playing) {
            draw();

            if(!paused){
                update();
            }
        }
    }

    private void draw () {

        if (surfaceHolder.getSurface().isValid()) {

            canvas = surfaceHolder.lockCanvas();
            canvas.drawColor(Color.argb(255,  26, 128, 182));
            canvas.drawBitmap(player.getPlayerBitmap(), player.getX(), player.getY(), null);

            for (int i = 0; i < numberOfEnemies; i ++) {

                canvas.drawBitmap(enemies[i].getEnemyBitmap(), enemyX[i], enemyY[i], null);
                enemyRectangle [i] = new Rect(enemyX[i], enemyY[i], enemy.getEnemyBitmap().getWidth(),
                    enemy.getEnemyBitmap().getHeight());
                enemyX[i] += enemy.getEnemySpeed();

            }

            update ();
            surfaceHolder.unlockCanvasAndPost(canvas);
        }
    }

    private void update () {

        player.updatePlayerPosition();
        player.noLeaveScreen();

        for (int i = 0; i < numberOfEnemies; i ++) {

            if (enemyX[i] < 0 - enemy.getEnemyBitmap().getWidth()) {
                enemyY[i] = random.nextInt(screenY);
                enemyRectangle [i] = new Rect(enemyX[i], enemyY[i], enemy.getEnemyBitmap().getWidth(),
                    enemy.getEnemyBitmap().getHeight());
                enemyX[i] += numberOfEnemies * distanceBetweenEnemies;
            } else {
                enemyX[i] += enemy.getEnemySpeed();
            }

            if (Rect.intersects(player.getPlayerRectangle(), enemyRectangle[i])) {
                Log.e("COLLISION:", "Detected");
                enemyX[i] = - 200;
            }
        }
    }

    public void pause () {
        playing = false;

        try {
            thread.join();
        } catch (InterruptedException e) {
            Log.e("Error:", "joining thread");
        }
    }

    public void resume () {
        playing = true;
        thread = new Thread(this);
        thread.start();
    }

    @Override
    public boolean onTouchEvent (MotionEvent event) {

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:

                player.playerJump();

                break;
        }
        return true;
    }
}

这里有课程,欢迎任何帮助

MCVE请允许我建议您使用调试器来完成此操作。在我看来,您没有在您的播放器类中更新rect。我该怎么做?JRowanIn updatePlayerPosition and playerJump您正在更改y,但该类中的rect仍然是您在constructorMCVE中设置它的方式。我建议您使用调试器逐步完成此操作。在我看来,您没有在您的player类中更新rect,我该怎么做?JRowanIn updatePlayerPosition和playerJump您正在更改y,但该类中的rect仍然是您在构造函数中设置它的方式
public class Player {

    Bitmap playerBitmap;
    Rect playerRectangle;
    int x, y, playerJumpSpeed, gravity, screenY;
    boolean playerIsMoving;

    public Player (Context context, int screenX, int screenY) {
        this.screenY = screenY;
        gravity = 2;
        playerBitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
        x = screenX/2 - playerBitmap.getWidth()/2;
        y = screenY/2 - playerBitmap.getHeight()/2;
        playerRectangle = new Rect(x, y, playerBitmap.getWidth(), playerBitmap.getHeight());
        playerJumpSpeed =  - 1000;
        playerIsMoving = true;
    }

    public void updatePlayerPosition () {

        while (playerIsMoving) {
            y += gravity;

            break;
        }
    }

    public void playerJump () {

        while (playerIsMoving) {
            y += playerJumpSpeed;

            break;
        }

    }

    public void noLeaveScreen () {

        if (y < 0) {
            playerJumpSpeed = 0;
        } else {
            playerJumpSpeed = - 40;
        }

        if (getY() > (screenY - playerBitmap.getHeight())) {
            gravity = 0;
        } else {
            gravity = 2;
        }

    }

    public int getX () {
        return x;
    }
    public int getY () {
        return y;
    }
    public Bitmap getPlayerBitmap () {
        return playerBitmap;
    }

    public Rect getPlayerRectangle () {
        return  playerRectangle;
    }

}
public class Enemy {

    Bitmap enemyBitmap;
    int enemySpeed, screenX;
    boolean isEnemyMoving;
    Random random;

    public Enemy (Context context, int screenX) {
        this.screenX = screenX;

        enemyBitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
        random = new Random();
        isEnemyMoving = true;
        enemySpeed = - 3;
    }

    public int getEnemySpeed () {
        return  enemySpeed;
    }
    public Bitmap getEnemyBitmap () {
        return enemyBitmap;
    }

}