Monster rennt dumm herum, wenn von 5 Steinen geblockt, soll aber zu Punkt A

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

  • Monster rennt dumm herum, wenn von 5 Steinen geblockt, soll aber zu Punkt A

    Hallo Leute,

    ich habe eine Map und da gibt es ne Stelle wo 8 Steine liegen, und wenn Monster1 gegenüber vom Stein ist und ich auf der anderen seite bin, es mich verfolgt, doch immer nur die Steine hoch und ab läuft, anstatt drum herum! (am besten den schnellstmöglichen Weg zu mir)...

    ..Kann mir da jemand helfen? die Suchfunktion habe ich genutzt, leider nicht soetwas gefunden, nur ähnliche Themen...(nichts mit, wenn 8* blocken dann herumlaufen* etc...)


    mein code brauch ich nicht wirklich zeigen, da ich einfach nur avoid solid gemacht habe. Vielleicht geht es ja auch super mit einem code wie zB.: if steine im weg then move herum oder sowas? :S :?:

    Grüße...
  • Schau mal nach diesem D&D-Symbol. Es befindet sich bei den Move-Actions deines Objekts. Nähere Erläuterungen dazu findest du in der Hilfe-Datei.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Nur das eine Drag & Drop Symbol reicht meistens nicht.
    Man muss mehrere Abfragen machen.
    Genau kann ich dir das jetzt auch nicht erklären, aber ich kann mal
    gucken, ob ich noch das eine Spiel von mir finde.
    Da klappt das recht gut :rolleyes:
  • Mmmh. Ich habe da so ein Lib.

    file-upload.net/download-1004884/09_extra.lib.html

    Lib einfach in den GameMaker Ordner und dann unter "lib" einfügen.

    Dann bei dem Gegner Objekt, unter Step, das Drag & Drop Symbol oben links (sieht wie das Symbol für Paths aus) in der neuen Bibliothek "Extra" benutzen.

    Also bei mir hats was gebracht.
  • Also ich würde dafür jetzt nicht extra eine Library einbinden, sondern
    mich einfach mal mit den mp_ Funktionen beschäftigen. Mit mp_potential_step()
    läuft das Monster mit gegebener Geschwindigkeit auf den Zielpunkt zu und
    vermeidet dabei Hindernisse (nach Wahl solid und non-solid)
    Lies das aber am besten noch mal in der Hilfe nach.
    (An dieser Stelle gleich mein Rat: Fang so bald wie möglich mit GML an, da spart
    man sich echt haufenweise Ärger)
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Prustel: ich werde es versuchen mit mehreren Abfragen, hatte ich gestern schon aber erfolglos. Wäre cool wenn du dein Spiel nochmal findest, danke erstmal!

    Hainisoft: Danke ich habe sie mir erstmal heruntergeladen und werde gucken, wenn ich verzweifelnd nicht weiterkommen sollte bei den anderen Abfragen...

    Spellmaker: Danke dir auch, ich werde am besten so wenig D&D benutzen wie möglich? (Alles einfach in einem Code reinkloppen, pro Event?! :) )



    Grüße...
  • Na ja, man sollte schon einzelne Codeblöcke ()
    für die sinngemäß zusammenhängenden Blöcke nehmen.
    Vielleicht mag sich die Sache mit mp_potential_step
    schwer anhören, aber für KI's sind die mp Funktionen
    einfach unerhört wichtig, ohne die kann man fast schon
    einpacken.
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Spellmaker schrieb:

    Na ja, man sollte schon einzelne Codeblöcke ()
    für die sinngemäß zusammenhängenden Blöcke nehmen.
    Vielleicht mag sich die Sache mit mp_potential_step
    schwer anhören, aber für KI's sind die mp Funktionen
    einfach unerhört wichtig, ohne die kann man fast schon
    einpacken.
    Ja ich benutze auch soviel Scripts wie möglich, hehe, aber wenn du meinst, manchmal kann man ruhig sone Dinger benutzen, dann werden ja nicht soviele Probleme zustande kommen.

    Du meintest nur; wenn ich NUR D&D benutze (denk ich mal). Gut das tu ich ja sowieso nicht^^...

    ich versteh nur nicht was ihr mit mehreren Abfragen meint... bei mir siehts so aus:



    ................S...
    ..................S.
    ..................x.S
    ...................S
    ...................S
    ....M................S
    ....................S
    ..................S..
    .................S...
    ...............S.....
    ..............x..S...
    ..............S......
    ...........S.........

    S = Stein
    M = Monster
    x = der max. point wo die Monster hinlaufen, wenn sie mit soliden objekten (S = den Steinen) collisieren

    Weißt du was für ne Art abfrage ich vllt reintun sollte? :-/

    habe im step event das:

    GML-Quellcode

    1. mp_potential_step(500,220,2,solid)


    das Monster soll eig nur zum bestimmten Punkt laufen, der vorgegeben ist... :(
  • Ich hab mal einfach ein Example für mp_potential_step
    gemacht.
    @ttothef: Ich muss mich nochmal korrigieren xD gegen D&D ist nichts einzuwenden
    (vor allem weil ich auch immer mal wieder welches verwende) aber mit GML hat man
    einfach mehr Möglichkeiten. (So hatte ichs von anfang an sagen wollen :| )
    mp.zip
    Edit: Anhang vergessen xD
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Danke aber soweit war ich auch schon.

    Habe doch extra eine Skizze gemacht, wie das Monster läuft, wenn die Steine anders sind .......

    wenn du ne grade strecke hast dann klappt es ja auch aber was ist wenn die Steine so sin wie bei mir? Probier das mal..rapidshare.com/files/133105695/mpblock.gmk.html

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

  • Mist... Wiedermal die eigentliche Problematik falsch verstanden :D
    Ich hab mal ein bisschen rumgespielt. Die Lösung ist zwar nicht perfekt und auch
    nicht die schnellste, aber sie geht. Wenn du willst, kannst du noch den Vektor der
    zwischen dem Monster und dem Zielpunkt liegt, verkürzen.
    Der Pfeil gibt den zufälligen Zielpunkt an, der Rest ist gleich wie vorher.
    Ansonsten würde ich aber folgendes sagen:
    1. Der Spieler ist sowieso dauernd in Bewegung, also ist es egal, wenn er an manchen Stellen nicht
    richtig von den Monstern erreicht werden kann (in Omega Force reicht mir auch mp..)
    2. Es ist nicht schlimm, wenn der Spieler an manchen Stellen in Deckung gehen kann, dass ist meiner
    Meinung nach sogar wichtig, damit man sich auch mal kurz ausruhen kann.
    Dateien
    • mpblock.zip

      (13,49 kB, 79 mal heruntergeladen, zuletzt: )
    ___________________________________________________________
    Beware of wild pointers
    ______Hinweis für Allergiker: Kann Spuren von Ironie enthalten_____
  • Dazu muss man sich erstmal anschauen, wie mp_potential_step funktioniert.
    Denn eigentlich macht es nichts anderes als ein paar Pixel vorauszuschauen und bei Kollision mit einem Objekt in die "näherliegende" Richtung dreht. Bei komplexeren Dingen kommt die Funktion nicht mehr nach.
    Dazu gibt es die mp_grid/path dinger..(ehrlich gesagt noch nie verwendet)

    edit:
    Mist... Wiedermal die eigentliche Problematik falsch verstanden
    Ich hab mal ein bisschen rumgespielt. Die Lösung ist zwar nicht perfekt und auch
    nicht die schnellste, aber sie geht. Wenn du willst, kannst du noch den Vektor der
    zwischen dem Monster und dem Zielpunkt liegt, verkürzen.
    Der Pfeil gibt den zufälligen Zielpunkt an, der Rest ist gleich wie vorher.
    Ansonsten würde ich aber folgendes sagen:
    1. Der Spieler ist sowieso dauernd in Bewegung, also ist es egal, wenn er an manchen Stellen nicht
    richtig von den Monstern erreicht werden kann (in Omega Force reicht mir auch mp..)
    2. Es ist nicht schlimm, wenn der Spieler an manchen Stellen in Deckung gehen kann, dass ist meiner
    Meinung nach sogar wichtig, damit man sich auch mal kurz ausruhen kann.

    Eigentlich noch ne einfache und dafür gute Lösung.. Bis auf die Tatsache, dass er manchmal seltsame Pfade abläuft und selbst auf der Zielgeraden nochmal abdreht, weil der Weg zu weit ist ^^
    PS: Was kostet daran soviel Leistung? cO
    "das war meine letzte flamewar PM an dich ."

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

  • Danke für deine Hilfe Spellmaker, aber das ist leider nicht meine Vorstellung, wie mein Monster laufen sollte :( trotzdem thx wa


    blubberblub: Na ich werd es mal versuchen mit diesen mp_grid_path() etc... aber denke mal wird erstmals erfolglos bleiben.


    Danke für die Hilfe und n schön Abend noch ;)
  • Also, selbst wenn du kein lib willst.

    Ich hab es an deinem Beispiel getestet, und das geht auf jeden Fall.

    Also für den Notfall könntest du das nur für dieses Spiel mal einbinden und dann wieder löschen, wenns fertig ist.
  • Ich hab ne Weile probiert, hat aber nichts funktioniert.

    Aber ich denke ich weis was das Problem ist:

    Das Monster muss schon von Beginn an checken, wie und wo die Wände angeordnet sind.

    Dann nimmt es einfach den leichtesten Weg.

    Sorry, aber ich weis leider nicht wie das geht. :(

    Trotzdem hoffe ich das du zu einer Lösung kommst. :)

    Mfg Hainisoft
  • wie wärs, wenn du ein grid erstellst (mp_grid_create) mit mp_grid_add_instance() alle steine ins grid einfügst um diese positionen als blockiert zu markieren und schlussendlich einen pfad bberechnest (mp_grid_path)? Das funktioniert immer (wenn das monster nicht von steinen eingeschlossen ist)
    Hilfe:
    Spoiler anzeigen
    mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight) Diese Funktion erstellt das Gitter. Sie gibt einen Index zurück, der bei allen anderen Aufrufen verwendet werden muss. Du kannst mehrfache Gitter-Strukturen zur selben Zeit erstellen und verwalten. "left" und "top" geben die Position der linken oberen Ecke des Gitters an. "hcells" und "vcells" geben die Anzahl der horizontalen und vertikalen Zellen an. Schließlich geben "cellwidth" und "cellheight" die Größe der Zellen an.
    mp_grid_destroy(id) Zerstört das angegebene Gitter und gibt belegten Speicher frei. Vergiss nicht dies aufzurufen, sobald Du das Gitter nicht mehr benötigst.
    mp_grid_clear_all(id) Markiert alle Zellen des Gitters als frei.
    mp_grid_clear_cell(id,h,v) Markiert die angegebene Zelle . Zelle 0,0 ist die linke obere Zelle als frei.
    mp_grid_clear_rectangle(id,left,top,right,bottom) Markiert alle Zellen die das angegebene Rechteck schneiden (in Raumkoordinaten) als frei.
    mp_grid_add_cell(id,h,v) Markiert die angegebene Zelle als verboten. Zelle 0,0 ist die linke obere Zelle.
    mp_grid_add_rectangle(id,left,top,right,bottom) Markiert alle Zellen die das angegebene Rechteck schneiden als verboten.
    mp_grid_add_instances(id,obj,prec) Markiert alle Zellen die eine Instanz des angegebenen Objektes schneiden als verboten. Du kannst auch eine individuelle Instanz verwenden, indem du "obj" die id der Instanz zuweist. Ferner kannst du das Schlüsselwort "all" angeben, um alle Instanzen aller Objekte anzugeben. "prec" gibt an, ob präzise Kollisionsprüfung verwendet werden soll (funktioniert nur, wenn präzise Prüfung für das von der Instanz verwendete sprite aktiviert ist).
    mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag) Berechnet einen Pfad durch das Gitter. "path" muss einen existierenden Pfad angeben, der durch den Computerpfad ersetzt wird. "xstart" und "ystart" geben den Start und "xgoal" und "ygoal" das Ziel an. "allowdiag" gibt an, ob diagonale Bewegung zulässig ist statt nur horizontaler oder vertikaler. Die Funktion gibt wieder, ob sie erfolgreich einen Pfad gefunden hat. (Beachte, dass der Pfad unabhängig von der aktuellen Instanz ist; es ist ein Pfad durch das Gitter, nicht ein Pfad für eine besondere Instanz.)
    mp_grid_draw(id) Diese Funktion zeichnet das Gitter, wobei freie Zellen grün eingefärbt sind und verbotene werden rot gezeichnet. Diese Funktion ist sehr langsam und steht nur zur Fehlersuche zur Verfügung.

    © 2008 by Teamgrill Productions