Обнаружение столкновения не работает

По сути, я делаю простую игру, в которой я хочу создать обнаружение столкновений между игроком и врагом. Я сделал класс игрока и врага, а затем и отдельный класс 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;
    }
}

Класс игрока:

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;
    }

}

Есть классы, любая помощь приветствуется!

0 ответов

Другие вопросы по тегам