0

我正在编写游戏,但我遇到了错误。

当玩家与物体碰撞时,player.hasCollided设置为true。

if(playerBounds.intersects(wolfBounds)){
        player.hasCollided = true;  
        player.dead();
}

现在,当 hasCollided 为真时,LoseScreen 类中的某些内容会打印到屏幕上:

if(player.hasCollided){
        lose.start(g);
}

在 player.dead() 中,玩家的速度设置为 0。

public void dead(){
    playerSpeed = 0;
    coinBank += coinsCollected;
}

问题在于,在我的Inputhandler类中,我做到了,以便在“选择为1”并按下Enter时,将调用RestartGame()。

public void restartGame(){
        obstacleWolf.getNewPosition();
        obstacleHole.getNewPosition();
        hasLost = false;
        player.hasCollided = false;
        player.playerSpeed = 5;
        player.nextX = 1000;
        player.coinsCollected = 0;
        player.xElapsed = 0;
}

if(lose.choice == 1 && enter){
            game.hasLost = false;
            game.restartGame();
            System.out.println(player.hasCollided + " " + player.playerSpeed);
}

这些变量正在设置为它们应设置的值(例如 playerSpeed 从 0 变为 5,hasCollided 从 true 变为 false)但效果没有发生。所以,就像我之前展示的那样, lost.start(g); 仅在 hasCollided 为 true 时调用,但即使它变为 false,仍会在屏幕上打印出来。

以下是相关变量/方法的使用方式:

public void move() {
    x = x - player.playerSpeed;
}

(所有移动对象共享相同的移动方法)

部分游戏类:

public void tick(){
    input.tick();

    if(gameState){
        player.tick();
        player.move();
        collision();
        treeline.move();
        obstacleHole.move();
        obstacleWolf.move();
        coin.move();
        coin.tick();
}

我不确定我是否可以使这个问题更清楚。如果需要,我可以提供来自不同类的更多代码。

4

1 回答 1

-2

无法以当前形式回答该问题(请参阅上面的 2 条评论)。
原因是当前的代码结构。

你需要重构代码,然后你就会发现问题所在。
将玩家字段的所有修改放在 Player 类的方法中。
仅通过方法访问字段。将字段设为私有是一种古老的良好做法。
那么您需要共享的唯一代码就是这个 Player 类。

在一个线程环境中,仅此而已。

于 2013-07-27T14:03:34.557 回答