2016-09-22 17 views
0

このサイトはすでにゲームを作成する過程で私を助けてくれましたが、今は固まっているので、誰かが私を助けてくれることを願っています。libgdxゲームはデバッグ中ではなくエミュレータでは動作しません

私は現在、libgdxでアンドロイドスタジオでゲームを作成しようとしています。それはピットと障害物を持つ非常に簡単なジャンプとランニングゲームです。ユーザは3つの生命を持ち、3つのハート型テクスチャとして提示される。 プレイヤーが障害物の1つに衝突すると、心臓の1つが塗りつぶしから空に変わることになっています。 問題は:デバッグ中は完全に正常に動作しますが、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メソッドは、対応するハートを空のシェイプに変更するだけです。 私はちょうど理解していない、なぜそれが完璧にデバッグ中に動作しますが、 "実際の生活"ではありません。

はあなたの障害物のクラスでは、事前にそんなに

Maximiliane

+0

を私はalreadChangedをfalseにオタクが障害物と衝突するたびに設定され、これを読んで。これは、すべてのフレームのオタクが衝突すると、彼は心を失うことを意味します。だから、もし彼が4つのフレームのために同じ障害物に衝突すると、彼は心を使い果たすでしょう。 – IronMonkey

+0

はい、かなり妥当と聞こえます。あなたはその問題をどのように克服するか考えていますか?フレームに関係なく、1つの時間しか変更しないことを確認するにはどうすればよいですか? 私はすでにカウンターで非常に同じ問題を抱えていました。 – Maxikilliane

答えて

0

をありがとうござい障害がカウントされている場合はマークするブール値を持っています。

あなたが衝突をチェックする際に障害物がカウントされている場合、また、チェック

.... 
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: 
      ... 
     } 
     } 
    }  
+1

ありがとうございます! – Maxikilliane

関連する問題