Gegner im Maze-game

  • GM 8

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

  • Gegner im Maze-game

    Hihi :)
    Ich hab mich an Gegnern versucht die in einem Labyrinth an Kreuzungen/Ecken etc. immer zufällig weiter laufen. Aber nicht zurück (außer bei Sackgassen).
    Da hab ich mich, da ich es nicht besser wusste, an diesem langen code versucht ^^ Beinhalten bisher nur die abfrage beim hoch und runterlaufen.
    Beim hoch laufen klappt es ganz gut nur bei runter laufen nicht xD

    Spoiler anzeigen

    GML-Quellcode

    1. if place_snapped(32,32) {
    2. // hoch
    3. if vspeed < 0 and hspeed = 0 {
    4. if place_free(x-32,y) and place_free(x,y-32) and place_free(x+32,y) { direction = choose(180,90,0)}
    5. if !place_free(x-32,y) and place_free(x,y-32) and place_free(x+32,y) { direction = choose(90,0)}
    6. if place_free(x-32,y) and !place_free(x,y-32) and place_free(x+32,y) { direction = choose(180,0)}
    7. if place_free(x-32,y) and place_free(x,y-32) and !place_free(x+32,y) { direction = choose(180,90)}
    8. if !place_free(x-32,y) and !place_free(x,y-32) and place_free(x+32,y) { direction = choose(0)}
    9. if place_free(x-32,y) and !place_free(x,y-32) and !place_free(x+32,y) { direction = choose(180)}
    10. if !place_free(x-32,y) and place_free(x,y-32) and !place_free(x+32,y) { direction = choose(90)}
    11. if !place_free(x-32,y) and !place_free(x,y-32) and !place_free(x+32,y) { direction = choose(270)}
    12. // runter
    13. if vspeed > 0 and hspeed = 0 {
    14. if place_free(x-32,y) and place_free(x,y+32) and place_free(x+32,y) { direction = choose(180,270,0)}
    15. if !place_free(x-32,y) and place_free(x,y+32) and place_free(x+32,y) { direction = choose(270,0)}
    16. if place_free(x-32,y) and !place_free(x,y+32) and place_free(x+32,y) { direction = choose(180,0)}
    17. if place_free(x-32,y) and place_free(x,y+32) and !place_free(x+32,y) { direction = choose(180,270)}
    18. if !place_free(x-32,y) and !place_free(x,y+32) and place_free(x+32,y) { direction = choose(0)}
    19. if place_free(x-32,y) and !place_free(x,y+32) and !place_free(x+32,y) { direction = choose(180)}
    20. if !place_free(x-32,y) and place_free(x,y+32) and !place_free(x+32,y) { direction = choose(270)}
    21. if !place_free(x-32,y) and !place_free(x,y+32) and !place_free(x+32,y) { direction = choose(90)}
    22. }
    23. }
    24. }
    Alles anzeigen


    Irgendwann ist mir dann eigefallen das die Gegner bei pacman genauso sind und hab mir das gm6 example davon geladen. Doch da blick ich nicht durch:

    Spoiler anzeigen

    GML-Quellcode

    1. dir[3]:=place_free(x,y+16);
    2. dir[2]:=place_free(x-16,y);
    3. dir[1]:=place_free(x,y-16);
    4. dir[0]:=place_free(x+16,y);
    5. move:=0;
    6. direc:=direction;
    7. for(i:=0; i<360; i+=90)
    8. {
    9. if i!=(direction+180)mod(360) and dir[i/90] then
    10. {
    11. if floor(random(move+1))=0 then
    12. {
    13. direc:=i;
    14. }
    15. move+=1;
    16. }
    17. }
    18. direction:=direc;
    19. if move=0 then
    20. {
    21. direction:=(direction+180)mod(360);
    22. }
    23. alarm[0]:=8;
    24. speed:=2;
    Alles anzeigen


    Kann mir das evt jemand erklären und mir begriffe geben denn nach ":=" oder "dir[0]" lässt sich schlecht suchen ^^

    Komisch ist bei meinen code die gegner nur abbiegen wenn spped z.B. 2 oder 4 ist. Bei speed = 3 biegen sie nicht ab. Wie kommt das? Ist das wie wenn man man sich mit jump bewegt?

    Ach und falls es wer benötigt häng ich mal die gm8-datei ran.
    Dateien
    • maze gegner.rar

      (9,94 kB, 55 mal heruntergeladen, zuletzt: )
    Und es gibt jede Menge Rechtschreibfehlern.
  • also ":=" ist meiner Meinung nach eine einfache Zuweisung, wie "=";

    In dem Codeschnipsel wird auch "=" als vergleich benutzt obwohl man da normalweise "==" nehmen sollte.
    Ich kenn mich mit GML nicht genug aus, aber eventuell ist das mit ner ziemlich alten Version des GM erstellt worden als ":=" noch "=" war und "=" bedeutete "==".
    Ist aber auch nicht wichtig.
    dir[0] ist ein Array, in dem für jede Himmelsrichtung entweder true oder false steht.
    True bedeutet der Weg in die Richtung ist frei, False das Gegenteil.
    Getestet wird das mit der place_free() funktion, die true oder false zurückgeben sollte.
    Dieser Rückgabewert landet dann in dem Array.
    Mit der Bedingung i!=(direction+180)mod(360) verbietet er das Rückwärtslaufen.
    "mod" gibt immer den Rest einer Division zurück also bei 90° als Wert für Direction (+180( sollte als Rest 270 rauskommen. Wenn i auch 270 ist dann ist der Teil des IFs false.

    Fall er am Ende der Schleife festellt, er hat keine andere Möglichkeit als zurück dann läuft er doch zurück.

    Innerhalb der Schleife passiert folgendes:
    Er loopt über alle 4 Himmelsrichtungen, dann schaut er ob der Weg in die Richtung frei ist (und nicht rückwärts ist).
    Wenn der Weg in die Richtung frei ist wird eine Zufallszahl gewürfelt die zwischen 0 und move+1 liegt.
    Wobei move+1 am Anfang 1 ist. Floor schneidet die Nachkommastellen ab. Die Zufallszahl ist also immer eine ganze Zahl.
    Immer wenn die Zufallszahl 0 ist entscheidet er sich für diese Richtung (erstmal).
    Jetzt wird move um 1 erhöht, und die Schleife läuft weiter.
    Falls nun wieder der Weg in die neue Richtung frei ist wird eine Zufallszahl zwischen 0 und 2 gebildet.
    Wenn die wieder 0 ist, dann entscheidet er sich jetzt für diesen Weg (vorerst);
    usw.

    Wenn ich das richtig interpretiere müssten die Gegner mit dem Skript bevorzugt in Richtung [0] laufen wollen, das wäre nach rechts. Und am seltensten nach unten.
    Warum auch immer der Autor sich das so gedacht hat.

    Warum sich deine Gegner nur bei speed 2 oder 4 aber nicht 3 bewegen liegt meiner Meinung nach an

    GML-Quellcode

    1. if place_snapped(32,32) {


    Denn wenn du ne Speed von 3 hast bewegen sich die Gegner immer 3 pixel pro step, und da kommst du nie auf 32 pixel sondern auf 30 und 33.
    Bei 2 oder 4 aber schon^^

    Warum er die nach unten Bedingungen ignoriert ist mir auch nicht klar.

    Alles in allem ist der code zu lang für mich^^

    Die Idee mit chose ( 90, 180, 270) ist schon gar nicht schlecht und mit nem Array durchaus ausbaufähig.
    Ich würde diese Idee mit der Idee aus PacMan mit dem Array kombinieren (anstatt dieser komischen Zufallszahl).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Sledge Hammer ()