Ausführung verzögern

  • 11 Antworten
  • Letztes Antwortdatum
S

Snipestyle

Erfahrenes Mitglied
3
Hey,

ich habe nen kleines Problem und weiß nun nicht so recht wie ich es lösen soll.
Also:
Ich habe ein Spielfeld (Monopoly ähnlich aufgebaut). Es können die zahlen von 1-6 gewürfelt werden und die Figur begibt sich dann auch auch auf die richtige position. Nur sieht ein Sprung von Position 1 auf 6 nicht so schön aus wie ein einzelnes Springen (1,2,3,4,5,6). Um Das zu lösen, habe ich bereits auch eine for Schleife gebaut die die Figur Schritt für Schritt setzt. Jetzt kommen wir jedoch zu meinem Problem: Wie bekomme ich es hin, dass nach jedem Figur setzen eine kleine Pause (0,5 Sekunden) erreicht wird? Wenn ich dort solche dinge wie sleep oder wait benutze, klappt das nicht, WEIL: Einfach eine längere Zeit vergeht und die Figur dann plötzlich auf der richtigen Position ist und das Programm irgendwie während der Wartephase trotzdem weiterläuft. Das erkenne ich daran, da auf jedem Feld ein alert Dialog ist und der sich während der Wartephase schon öffnet und man dann kurz darauf die Figur springen sieht.
Ich dachte an eine Lösung mit einem timer? Weiß aber nicht so recht wie ich das angehen kann. Ein Beispiel wäre da ganz hilfreich
happy.gif


Danke euch
happy.gif
 
for schleifen oder sleep/wait für sowas ist der falsche ansatz

schau mal nach runnables, handler usw das ist wesentlich besser.
 
Gibt es dazu irgendwo ein gutes Beispiel? Mit Handler und runnables habe ich auch schon rumprobiert, ergab bei mir jedoch auch nicht so wirklich ein gewünschtes ergebnis :/
 
Puuh, ich schau mir das grade an und wüsste jetzt nicht wirklich wie ich das ganze bei mir anwenden sollte...
habe jetzt grade nochmal was mit einem handler probiert. ist aber immer noch das selbe. alert meldung kommt direkt und nach dem warten springt die figur direkt auf die position ohne einzelne sprünge zu machen :/
 
naja ohne den code zu sehen wirds wohl schwer werden.
 
Der komplette Code wäre zu lang, aber ich zeige euch mal das wesentliche und was ich mir dabei gedacht habe.

das ist meine methode. hinter der variable changer verbiergt sich der Spieler der grade drann ist 1-8. innerhalb des case wird dann ersteinmal die alte position gespeichert in der variable oldpos. Danach wird halt die neue Position berechnet. Mit der For-Schleife bewirke ich wie man sieht, dass die variable "test"(ja ungeschickt gewählt :D) sich jeden durchgang um 1 erhöht und das solange bis der spieler an der richtigen position ist.
Code:
public void move()
    {
        switch(changer)
        {
        case 1: 
                // Aktuelle Position
                oldpos = playeronepos;
                
                if(playeronepos+zufallszahl > 28)
                {
                    newpos = playeronepos+zufallszahl;
                    switch(newpos)
                    {
                    case 29: playeronepos=1;
                            onemoney+=2000;
                            moneyUpdate();
                        break;
                    case 30: playeronepos=2;
                            onemoney+=2000;
                            moneyUpdate();
                        break;
                    case 31: playeronepos=3;
                            onemoney+=2000;
                            moneyUpdate();
                        break;
                    case 32: playeronepos=4;
                            onemoney+=2000;
                            moneyUpdate();
                        break;
                    case 33: playeronepos=5;
                            onemoney+=2000;
                            moneyUpdate();
                        break;
                    case 34: playeronepos=6;
                            onemoney+=2000;
                            moneyUpdate();
                        break;
                    }
                }
                else
                {
                    playeronepos+=zufallszahl;
                }
                
                ImageView iv1 = (ImageView)findViewById(R.id.p1);
                
                for(test = oldpos; test <= playeronepos; test++)
                {        
                    switch(oldpos)
                    {
                    case 29: test=1;
                        break;
                    case 30: test=2;
                        break;
                    case 31: test=3;
                        break;
                    case 32: test=4;
                        break;
                    case 33: test=5;
                        break;
                    case 34: test=6;
                        break;
                    }
                    
                    // VERZÖGERUNG
                    waiter();
                }
Ich habe dann dort einfach versucht einen Handler zu verwenden den ich aber in eine extra methode verlegt habe.
Code:
public void waiter()
    {
        handlerTimer.postDelayed(new Runnable(){
            @Override
            public void run() {
                ImageView iv1 = (ImageView)findViewById(R.id.p1);
                iv1.setX(oneposx[test]);
                iv1.setY(oneposy[test]);          
          }}, 2000);
        
    }
Dort werden halt in der run methode die beiden positionen die vorher ermittelt wurden gesetzt.

Sooo, ich hoffe, dass du bzw. ihr damit etwas anfangen könnt :)
 
deine for schleife läuft natürlich extrem schnell durch und jedesmal erzeugst ein runnable dass 2000ms später aufgerufen wird.

da das alles fast zur gleichen zeit erzeugt wird, werden auch alle fast nach 2000ms aufgerufen. das ist sehr ungeschickt.


du müsstest irgendwie die einzelnen schritte erzeugen und die nacheinander ablaufen lassen.
 
Oder eine möglichkeit haben, dass erstmal gewartet wird bis der handler und das delay fertig sind, nur wie ist die frage :s
Habe da schon viel gelesen, aber wirklich ne gute Lösung bzw. eine die für mich passend wäre habe ich leider noch nicht gefunden :/
 
naja müsstest halt in der 2. runde der for schleife 4000ms warten und in der 3. runde 6000ms. usw

Der ursprüngliche Beitrag von 21:12 Uhr wurde um 21:14 Uhr ergänzt:

aber dein runnable setzt die figur an die position xy.

test musst dann ins runnable bringen, weil das änderst sonst schon bevor es ausgeführt wird, darf also nicht so global sein.
 
ich probiere das gerade. ich versuche grade test an die methode zu übergeben, jedoch kann ich die ja anscheinen in die public void run() nicht übergeben ?

edit: Es ist animiert ! :) Jetzt muss ich nur noch dafür sorgen, dass sich der alert verzögert :)

Danke für die super schnelle und gute Hilfe!
 
Zuletzt bearbeitet:
Da es ein Spiel werden soll sind auch hier die richtigen Worte surfaceview, gameloop, und delta ;)

Mit diesen 3 Worten hast du erstmal einiges zu tun ;)

LG. Dagobert

Gesendet von meinem GT-I9300 mit der Android-Hilfe.de App
 
Zurück
Oben Unten