【问题标题】:libgdx game works while debugging but not on emulatorlibgdx 游戏在调试时有效,但在模拟器上无效
【发布时间】:2017-01-30 18:27:12
【问题描述】:

这个网站已经在我创建游戏的过程中帮助了我很多,但现在我有点卡住了,所以我希望有人能帮助我。

我目前正在尝试使用 libgdx 在 android 工作室中创建游戏。这是一个非常简单的跳跃和跑步游戏,有坑和障碍。用户拥有三个生命,呈现为三个心形纹理。 当玩家与其中一个障碍物发生碰撞时,其中一颗心应该会从填充变为空。 问题是:它在调试时工作得很好,但是当我在我的 android 平板电脑上运行它时却没有。它不会只将一颗心变为空心,而是不断将所有心形变为空心,直到我的 GameOverState 出现。

为了使其更易于理解(希望如此),这是我的一些代码。我知道这是很多重复的代码,而且不是很优雅,但我稍后会担心:

在我的Playstate中更新方法:

    private void updateObstacles(float dt) {
    //nerd == player
        if (obstacle.collides(nerd.getBounds())) {
            switch (obstacle.getType()) {
                ...
                case ConstantsGame.WOMAN_TYPE:
                    alreadChanged = false;
                    Score.updateHeart(gameManager);
                default:
               ...
            }
        }
   }

在我的分数课上:

    public static void updateHeart(GameStateManager manager) {
          state = getStateOfHearts();
             if (state == 4) {
             changeHeart(true, 0);
             } else if (state == 3) {
             manager.set(new GameOverState(manager));
             } else if (state == 2) {
             changeHeart(true, 2);
             } else if (state == 1) {
             changeHeart(true, 1);
             } else {

             }    
     }

    public static int getStateOfHearts() {
        if ((!PlayState.alreadChanged && hearts.get(0) == heartEmpty) && (hearts.get(1) == heartFilled) && hearts.get(2) == heartFilled) {

            state = 1;
            PlayState.alreadChanged = true;
            return state;

        } else if ( !PlayState.alreadChanged && hearts.get(1) == heartEmpty && hearts.get(2) == heartFilled && hearts.get(0) == heartEmpty) {

            state = 2;
            PlayState.alreadChanged = true;
            return state;
        } else if (!PlayState.alreadChanged &&hearts.get(2) == heartEmpty && hearts.get(0) == heartEmpty && hearts.get(1) == heartEmpty) {

            state = 3;
            PlayState.alreadChanged = true;
            return state;
        } else {


            PlayState.alreadChanged = true;
            return state;
        }


    }

changeHeart 方法只是将相应的心形更改为空形状。 我只是不明白,为什么它在调试时工作得很好,但在“现实生活”中却不行。

非常感谢您,

马克西米利安

【问题讨论】:

  • 当我读到这篇文章时,每次书呆子与障碍物碰撞时,alreadChanged 都会设置为 false。这意味着每一个框架书呆子碰撞他都会失去信心。因此,如果他在 4 帧内与相同的障碍物相撞,他就会心无旁骛。
  • 是的,这听起来很合理。你知道如何克服这个问题吗?我如何确保它只更改一次 - 无论帧数如何?我已经在柜台上遇到了同样的问题..

标签: java android-studio libgdx


【解决方案1】:

在您的障碍物类别上有一个布尔值来标记是否已计算障碍物。

简单到

....
private boolean counted;
....
public boolean isCounted(){
    return counted;
}

public void setCounted(){
    counted = true;
}

然后,当您检查碰撞时,还要检查是否计算了障碍物:

private void updateObstacles(float dt) {
//nerd == player
    if (obstacle.collides(nerd.getBounds() && !obstacle.isCounted() )) {  //check if obstacle is counted
        switch (obstacle.getType()) {
            ...
            case ConstantsGame.WOMAN_TYPE:
                alreadChanged = false;
                obstacle.setCounted(); //set obstacle as counted 
                Score.updateHeart(gameManager);
            default:
           ...
         }
      }
   }    

【讨论】:

    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多