2016-09-12 9 views
0

私は、カードをクリックして別のカードにランダムに変更するゲームを作っています。 1枚のカードの画像ファイルは370x512 pngで、そのサイズは200 kbです。私の問題は、imageViewがあるカードから別のカードに画像を変更するプロセスが非常に遅く、2秒間続きます。他の問題は、カードをあまりにも速くクリックするとクラスがクラッシュすることです。私はボタンとImageViewでImageButtonを試してみました。11のImageView(ゲームには11種類のカードがあります)を試しましたが、その中には常に1つしか表示されていません。私は、カードを交換するプロセスに時間がかかりすぎる理由を知りません。カードを変更するコードはここにあります。このコードにはボタンとImageViewがあります:あなたのアンドロイドアプリケーションで画像を切り替えるには時間がかかります

public class MainActivity extends Activity { 

public static String dampfhammerData = "dampfhammerData"; 
SharedPreferences DampfhammerData; 

public int nextCard; 
public int lastCard = 0; 

public int all=3; 
public int buddy=3; 
public int dampfhammer=3; 
public int frauen=3; 
public int links=3; 
public int rechts=3; 
public int maenner=3; 
public int questionmaster=3; 
public int regel=3; 
public int themenrunde=3; 
public int zaehlen=3; 
public int deck = 44; 

public String version; 

ImageView Karte; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

} 

public void changeCard(View view) { 
    selectCard(); 
} 

public void selectCard(){ 
    lastCard = nextCard; 
    if(deck > 0) { 
     Random rand = new Random(); 
     nextCard = (rand.nextInt(10)); 
     if(nextCard != lastCard) { 
      checkCardDeck(); 
     }else { 
      selectCard(); 
     } 
    }else { 
     Intent intent = new Intent(this, End.class); 
     startActivity(intent); 
    } 
} 

public void checkCardDeck(){ 
    Karte = (ImageView) findViewById(R.id.karte); 

    switch (nextCard) { 
     case 0: 
      if(all > 0){ 
       all--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.all); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 1: 
      if(zaehlen > 0){ 
       zaehlen--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.zaehlen); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 2: 
      if(buddy > 0){ 
       buddy--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.buddie); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 3: 
      if(themenrunde > 0){ 
       themenrunde--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.themenrunde); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 4: 
      if(dampfhammer > 0){ 
       dampfhammer--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.dampfhammer); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 5: 
      if(links > 0){ 
       links--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.links); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 6: 
      if(rechts > 0){ 
       rechts--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.rechts); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 7: 
      if(frauen > 0){ 
       frauen--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.frauen); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 8: 
      if(maenner > 0){ 
       maenner--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.maenner); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 9: 
      if(questionmaster > 0){ 
       questionmaster--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.questionmaster); 
      }else { 
       selectCard(); 
      } 
      break; 
     case 10: 
      if(regel > 0){ 
       regel--; 
       deck--; 
       Karte.setBackgroundResource(R.drawable.regel); 
      }else { 
       selectCard(); 
      } 
      break; 
    } 
} 

@Override 
public void onBackPressed() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Wollen sie das Spiel verlassen?") // 
      .setMessage("Das aktuelle Spiel wird abgebrochen und sie kehren zum Startbildschirm zurück, wollen sie das wirklich?") // 
      .setPositiveButton(("Ja"), new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        finish(); 
       } 
      }) 
      .setNegativeButton(("Nein"), new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 

        dialog.dismiss(); 
       } 
      }); 
    builder.show(); 
} 
} 

ありがとうございました!

+1

再帰の問題、つまり 'selectCard()'の中から 'selectCard()'を呼び出していると思われます。これは別の方法で構造化する必要があります。 – ShadowGod

答えて

0

カードのデッキは、それぞれが4回表示される11枚のカードで構成されている場合、あなたはこのようなランダムシャッフル作成することができます(私はそれが右のコードを見に基づいてだと思う):代わりに選ぶことによって

ArrayList<Integer> deckList = new ArrayList<Integer>(); 
for (int i=0; i<11; i++) { 
    deckList.add(i); deckList.add(i); deckList.add(i); deckList.add(i); 
} 
Collections.shuffle(deckList); 

をランダムな次のカードを作成し、リピート時に再試行すると、特にリトライが再帰的であるため、非常に非効率的で予測不可能なプロセスが使用され、コールスタックのサイズが大きくなります。

もちろん、あなたのコードで自分のデッキを使用するには別の変更を加える必要がありますが、かなり速くなるはずです。

関連する問題