Ergebnis 1 bis 9 von 9

Thema: [2k3] Event (Person) soll zu einer spezifischen Position gehen

  1. #1

    [2k3] Event (Person) soll zu einer spezifischen Position gehen

    Tag, ihr eifrigen Spieleschmiede!

    Wie der Titel es bereits sagt, benötige ich Hilfe bei einem Event, genauer gesagt bei einer Person. Es handelt sich dabei um eine Wache, die zum Helden läuft (per Custom Move: Move Towards Player), wenn der Held sich in der Nähe der Wache befindet. Das habe ich bereits alles fertig. Soweit, so gut. Wenn der Held aber wieder ausserhalb dieses nahen Bereichs ist, soll die Wache an ihren angestammten Bereich zurückgehen. Die Abfrage, wenn der Held nicht mehr in der Nähe ist, funktioniert bereits. Nur weiß ich nicht, wie sich die Wache an ihren angestammten Ort zurückbewegen soll - Teleport ist keine Lösung!

    Ich habe bereits mit Variablen rumgespielt, sodass die Koordinaten der Position und sowas gespeichert werden, aber ich habe keinen Verwendungszweck dafür gefunden. Ich habe ebenso versucht, eine Art Waytracking zu bauen, also dass es zwei Variablen gibt:
    Oben/Unten bzw. Links/Rechts
    Wenn die Wache nach rechts geht, wird auf L/R +1 gerechnet, wenn sie nach links geht -1, etc. Und dann sollte die Person bestimmte Move Events ausführen, wenn die Variable bestimmte Werte hätte. Dummerweise gibt es keine Conditional Branches, die sagen: If Player Moves Right/Left/Up/Down.

    Schlicht und ergreifend bin ich auch überfragt, arbeite auch erst seit etwas mehr als ner Woche mit einem RPG Maker.

    Jede Hilfe, jeder Tipp ist willkommen.
    Vielen Dank für eure Mühe!

    MfG,
    Phantomias

  2. #2
    Benutz doch den das Pathfinding Plugin, soweit ich weiß müsste das damit doch eigentlich gehen...

  3. #3
    Wenn du es event willst kannst du mal hier schauen link (Erzählt dir nicht exakt was du tun soll, aber ne Methode die dafür benutzt werden könnte).

    Sobald du da kurz reingeschaut hast, kannst du dir auch schnell denken dass du lieber den DynRPG + Pathfinding plugin in deinem Spiel reintust.

  4. #4
    Ich bin ja ein Fan von überkomplizierten Skripts, auch wenn zB Tracking-Plugins eventuell nützlicher wären, wenn für den Fall vielleicht auch nicht unbedingt notwendig. Lösungen zu finden macht ja auch tierisch Laune

    Zitat Zitat
    Dummerweise gibt es keine Conditional Branches, die sagen: If Player Moves Right/Left/Up/Down.
    Du meinst wahrscheinlich eher "If NPCs Moves". Stimmt, das gibt es nicht. Es gibt aber Methoden um das selbe Ergebnis zu erzielen. Es ist nur ein theoretischer Ansatz:

    Zuerst einmal muss dein Skript wissen, wann sich der NPC/Wache fortbewegt, damit er nicht anspringt wenn es nicht nötig ist und die Figur falsch zurück läuft. Verwende dazu am besten jeweils 2 Variablen für die X- und Y-Position und presse sie in einen parallelen Prozess:

    <> Position Wache X Alt --> Set Pos Wache X
    <> Position Wache Y Alt --> Set Pos Wache Y
    <> Wait 0.1 sek
    <> Position Wache X Neu --> Set Pos Wache X
    <> Position Wache Y Neu --> Set Pos Wache Y

    Danach fragst du ab, ob die jeweiligen X-Positionen und Y-Positionen sich verändert haben. Wenn ja, sollte dein Counter anspringen.
    Wie groß der Wait Befehl im obig aufgeführten Prozess ist, hängt maßgebend von der Geschwindigkeit deines NPCs ab. Vielleicht kennt jemand die Geschwindigkeiten aus dem Kopf und kann sie angeben (das wäre praktisch), wenn nicht musst du herumprobieren. Setze einfach zur Kontrolle eine Messagebox, die immer anspringt nachdem sich die Wache bewegte. Denke auch daran: "Wait 0.0" ist nicht wirklich Null, sondern ein superkurzerer Zeitabschnitt (weiß noch jemand wie lang ein 0.0 ist?). Du kannst damit also auch Feinabstimmungen für die Wartezeit festlegen.

    Wenn deine Kontroll-Messagebox also immer anspringt wenn sich die Wache bewegte, kann dein Counter aktiviert werden. Natürlich sollte er immer dann zählen, wenn eben auch diese Messagebox eingeblendet wurde. Und da du sogar schon die Positionen ALT und NEU gespeichert hast, ist es relativ simpel die Bewegung dazwischen auszulesen und in einer Variable zu speichern.
    Ich persönlich würde hierbei sehr viele Variablen verwenden, je nachdem wie groß das Gebiet ist in der deine Wache herumrennen kann. Spontan gehe ich einfach von 20 Variablen (20 Bewegungen) aus, die du dir in der Variablenliste reservierst. Die erste Bewegung, die deine Wache tätigte (aus der Differenz von ALT und NEU), speicherst du hierbei in der LETZTEN Bewegungs-Variable ab, aber umgekehrt zu seiner eigentlichen Bewegung. Die Zählung ist natürlich dir überlassen, aber aus Kontinuitätsgründen würde ich die gängige Wertverteilung nehmen:
    1=Unten, 2=Links, 3=Rechts, 4=Oben. Wie gesagt, einfach die entgegengesetzte Bewegung abspeichern. Aus 1 wird 4, aus 2 wird 3, usw.

    Sobald die Wache einen bestimmten "Streifen" erreicht hat, wo er nicht weiter möchte (zB auch über X/Y-Werte) und lieber zurückkehren würde, kannst du die Mitzählung der Bewegungen deaktivieren.
    Diese Bewegungen musst du abschließend nur noch mit Move-Events "Abspielen" (von Vorne nach Hinten). Es kann natürlich vorkommen, dass deine ersten Variablen nicht belegt sind (Gleich 0). Diese Moves musst du lediglich überspringen, bis dein Skript eine Variable mit einem Wert über 0 findet.

    Und wenn deine Wache zurückgekehrt ist, natürlich nicht vergessen alle Move-Variablen wieder auf 0 zu setzen und den Positionsprüfer (X/Y) zu aktivieren.

    Mit dieser Methode sollte es eigentlich klappen.

    [MG]

    Geändert von TrueMG (15.08.2012 um 10:51 Uhr)

  5. #5
    Zitat Zitat
    (weiß noch jemand wie lang ein 0.0 ist?)
    1/60 bzw 1 Frame, also 0.01666~7s. ^-^


    Bei RPG2000 mit Destiny gäbe es noch die Möglichkeit, abzufangen, dass sich die Grafik vom Event gerade
    nicht auf ihrem eigentlich zugewiesenen Feld befindet (Offset), die darauf gesetzte Variable muss schlicht und
    ergreifend dann größer (oder auch gern ungleich obwohl das nicht nötig ist) 0 sein und ZACK!

  6. #6
    Gibt es für den 2K echt ein Pathfinding-Script, das in Echtzeit performant (unabhängig von Mapgröße und Anzahl der Events) läuft?

    Es ist natürlich möglich, die Step-Toward-Hero-Methode so umzuschreiben, dass aus ihr ein Step-Toward-Event (oder in deinem Fall Feld) wird. Dabei muss man aber mit den gleichen Schwächen leben, die Figur kann also an der Wand hängen bleiben. Alternativ könntest du eine Methode schreiben, die an den Mapaufbau angepasst ist. Du weißt ja wo sich alle Hindernisse befinden. Die Wache müsste also abhängig von ihrer Position immer einen Weg wählen, der an allen Hindernissen vorbei führt. Das sollte nicht zu kompliziert sein, es sei denn es gibt zu viel blockierenden Kleinkram.

  7. #7
    Erstmal vielen Dank für eure schnelle und kompetente Hilfe!

    Was Plugins angeht, stimme ich eher TrueMG zu, schließlich macht es Spaß, mit den Gegebenheiten und dementsprechend auch den Limitierungen des Makers scheinbar "unmögliche" Dinge zu schaffen - zumindest mir. Nur im Notfall würde ich Plug-Ins verwenden, wenn ich wirklich hoffnugslos bin und selbst ihr keinen besseren Rat wisst. Dein Link, Kazesui, ist zwar interessant, doch trifft er halt nicht ganz die Richtung und ist, wie Du bereits angedeutet hast, viel zu kompliziert. Und TrueMG: Ganz genau, ich meinte "If NPC/ Event Moves".

    Mit dem Maker 2k3 bin ich sehr zufrieden, da habe ich eigentlich weder Zwang noch Lust zum Vorgänger zu wechseln, auch wenn MagicMakers Idee sicherlich für 2k funktionieren würde. Vom Umschreiben habe ich überhaupt keine Ahnung, tut mir Leid, Kelven.

    Aber ich hoffe ihr seid nicht enttäuscht, dass ich durch Kelvens Ansatz (Anpassung an die Map) und TrueMGs möglichen Befehle eine eigene Idee entwickelt habe, die sogar funktioniert - ich erstaune mich immer wieder selbst:

    Erstmal habe ich ein paralleles Common Event erstellt ("Gegnerstandort"), ausgelöst durch einen Switch (z.B. einen, der angeht, wenn die Map mit den Wachen betreten wird und ausgeht, wenn die Map verlassen wird):
    Da drin sind zwei Variablen, die den momentanen Koordinaten der Wache entsprechen, also Set Variable "X Pos" equal to Sprite "Wache" X-Coordinate und dasselbe nochmal mit der Y-Koordinate. Da die Anfangsposition - zu der die Wache auch zurück soll - auf (7,3) liegt, habe ich die Variable "X-Pos" minus 7 gerechnet und die Variable "Y-Pos" minus 3.

    Zweites paralleles Common Event ("Wegerkennung X"), welches durch einen Schalter ausgelöst wird, der angeht, wenn sich die Wache auf den Rückweg machen soll:
    Wenn die Variable "X-Pos" größer als 0 ist, soll er sich nach links bewegen. Ist sie kleiner als 0, nach rechts. Ist sie gleich null, soll ein Schalter angehen: "Wegerkennung X fertig".

    Drittes paralleles CE ("Wegerkennung Y"), getriggert durch "Wegerkennung X fertig":
    Wenn die Variable "Y-Pos" größer als 0 ist, soll er sich nach unten bewegen. Ist sie kleiner als 0, nach oben. Ist sie gleich null, soll die Wache nach unten gucken, und dann werden alle Schalter wieder auf aus gestellt.

    Fertig. Klappt, sieht anständig aus und ich brauche keine Timings mit Wait-Befehlen - ich weiß, in jedem parallelen Event sollte eigentlich ein "0.0 Wait" sein, aber den lasse ich hier mal getrost weg. Ich hoffe mal, dass dies jemandem nützt, der dasselbe Problem hat. Aber ohne Gedankenstöße eurerseits wäre das nicht möglich gewesen. Vielen Dank!

    Soll ich noch in den Titel schreiben, dass es gelöst wurden? Manche Foren wollen das ja gerne.

    -----------------------------------------------------------------------------------

    Edit: Das eigentliche Problem ist gelöst, nur frage ich mich nun, wie ich es hinbekomme, dass er während des Zurückgehens abfragt, ob der Held nah an ihm dran ist und somit die Verfolgung wieder aufnimmt. Mein Versuch war es, jeweils vor einem Move Event durch Conditional Branches den Abstand zum Helden zu erfragen und falls der Held nah dran sei, so soll ein Schalter betätigt werden, der die Wache wieder zur Verfolgung animiert. Das Dumme daran ist nur, dass die Wache stur bei der Sache bleibt, getreu ihrem Motto: "Wenn ich zurücklaufe, laufe ich zurück. Basta."

    Falls jemand spontane Ideen bzw. Hilfestellungen hat - her damit, bitte! Ich probiere indes noch weitere Dinge aus, doch glaube ich kaum, dass die funktionieren werden.

    Geändert von Phantomias (15.08.2012 um 20:06 Uhr)

  8. #8
    Du könntest ja ein Parallel Event mit zwei Branches machen. Bei Betreten der Map solltest du erstmal die Ursprungsposition des Helden in zwei Variablen speichern. Am Anfang des Events wird dann grundsätzlich immer die Entfernung vor Urpsurngspunkt zum Helden gemessen. Ist er zu weit weg, springst du zum ersten Zweig: Ursprungsposition ansteuern (hierzu benötigst du die vorher gespeicherten Variablen). Ist er nahe genug, springst du zum zweiten Zweig: Dem Helden nähern. Um zu gewährleisten, dass das Skript auch stets aktiv ist, solltest du dabei die pro Move Event maximal einen Schritt machen, da Move Events ja Zeit in Anspruch nehmen. Ich kann dir allerdings nicht versprechen, dass das auch wirklich flüssig läuft. Ich kann mir vorstellen, dass die Wache dann nach jedem Schritt erstmal eine kurze (aber bemerkbare) Pause einlegt. Kommt drauf an, wie der Maker arbeitet. Man müsste es halt ausprobieren. Mit längeren Move Events (bzw. Move Event-Schleifen) sehe ich aber keine Möglichkeit, dieses Skript dauerhaft aktiv zu halten. Das kann nur mit Skripts funktionieren, die jede Frame ausgeführt werden.

  9. #9
    Hab nach jedem Schritt ein Call Event eingesetzt und genau dieses Event fragt ab, ob der Held in der Nähe der Wache ist. Und wenn dies der Fall ist, werden die nötigen Schalter abgeschaltet (sprich: der Rückweg wird abgebrochen). Läuft flüssig, für meine Ansprüche reicht es jedenfalls. Ist praktisch deine Idee, schließlich wechsel ich damit auch zwischen "Ursprungsposition ansteuern" und "Rückweg" hin und her. Danke!

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •