2016-09-12 2 views
0

Ich mache ein Spiel, in dem Sie auf eine Karte klicken können, um es zufällig auf eine andere Karte zu ändern. Die Image-Datei für eine Karte ist 370x512 png und die Größe beträgt etwa 200 kb. Mein Problem ist der Prozess, in dem das ImageView sein Bild von einer Karte auf eine andere ändert, ist sehr langsam und dauert fast zwei Sekunden. Das andere Problem ist, dass wenn Sie zu schnell auf die Karte klicken, die Klasse abstürzt. Ich habe es bereits mit einem ImageButton, mit einem Button und einem ImageView versucht und ich habe es mit 11 ImageViews versucht (es gibt 11 verschiedene Karten im Spiel), die immer da sind, aber nur eins davon ist sichtbar. Ich habe keine Ahnung, warum der Kartenwechsel so lange dauert. Hier ist mein Code, um die Karte zu ändern. Dieser Code ist mit einer Schaltfläche und einem ImageView:Ein Bild in meiner Android-Anwendung dauert zu lange

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

Vielen Dank für Ihre Hilfe!

+1

Ich denke, vielleicht wegen der Rekursionsprobleme, d. H. Sie nennen 'selectCard()' aus 'selectCard()' .. Sie müssen dies anders strukturieren. – ShadowGod

Antwort

0

Wenn Ihr Kartenspiel von 11 Karten besteht, die jeweils viermal erscheinen (ich glaube, das ist richtig, basierend auf Blick auf den Code), können Sie eine zufällige Shuffle wie folgt erstellen:

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

Durch statt Kommissionierung eine zufällige nächste Karte und erneut versuchen, wenn es eine Wiederholung ist, verwenden Sie einen sehr ineffizienten und unvorhersehbaren Prozess, vor allem da die Wiederholungen rekursiv sind, die Größe des Aufruf-Stacks zu erhöhen.

Sie müssen natürlich andere Änderungen vornehmen, um mein Deck in Ihrem Code zu verwenden, aber es sollte ein bisschen schneller sein.