[IF Player is not moving?]

Dieses Thema im Forum "Programmierung" wurde erstellt von Nexus15, 17. August 2013.

  1. Nexus15
    Offline

    Nexus15

    Registriert seit:
    30. September 2012
    Beiträge:
    91
    Hallo Community,
    ich habe ein Problem. Es muss etwas ausgeführt werden, wenn der Spieler sich 5 Sekunden nicht bewegt. Ich dachte schon an eine Hashmap, aber so richtig draus geworden ist nichts.

    Nun die Frage: Könnt ihr mir helfen / Kennt ihr die Antwort?

    Ich danke für eure Antworten. ! :)
     
    #1
  2. Chrisliebaer
    Offline

    Chrisliebaer

    Ich denk mal das Sauberste währe es, in jedem Tick (oder auch in jedem x-ten, je nach Auflösung) zu prüfen, wann sich ein Spieler das letzte mal bewegt hat. Und jedes mal, wenn sich der Spieler bewegt, wird seine letzte Bewebung auf den aktuellen Zeitpunkt gesetzt.

    Desweiteren würde ich nicht in Zeit, sondern in Ticks zählen, da du sonst in Probleme kommst, wenn die TPS mal fallen oder steigen.
     
    #2
  3. Nexus15
    Offline

    Nexus15

    Registriert seit:
    30. September 2012
    Beiträge:
    91
    Könnte mir jemand dazu einen kleinen Code-Schnipsel bieten? Irgendwie habe ich heute Probleme in der Umsetzung :/
     
    #3
  4. Chrisliebaer
    Offline

    Chrisliebaer

    Nur Pseudocode, da ich das jetzt nicht mit der BukkitAPI abgleichen will.


    Du registrierst einen Task im Scheduler, der in jedem Tick aufgerufen wird und darin prüfst du dann:
    Code (Text):
    1.  
    2. foreach(player : playerArray)
    3. {
    4. if(player.lastMove > AKTUELLER_TICK + ANZAHL_ERLAUBTER_TICKS)
    5. {
    6. // spieler hat sich nicht bewegt
    7. }
    8. }
    9.  
    Außerdem muss dein Task auch noch die Ticks zählen. Dafür erstellest du für deinen Task einen privaten Member (AKTUELLER_TICK) den du in jedem Tick um eines erhöhst.


    Und für jedes PlayerMoveEvent registrierst du dann halt noch einen Listener, der das ganze zurücksetzt.

    Sollte alles sehr einfach sein.
     
    #4
  5. Manello1
    Offline

    Manello1

    Registriert seit:
    7. August 2013
    Beiträge:
    7
    Ort:
    Süddeutschland - Bodensee
    Minecraft:
    Manello
    Du könntest einfach eine Abfrage machen,
    ob der Spieler eine von den Bewegungstasten drückt (W,A,S,D,Space)
    Und Falls er dies tut setzt du eine Variable auf 0
    Dann brauchst du eine Schleife die jede Sekunde auf die Variable 1 addiert.
    Innerhalb dieser Schleife soll noch überprüft werden ob die Variable 5 ist, wenn
    ja dann Verweise auf deine Aktion. (Und Setze bei Bedarf die Variable auf 0 Zurrück)

    Ich mach mal einen Trockenen Aufbau: (Ich kenne mich nicht mit Java aus aber mit anderen Sprachen, hauptsächlich mal du hast einen Aufbau dann weist du sicher was ich meine) Jeder Befehl ist in "" gesetzt
    ####################################################
    "Var1 = 0"

    "Schleife1 Anfang"

    "(IF)Überprüfe ob W gedrückt, wenn ja springe zu Funktion1"
    "(IF)Überprüfe ob A gedrückt, wenn ja springe zu Funktion1"
    "(IF)Überprüfe ob S gedrückt, wenn ja springe zu Funktion1"
    "(IF)Überprüfe ob D gedrückt, wenn ja springe zu Funktion1"
    "(IF)Überprüfe ob SPACE gedrückt, wenn ja springe zu Funktion1"

    "(Else)Wenn nein dann addiere 1 zu Var1"
    "(sleep) Warte eine Sekunde"

    "Schleife1 Ende"

    "Funktion1"

    "Setze Var1 auf 0"
    "Springe/Rufe deine Aktion Auf"
    "Springe zur Schleife1 und setze somit den Systemlauf fort"
    #####################################################

    Hoffe dass hilft dir.

    - - - Aktualisiert - - -

    Oh da war jemand schneller :D
     
    #5
  6. Chrisliebaer
    Offline

    Chrisliebaer

    Nehmen wir mal an, dass der TE das für den Singleplayer haben wollte, so wie du es beschreibst: Das was du dann machst, ist unnötig. Der Anfang ist super, jedes mal wenn der Spieler eine Taste drückt, wird der Counter zurück gesetzt. Aber man sollte dafür dann doch bitte einen Timer verwenden: http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html
     
    #6
  7. Nexus15
    Offline

    Nexus15

    Registriert seit:
    30. September 2012
    Beiträge:
    91
    ok werde ich mir mal anschauen. Danke :)
     
    #7
  8. Manello1
    Offline

    Manello1

    Registriert seit:
    7. August 2013
    Beiträge:
    7
    Ort:
    Süddeutschland - Bodensee
    Minecraft:
    Manello
    Ich kenne mich leider nicht so mit Java aus, deshalb habe ich es ja so beschrieben. (So fange ich immer mit meinem ASM Programmen an)
    Das mit dem Timer konnte ich somit ja auch nicht wissen :D
     
    #8