'mp_grid_path' Probelm

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

  • 'mp_grid_path' Probelm

    Hi,
    ich arbeite im mom an einem Spiel in dem man einen kleinen ferngesteuerten panzer steuert und versuch mich im moment an einer KI für einen feindlichen Panzer mit den gleichen Eigenschaften wie der Spielerpanzer.
    Klappt soweit ganz gut, hab allerdings ein Problem bei der Wegfindung:
    Ich benutze mp_grid_path damit der Panzer den Weg zum Spieler möglichst direkt findet.
    Allerdings fährt der Panzer nichts ganz so wie ich es will.
    Er kann zu schnell während der Fahrt die Richtung wechseln, was er nicht können sollte, da es der Spieler auch nicht kann. Nun meine Frage:
    Gibt es eine Art 'mp_potential_settings' fürs pathfinding?? Oder hat jemand eine andere Lösung?
    Wär dankbar wenn mir jemand helfen könnte... :thumbsup:
  • Ob es da solche "Settings" gibt, weis ich nicht(denke eher nicht), jedoch könntest du das folgendermassen lösen:

    Dein KI-Panzer erstellt eine Instanz eines Objektes, das nur zum pathfinding da ist, also das mp_path- blub zeugs erledigt und alle paar Steps die aktuelle Position in einen Array speichert(oder sowas in der Art), die Information wird wiederrum an den echten Panzer geschickt, welcher dann einfach der Reihe nach diesen Punkten folgt(Mithilfe von selbst definierbarer Bewegung ;) ).
    Morgen(Später :O) mach ich dir ein Example, wenns zu kompliziert ist.
    "das war meine letzte flamewar PM an dich ."
  • Hi

    Ich hoffe das ich dir mit meinen Pac-Man Prog helfen kann.
    Ich habe nämlich für meine Geister auch den mp_grid_path Befehl benutzt.
    Ich habe folgendes gemacht.

    1.
    Ich habe alle X- und Y-Koordinaten der Punkte, die Pac essen kann, in eine Liste gespeichter.
    2.
    Danach habe ich ein Objekt zufällig auf einer der Koordinaten gesetzt.
    3.
    Habe dann einen der Geister zu diesen Punkt laufen lassen.

    Ist zwar nicht sehr Elegant, aber es hatt geklappt.

    So hier ist das Prog. Schau es Dir an. Wenn du damit nicht klar kommst. Schreib wieder hier rein. Ich werde dann mein Bestes tun um dir zu Helfen

    Gruss Drachen :)
    Dateien
    • Pac - Man.zip

      (96,82 kB, 141 mal heruntergeladen, zuletzt: )
  • mhh das programm hat mir leider nicht wirklich weitergeholfen aber danke trotzdem :) ...
    mein problem ist folgendes:
    ich will dass der feinpanzer sich zu dem spielerpanzer hinbewegt, allerdings soll er sich dabei genauso bewegen wie der spielerpanzer.
    ich hab mal die bewegungsengine für den spielerpanzer ausgekapselt.
    (im spiel: yoyogames.com/games/show/49786 :thumbsup: )
    der feindpanzer sollte wie gesagt ungefähr die gleichen eigenschaften haben; soll heißen er soll nicht aprupt stehen bleiben oder die richtung wechseln können. ausserdem soll der feindpanzer sich bewegen als wenn er den ganzen bildschirm überblicken würde (er soll sich nicht den weg finden indem er alles absucht sonder auf direktem weg zum spielerpanzer fahren.)

    Edit: ups, ausversehn eine executable hochgeladen; jetzt ists richtig ^^

    hoffe, mein problem ist jetzt einigermaßen klar
    und hoffe noch mehr das mir jemand dabei helfen kann :thumbsup:
    Dateien
    • tankengine.rar

      (14,82 kB, 134 mal heruntergeladen, zuletzt: )

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

  • Hi Waterman7

    So ich habe mir mal dein Prog angeschaut.
    Ich habe nicht gedacht das du auf einen freien Feld bist. Klar dann kannst du mit meinen Prog nichts anfangen. Da ich in ein Labyrinth benutzt habe.
    Hast schon mal darüber nachgedacht mit dem Befehlen point_distance und collision_line zu arbeiten.
    Ich überleg mir mal was. Das braucht aber eine Weile. Vielleicht schaffe ich es heute Abend noch dir was zu liefern.

    Bis bald Drachen :)
  • so, da bin ich wieder
    ja, daran hatt ich auch schon ab und zu gedacht, habs aber noch net ausprobiert, da ich keine ahnung habe wie das ganze aussehn müsste...
    wenn du das hinkriegen würdest wärs echt super :thumbsup:

    mfg waterman

    übrigens falls du die brauchst hab ich die .gmk der bewegungsengine nochmal hochgeladen (ich hab ausversehen eine executable hochgeladen :pinch: )
  • Hi Waterman7

    So jetzt habe ich den halben Abend mit dem Prog verbracht. Leiter komme ich zu keinen guten Ergebnis.
    Aber lass den Kopf nicht hängen. Ich habe ein altes Tut gefunden, was genau das sein kann was du möchtest. Du benötigst nur den GM 5. Den kannst du dir ja besorgen. Ich lade das Prog hoch.

    Es wurde hauptschälich mit D&D geschrieben. Wenn ich das vorher gewusst hätte. Naja ja
    So ich hoffe, es entspricht deine Wünsche das Prog. Es ist ausbau fähig.

    Gruss Drachen


    Hi ich bin es noch einmal
    Ich habe das Tank Example von der GM-Version 5 auf den GM-Version 6 umgeschrieben.

    Gruss Drachen

    Hi ich bin es noch mal

    Ich habe festgestellt das mir ein kleiner fehler unterlaufen ist, nämlich beim braunen Tank. Da fehlen ein paar Sprites für die komplette Umdrehung. Aber der ist schnell behoben. Geht einfach in den Sprite-Editor, löscht alle Panzer bis auf
    den ersten. Jetzt geht in das Register Animation, und wählt dort Rotation Sequence - Counter Clockwise und gibt bei Number of frames 72 ein. So das war es auch schon. Jetzt solte es eigentlich funktionieren.

    Gruss Drachen :)
    Dateien
    • Tank-Example.zip

      (226,26 kB, 160 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Drachen ()

  • ja, hab mir das programm mal angesehn. (was übrigens vorher für den gm4 war)
    ich hab glaub ich eine einigermaßen gute lösung gefunden, mal sehn ob ichs auf die reihe kriege.
    falls nicht meld ich mich nochmal...
    vielen dank für deine unterstützung Drachen!! :thumbsup:

    mfg waterman7

    [Zusammengeschoben durch CAS]

    da bin ich wieder :D
    also ich hab jetzt eine gute lösung für mein problem gefunden, die auch größtenteils funktioniert.
    ich hab nurnoch ein problem...
    hier ist mal ein auszug aus meinem code:

    GML-Quellcode

    1. if dir > 360 dir -= 360
    2. if dir < 0 dir += 360
    3. if dir > point_direction(x,y,pathfinder.x,pathfinder.y)
    4. dir -= 5
    5. if dir < point_direction(x,y,pathfinder.x,pathfinder.y)
    6. dir += 5


    so, jetzt ist das problem, dass wenn point_direction = 350 und dir = 10 ist, das der panzer sich einmal ganz um die eigene achse dreht. es wäre natürlich besser, wenn er immer den kürzeren abstand auswählen würde.
    ich hoffe, ich habe verständlich gemacht, was ich meine.
    mfg waterman7

    EDIT: sry, falls das jetzt als doppelpost gilt... :pinch:
  • Ich bin so überglücklich, dass du dieses Problem hast :thumbsup:
    Hab nämlich vor ein paar Monaten ein Skript geschrieben das genau das macht was du willst...
    leider hatte ich keine Lust mehr am game weiter zu machen also liess ich es verrotten :(
    ABER JETZT sehe ich, dass es sich doch gelohnt hat.
    Ok hier ist es:

    GML-Quellcode

    1. //argument[0] = id_self
    2. //argument[1] = targer_x
    3. //argument[2] = target_y
    4. //argument[3] = speed
    5. //argument[4] = rotation speed
    6. var dir,id_self,target_x,target_y,aim_speed,r_speed,current_dir;
    7. id_self = argument[0]
    8. target_x = argument[1]
    9. target_y = argument[2]
    10. aim_speed = argument[3]
    11. r_speed = argument[4]
    12. current_dir = id_self.direction
    13. id_self.speed = aim_speed
    14. dir = point_direction(id_self.x,id_self.y,target_x,target_y)
    15. if(current_dir != dir)
    16. { //find shorter way
    17. if(current_dir > dir) r1 = 360-current_dir+dir //wenn die momentane Richtung grösser ist als die erzielte wird der Weg über 360 berechnet
    18. else r1 = 360-dir+current_dir //wenn nicht dann über die 0 Grad
    19. r2 = abs(dir-current_dir) //die normale Drehung innerhalb der 360 Grad
    20. if(r1 <= r2) //wenns über 0 bezw. 360 Grad kürzer oder gleich ist
    21. {
    22. if(current_dir > dir+5) id_self.direction += r_speed //wenns über die 360 geht
    23. else id_self.direction -= r_speed //wenns über 0 Grad geht
    24. } //normale Bewegung innerhalb der 360 Grad
    25. else if(current_dir < dir-5) id_self.direction += r_speed
    26. else if(current_dir > dir+5) id_self.direction -= r_speed
    27. }
    Alles anzeigen


    Ich hoffe du wirst schlau daraus auch wenn es englisch ist.
    oh und das mit "id.self" das ist das objekt dem das wiederfährt (ich war mir nicht sicher ob man im Skript Zugriff auf die Variablen des Objekts hat)

    Edit: Habs noch ein wenig kommentiert.
    Edit2: HAAALT hab gerade bemerkt, dass das ganze ziemlich viel einfacher geht... ich schreibs nochmal...
    Edit3:
    Oh Mann das ist jetzt echt peinlich:

    GML-Quellcode

    1. dir = point_direction(x,y,mouse_x,mouse_y)
    2. var temp_r_speed;
    3. temp_r_speed = r_speed //damit r_speed nicht überschrieben wird
    4. if(abs(dir-direction) > 180) temp_r_speed = -temp_r_speed //wenn der Abstand innerhalb der 360 grösser ist als 180 wird das Vorzeichen von r_speed gewechselt
    5. //die normale Drehung
    6. if(direction < dir) direction += temp_r_speed
    7. else direction -= temp_r_speed

    Wiso bin ich daamals nicht darauf gekommen :pinch:
    Ich bin offen für jeden entdeckten Rechtschreibe Fehler.
    Behaltet sie also NICHT für euch!
    (lol als ich das ^ geschrieben hab war ich wohl auf Droge :wacko: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von my-x ()

  • so, mein code sieht jetzt folgendermaßen aus:

    GML-Quellcode

    1. if dir > 360 dir -= 360
    2. if dir < 0 dir += 360
    3. if dir > point_direction(x,y,pathfinder.x,pathfinder.y)
    4. if (abs(dir-point_direction(x,y,pathfinder.x,pathfinder.y)>180))
    5. dir += 5
    6. else
    7. dir -= 5
    8. if dir < point_direction(x,y,pathfinder.x,pathfinder.y)
    9. if (abs(dir-point_direction(x,y,pathfinder.x,pathfinder.y)>180))
    10. dir -= 5
    11. else
    12. dir += 5
    Alles anzeigen

    ...aber es funzt net :(
    woran liegt das? (sry falls es offensichtlich sein sollte; ich komm net drauf)
    mfg waterman7
  • Hi Waterman7

    Wie wäre es mit der { Setzung

    dann würde dein Cod so aussehen

    GML-Quellcode

    1. if dir > 360 dir -= 360
    2. if dir < 0 dir += 360
    3. if dir > point_direction(x,y,pathfinder.x,pathfinder.y)
    4. {
    5. if (abs(dir-point_direction(x,y,pathfinder.x,pathfinder.y)>180))
    6. {
    7. dir += 5
    8. }
    9. else
    10. {
    11. dir -= 5
    12. }
    13. }
    14. if dir < point_direction(x,y,pathfinder.x,pathfinder.y)
    15. {
    16. if (abs(dir-point_direction(x,y,pathfinder.x,pathfinder.y)>180))
    17. {
    18. dir -= 5
    19. }
    20. else
    21. {
    22. dir += 5
    23. }
    24. }
    Alles anzeigen


    Versuche es mal so.

    Gruss Drachen :)
  • Hi

    Jetzt fällt mir noch was ein

    GML-Quellcode

    1. if (dir > 360) dir -= 360
    2. if (dir < 0) dir += 360
    3. if (dir > point_direction(x,y,pathfinder.x,pathfinder.y))
    4. {
    5. if (abs(dir-point_direction(x,y,pathfinder.x,pathfinder.y)<180))
    6. {
    7. dir += 5
    8. }
    9. else
    10. {
    11. dir -= 5
    12. }
    13. }
    14. if (dir < point_direction(x,y,pathfinder.x,pathfinder.y))
    15. {
    16. if (abs(dir-point_direction(x,y,pathfinder.x,pathfinder.y)>180))
    17. {
    18. dir -= 5
    19. }
    20. else
    21. {
    22. dir += 5
    23. }
    24. }
    Alles anzeigen


    Ich habe jetzt noch die ( Verwendet. Es sollte eigentlich funzen.

    Wenn du es noch nicht gelesen hast, die GML - Tutuorial für Anfänger von Windapple geklärt sehr gut den If - else Befehl.
    Auch das mit der Klammersetzung.

    Ich habe noch das geändert
    if (abs(dir-point_direction(x,y,pathfinder.x,pathfinder.y)<180))

    Gruss Drachen
    :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Drachen ()

  • nein, ich glaube du verstehst mein problem nicht...
    das mit den Klammern und so ist bei dem code alles nicht nötig.
    und >180 ist in beiden fällen richtig, da er ja checken soll, ob der abstand zwischen dir und point_direction größer als 180 ist. weil:
    ich möchte, dass der panzer sich immer in die richtung des pathfinder dreht (aber nicht zu schnell).
    allerdings soll er dabei immer den kürzeren weg nehmen, z.B. wenn dir = 10 und point_direction = 310 ist dann soll er anstatt (+5) zu machen (-5) machen. der unterschied ist der, dass wenn er +5 macht muss er sich um 300° drehn, wenn er -5 macht nur um 20°.
    und das klappt halt nicht...
    ich hoffe, du verstehst was ich mein^^

    MfG Waterman7
  • Da das hier anscheinend zu keinem Ergebnis kommt, zitiere ich wiedermals einen Code, den ich in der SuFu gefunden habe:

    GML-Quellcode

    1. var dir1, dir2, d, e;
    2. d = 1; //d=drehgeschwindigkeit
    3. dir1 = point_direction(x,y,pathfinder.x,pathfinder.y);
    4. dir2 = direction-dir1;
    5. if (dir2 > 180)
    6. dir2 -= 360;
    7. else if (dir2 < -180)
    8. dir2 += 360;
    9. if (dir2 > d)
    10. dir2 = d;
    11. else if (dir2 < -d)
    12. dir2 = -d;
    13. direction=(image_angle-dir2+360) mod 360;
    Alles anzeigen


    Der Code müsste wahrscheinlich ein wenig angepasst werden, er bewirkt aber auf jeden Fall ein langsames drehen in Richtung pathfinder.

    Ich hoffe ich konnte helfen.