Gegner zufällig bewegen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Gegner zufällig bewegen

    Mahlzeit zusammen.

    Ihr habt das Problem bestimmt schon 100 mal durchgekaut... doch leider hab ich nach 45 min suche im Forum nichts passendes gefunden mit dem ich so richtig arbeiten könnte. :S
    Falls es doch was gibt bitte linken :)

    Zu meinem Problem. Ich hätte gerne das sich meine Gegner zufällig bewegen. Alle 2 sekunden zb. Aber in einem Grid. Also 32 Pixel Schritte.
    Und natürlich sollten sie nicht an Positionen laufen die schon besetzt sind, durch mauern, andere Gegner usw.

    Ein kleines GML Script beispiel wäre toll, oder ein tutorial wenn es schon eines gibt.

    Danke im Vorraus :)
  • Alle 2 sekunden zb. Aber in einem Grid. Also 32 Pixel Schritte.
    Dafür gibt es Alarm-Events, setze den Alarm auf room_speed * 2 (weil der Timer nicht in Sekunden sondern in Steps rechnet).
    Und natürlich sollten sie nicht an Positionen laufen die schon besetzt sind, durch mauern, andere Gegner usw.
    Du kannst place_free benutzen um zu prüfen ob an der Stelle keine solide Instance ist, dazu noch place_metting für die Gegner.

    Mit random bzw. irandom kannste dir eine zufällige Zahl erstellen lassen. Nun der grobe Aufbau: du lässt dir eine zufällige Zahl ausgeben (0 - 3 (inklusive)), jede Zahl steht für eine Richtung (0 für rechts, 1 für hoch...), nun kannst du mit if die Zahlen "durchgehen" und dann den Spieler bewegen und natürlich davor noch prüfen ob der Platz frei ist. Damit der Gegner überhaupt läuft kannst du das ganze in eine Endloschschleife (while) packen und wenn der Gegner sich bewegt hat die Schleife abbrechen.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Habe dir mal eben einen Code angefertigt, hoffe er ist verständlich genug ;)

    Create Event:

    GML-Quellcode

    1. move_snap(32,32);
    2. alarm[0] = room_speed*2


    Im Alarm [0] Event:

    GML-Quellcode

    1. var p;
    2. p = choose(1,2,3,4)
    3. if p = 1 // 32 Pixel nach oben
    4. {
    5. if place_free(x+0,y-32)
    6. {
    7. y-=32
    8. }
    9. else // Wenn kein Platz ist, dann Variable 'p' neu generieren
    10. {
    11. p = choose(1,2,3,4)
    12. }
    13. }
    14. // 32 Pixel nach unten
    15. if p = 2
    16. {
    17. if place_free(x+0,y+32)
    18. {
    19. y+=32
    20. }
    21. else // Wenn kein Platz ist, dann Variable 'p' neu generieren
    22. {
    23. p = choose(1,2,3,4)
    24. }
    25. }
    26. // 32 Pixel nach rechts
    27. if p = 3
    28. {
    29. if place_free(x+32,y+0)
    30. {
    31. x+=32
    32. }
    33. else // Wenn kein Platz ist, dann Variable 'p' neu generieren
    34. {
    35. p = choose(1,2,3,4)
    36. }
    37. }
    38. // 32 Pixel nach links
    39. if p = 4
    40. {
    41. if place_free(x-32,y+0)
    42. {
    43. x-=32
    44. }
    45. else // Wenn kein Platz ist, dann Variable 'p' neu generieren
    46. {
    47. p = choose(1,2,3,4)
    48. }
    49. }
    50. alarm[0] = room_speed*2
    Alles anzeigen
  • lool wollte gerade meine Lösung posten da seh ich Redux Lösung hier stehen :)

    Hab es auch gelöst nur "leider" (is ja nichts schlimmes) mit Drag & Drop :)

    Create Event:
    execute code:

    GML-Quellcode

    1. rnd_direction = irandom(3);
    2. set Alarm 0 to room_speed / 2


    Alarm Event for alarm 0:

    execute code:

    GML-Quellcode

    1. rnd_direction = irandom(3);
    2. alarm[0] = room_speed / 2;
    3. if rnd_direction is equal to 0
    4. if at position (x,y + 32) there is object obj_Player1
    5. execute code:
    6. event_perform(ev_collision, obj_Player1);
    7. if position (x,y +32) gives a collision with All objects
    8. exit this event
    9. jump to position (x,y + 32)
    10. if rnd_direction is equal to 1
    11. if at position (x,y - 32) there is object obj_Player1
    12. execute code:
    13. event_perform(ev_collision, obj_Player1);
    14. if position (x,y -32) gives a collision with All objects
    15. exit this event
    16. jump to position (x,y - 32)
    17. if rnd_direction is equal to 2
    18. if at position (x + 32,y) there is object obj_Player1
    19. execute code:
    20. event_perform(ev_collision, obj_Player1);
    21. if position (x +32,y) gives a collision with All objects
    22. exit this event
    23. jump to position (x + 32,y)
    24. if rnd_direction is equal to 3
    25. if at position (x - 32,y) there is object obj_Player1
    26. execute code:
    27. event_perform(ev_collision, obj_Player1);
    28. if position (x - 32,y) gives a collision with All objects
    29. exit this event
    30. jump to position (x - 32,y)
    Alles anzeigen


    Klappt herrlich und einwandfrei :) Danke nochmal und Danke Redux für die Mühen. Wenn ich wieder bissle kopf frei hab nach dem ganzen Drag & Drop versuch ich mal dein Code ob das schneller / besser klappt :)
  • @Redux:
    Mal ne Frage zum Verständnis:
    Gml wird doch Zeile für Zeile abgearbeitet? Kann es da nicht passieren, das nach der ersten if Abfrage aufgrund vom besetzten Platz neu "gewürfelt" wird und da wieder ne 1 rauskommt und so der Gegner sich garnicht bewegt?
  • Atomicmaster schrieb:

    Danke nochma
    Kein Problem ;)

    Baruter schrieb:

    @Redux:
    Mal ne Frage zum Verständnis:
    Gml wird doch Zeile für Zeile abgearbeitet? Kann es da nicht passieren, das nach der ersten if Abfrage aufgrund vom besetzten Platz neu "gewürfelt" wird und da wieder ne 1 rauskommt und so der Gegner sich garnicht bewegt?
    Ja das stimmt, um das zu umgehen hätte Ich den Code anders aufbauen und/oder wieder an bestimmte Stellen springen lassen müssen.Wollte deshalb lediglich nur die Wahrscheinlichkeit erhöhen dass sich der Gegner doch noch bewegt.
  • Gänge da nicht auch

    GML-Quellcode

    1. while x==xprevious and y==yprevious
    2. {
    3. Switch(choose(1,2,3,4))
    4. {
    5. case 1: if place_free(x,y-32){y-32}; break
    6. case 2: if place_free(x,y+32){y+32}; break
    7. case 3: if place_free(x-32,y){x-32}; break
    8. case 4: if place_free(x+32,y){x+32}; break
    9. }
    10. }
    11. // code ohne Gewähr, da mit Ipad und ohne Nachschlagen geschrieben
    Alles anzeigen


    So am Rande gefragt, mein gml ist schon etwas eingerostet, oder ist die Variante zu Rechenintensiv?
    Weil sowas ähnliches hatte ich auch vor allerdings hänge ich noch am ganzen drum herum fest.
  • Baruter schrieb:

    Gänge da nicht auch

    GML-Quellcode

    1. while x==xprevious and y==yprevious
    2. {
    3. Switch(choose(1,2,3,4))
    4. {
    5. case 1: if place_free(x,y-32){y-32}; break
    6. case 2: if place_free(x,y+32){y+32}; break
    7. case 3: if place_free(x-32,y){x-32}; break
    8. case 4: if place_free(x+32,y){x+32}; break
    9. }
    10. }
    11. // code ohne Gewähr, da mit Ipad und ohne Nachschlagen geschrieben
    Alles anzeigen


    So am Rande gefragt, mein gml ist schon etwas eingerostet, oder ist die Variante zu Rechenintensiv?
    Weil sowas ähnliches hatte ich auch vor allerdings hänge ich noch am ganzen drum herum fest.

    Na das ist schon sehr umständlich, finde ich (nicht getestet).