Loopen in Zeitintervallen

Xedir

Mitglied
Hallo zusammen.
Nachdem ich mich nun schon fast 4 Tage mit Java auseinander setzte habe ich schon die zweite Frage auf die ich patu keine Antwort finde. Es geht darum in einem Spiel eine eingebaute Sprintfunktion mit einem Preis zu belegen. Das ist mir auch soweit gelungen, jedoch zahlt man bis jetzt nur einmal und kann so lange sprinten wie man die Leertaste gedrückt hält.
Mein anliegen ist jetzt, z.B. alle 5 Sekunden den entsprechenden Betrag vom Score Konto "abzubuchen". Ich stelle mir es so vor, dass der entsprechende Part des Codes geloopt werden müsste. Bei der Umsetzung fehlt es mir aber noch an Knowledge.

Hier der Code

Java:
if (keys.sprint.isDown  && !keys.sprint.wasDown && !keys.fire.isDown  )         
   {
                if (score >= COST_SPRINT ) 
         {
                    payCost(COST_SPRINT);
         }
    }



Xedir
 
S

SlaterB

Gast
bei so wenig Code/ Grundgerüst ist das nur schwer zu sagen,

mein Tipp:
gehe lieber andersrum vor, verwende eine allgemeine Spielschleife, die sowieso durchgehend läuft,
wenn du die nicht schon hast, dann z.B. while mit Thread.sleep(30)

dazu merke bei Ereignissen Zustände, zusammen mit Anfangszeiten,
wenn Leertaste gedrückt wird, wird das irgendwie gemerkt, du hast ja schon keys.sprint.isDown, dazu die Anfangszeit,
wenn Leertaste nicht mehr gedrückt wird, wird das irgendwie auch vermerkt/ Zustand zurückgestellt,

direkt beim Sprinten musst du dann nichts mehr für die nächsten Sekunden machen,
die allgemeine Schleife hat in ihrem Durchlauf aber alle Zeit der Welt um auch mal nachzuschauen, ob irgendwas schon seit Zeit x anhält,

damit man nach 5 sec nicht bei jedem Schleifendurchlauf zahlen muss,
muss freilich entweder die Anfangszeit neu gesetzt oder ein weiteres Zeit-Attribut verwendet werden
 

Xedir

Mitglied
So, bin nun endlich dazu gekommen mich wieder dem Projekt zu widmen.
nachdem mir das mit der Globalen Schleife etwas zu groß vorkam habe ich versucht, das ganze
mit Delay zu machen. Damit hat es schlussendlich auch funktioniert. Für die, die es interessiert hier die wichtigsten Befehle:

Das Delay kann man sich in dieser Beziehung wie einen Countdown vorstellen von dessen Startwert runter gezählt wird. Zu beginn wird der Wert auf 100 (Ticks) gesetzt, nimmt aber nach dem ersten Durchgang den zuletzt definierten und der wird im Späteren Verlauf 150 sein.

Java:
private int sprintDelay = 100;
Preis fürs Sprinten
Java:
public static final int COST_SPRINT = 10;
Definition eines Keys mit dem Namen "sprint"
Java:
    public Key sprint = new Key();
Belegen des Keys sprint mit der Leertaste
Java:
mappings.put(KeyEvent.VK_SPACE, keys.sprint);

Mit diesem Befehl wird zu beginn geprüft, ob der Sprint key (Space) gedrückt ist und ob Feuern (shift) nicht gedrückt ist und ob auf dem Konto (score) mehr als die 10 Punkte für COST_SPRINT vorhanden sind.
Wenn das gegeben ist, wird von dem Wert sprintDelay immer 1 Tick abgezogen, etwa 30 Ticks pro Sekunde bis der Wert <=0 erreicht. dann kommt die nächste Schleife in der gezahlt wird und zwar der Betrag COST_SPRINT. Danach wird sprintDelay wieder aufgefüllt und es beginnt von vorne.


Java:
 if (keys.sprint.isDown && !keys.fire.isDown && score >= COST_SPRINT ) 
        {        	
        	walkTime++;
        	if (sprintDelay-- <= 0)
        	{     
        		payCost(COST_SPRINT);        		
        		sprintDelay = 150 ;
        	}
        	
        }

Xedir
 

Ähnliche Java Themen

Neue Themen


Oben