[Tutorial] Aggro-Range, Sichtweiten von NPC (Events)

  • Hier nochmal ein kleines Tutorial, dass ich vor ein paar Jahren für den VX Ace geschrieben hab. Vielleicht kann man das für den MV auch benutzen. mit n bisschen Glück, kann jemand noch was damit anfangen ^^






    Aggro-Range, Blick- oder Hörreichweiten



    aka:

    “Es kommt direkt auf uns zu!“

    -Onkel Jimbo
    -



    Was ist eine Aggro-Range?


    Naja, darunter versteht man in vielen Spielen, den Bereich um einen Mob oder NPC in welchem selbiger dem Spieler gegenüber Aggressiv reagiert.


    Zum Beispiel, lässt euch ein Wolf aus der Ferne betrachtet in Ruhe. Kommt Ihr ihm aber zu nah, greift er euch an.



    Im RPG Maker habe ich das auf verschieden Arten versucht um zu setzten


    und wollte euch eineml die beste Lösung vorstellen, die ich gefunden hab.



    Das Standardverfahren im RPG Maker ist der Zufallskampf. Eine Variante die Ich persönlich nicht schön finde, da der Spieler keinerlei Einfluss darauf hat. Lieber wäre es mir, wenn ich die Gegener vorher sehen könnte. Da die meisten Monster oder Tiere auch entsprechende Charaktersheets haben, ist das auch noch kein Problem.



    Bleiben wir doch bei dem Beispiel eines Wolfes im Wald.


    Wenn wir den Wolf als Event erstellen und ihn sich zufällig Bewegen lassen, sieht das schon schön aus.


    Das Problem ist, die Zufallsbewegung, des RPG Maker ist so schlau, das er nicht versucht unseren Wolf nicht über Tiles laufen zu lassen, die er gar nicht betreten kann. Das Feld auf dem der Spieler steht, wird automatisch als ein solches erkannt. Unser Wolf wird also nicht nur nicht Angreifen. Solange der Spieler sich nicht bewegt, läuft der Wolf sogar drum herum.


    Das ist aber doof. :cross2:




    :s_book2: Rezept]



    Wir brauchen für dieses Tutorial


    die Variablen :


    :s_rechts: 1. Held_X (X-Koordinate des Helden)


    :s_rechts: 2. Held_Y (Y-Koordinate des Helden)


    :s_rechts: 3. Aggro_Range (der Abstand zwischen Held und Wolf)


    :s_rechts: 4. Event_X (X-Koordinate des Wolfes)


    :s_rechts: 5. Event_Y (Y-Koordinate des Wolfes)


    und


    :s_rechts: 6. Event_Nr (Als Zähler für mehr als einen Wolf)



    sowie die Schalter :


    :s_rechts: Wolf_1 – Wolf_3 (Um den Aggressiven Zustand des jeweiligen Wolfes An- oder Aus- zu schalten)





    :s_fix: Also, geben wir unserem Wolf eine Aggrorange. Das ist quasi der Sichtbereich des Wolfes.


    Wenn der Spieler Ihm zu nahe kommt, greift er uns an.


    Wie geht das?



    Die eigentliche Idee, hinter diesem System, hatte Meridianbot in seinem Tut: Lärmreichweiten


    Wir verwenden eine einfache, mathematische Formel um den Abstand zwischen dem Spieler und dem Wolf zu berechnen.



    Wir erstellen also erst einemal ein Steuer-Event für die Koordinaten des Spielers:



    :s_cog: Auslöser: Paralleler Prozess



    Und erstellen zwei Variabelen:





    :s_rechts: Held_X → setzen → Spieldaten → Charakter → Spieler → Karte X-Koordinate,


    :s_rechts: Held_Y → setzen → Spieldaten → Charakter → Spieler → Karte Y-Koordinate


    & darunter noch ein wait Befehl von einem Frame.



    :info: Nun brauchen wir einen Wolf.


    :arrow1: Event erstellen


    :arrow1: Bewegung: Zufall.



    Dass Steuer Event für den Wolf sieht etwas Komplizierter aus, aber nicht sehr.


    :s_pin: Event erstellen


    :s_cog: Auslöser: Paraleller Prozess


    Hier fangen wir mit dem :arrow1: 1-Frame-Wait an,


    darunter kommt der Skriptbefehl: :arrow1: $g_v=$game_variables


    um einen sauberen Zugriff auf die Variablen zu gewährleisten.


    ( :info: Eventbefehl, dritte Seite, unten rechts)


    Nun setzten wir die Variablen: :arrow1: Event_X & Event_Y auf die X- und Y- Koordinaten des Wolfes.



    Und dann brauchen wir den Satz des Phytagoras.


    Der gute Mann hat seinerzeit eine Formel für rechtwinkelige Dreiecke aufgestellt, die wir


    uns zu nutze machen können. :info: c²=a²+b²



    Wir brauchen also wieder einen Skriptcall-Befehl mit folgendem Inhalt:


    :s_rechts: $g_v[3]=Math.sqrt(($g_v[1]-$g_v[4])**2+($g_v[2]-$g_v[5])**2)



    :idea: Diese Formel setzt die Variabele 3 auf den exakten Abstand zwischen den Positionen vom Spieler und dem Wolf.


    Um etwas deutlicher zu machen, was Ihr ändern müsst, wenn Ihr diese Formel kopieren


    wollt:


    $g_v[ :star: Zielvariable]=Math.sqrt(($g_v[ :star: Spieler_X]-$g_v[ :star: Event_X])**2+($g_v[ :star: Spieler_Y]-$g_v[ :star: Wolf_Y])**2)



    Also einfach in die [Eckigen Klammern] den Index eurer verwendeten Variablen.



    Da nun der Abstand in einer Variablen festgehalten wurde, ( :info: in meinem Beispiel die Variable 3) können wir sie auch einfach abfragen.



    Also wird :s_rechts: eine Bedienung gesetzt ob die Variable 3 kleiner oder gleich ist.


    Der Wert dieser Abfrage, bestimmt die Größe eurer Aggro Range.


    Ich nehme einfach mal 5.


    Das ist also die Bedienung, unter der unser Wolf Aggressiv wird.


    Also setzen wir hier :s_rechts: den Schalter : „Wolf_1“


    ( :s_lightbulb: Um dem Spieler deutlich zu machen, dass er den Wolf verärgert hat, kann hier noch ein Sound oder Baloon Icon eingefügt werden. Diese allerdings unter der Bedienung: Schalter: Wolf_1“ = Aus und vor der entsprechenden Schalterkontrolle.)







    Jetzt wieder zum Wolf.


    Wir geben dem Wolf eine weitere Eventseite mit der :arrow1: Bedienung: Schalter „Wolf_1“ = An.


    :s_rechts: Bewegungsroute → Benutzerdefiniert → Schritt zum Spieler → Befehl wiederholen & Überspringen wenn nicht möglich.


    :s_cog: Auslöser: Berührung durch Event.



    :s_warning!: Warum 'durch Event' und nicht 'durch Spieler'?


    Naja, bei Berührung durch Spieler, muss der Spieler immer noch bewusst auf das Event zu gehen, damit es auslöst. Dass ist nicht so schön, da er ja nun Angegriffen wird.




    Jetzt können wir den entsprechenden Kampf einfügen.


    Unter den Kampf setzen wir den :arrow1: Eigenschalter: A = An und erzeugen eine dritte Eventseite mit der :arrow1: Bedienung: Eigenschalter A = An,


    :s_rechts: Paralleler Prozess und einem Waitbefehl. Solange bis dieser Wolf Respawnen soll. Wenn er das denn soll, kommt hinter den Waitbefehl ein:

    :s_rechts: Schalterkontrolle: Wolf_1 = Aus und :arrow1: Eigenschalter A = Aus.


    :s_fix: Ich selbst, setze noch einen Befehl: Eventposition festlegen, damit der Wolf nicht direkt an der Stelle Respawnt, an der er bekämpft wurde.



    :s_accept: So, jetzt haben wir einen Wolf, der uns Angreift wenn wir Ihm zu nahe kommen, aber eine Schwalbe macht ja bekanntlich noch keinen Sommer.



    :s_bomb: mehrere Wölfe



    Um mehrere Wölfe zu verwalten bedarf es nicht viel.


    Lediglich eine Variable und für jeden weiteren Wolf einen Schalter kommen dazu.



    :s_key: Um nicht für jedes Monster auf der Map einzelnd die X- und Y Koordinaten sowie den Abstand zu berechnen,


    bedienen wir uns eines Zählers.



    Am Ende des Steuer-Eventes für den Wolf fügen wir eine Variablen Kontrolle ein.


    :s_rechts: Variable: „Wolf_Nr“ +1. Wichtig, dass Ihr die Berechnng hier auf Add einstellt.





    Jetzt setzt Ihr die Eventbedienung auf :s_rechts: Variable „Wolf_Nr“ = 0 oder höher.



    Dieser Eventseite kopiert Ihr, für jeden Wolf den Ihr wollt.


    In meinem Beispiel, will ich drei Wölfe.


    Also Kopier ich mir auch, den einen Wolf, den ich hab, noch zwei mal.



    Jetzt haben wir drei Wölfe und drei Eventseiten im Steuer-Event.


    In den neuen Eventseiten des Steuer-Events muss ich jetzt die Variabelen Kontrollen: Event_X und Event_Y und die Schalterkontrolle auf die neuen Wölfe anpassen. Für jeden Wolf eine Seite.





    Ausserdem muss die Bedienung für die Eventseite jeweils um einen erhöht werden.


    :s_fix: Wichtig: Auf der letzten Seite wird die Variablenkontrolle „Wolf_Nr“ wieder auf 0 gesetzt.



    Bei den neuen Wölfen muss auf Seite zwei die Bedienung: :arrow1: Schalter „Wolf_2“ oder „Wolf_3“ =An geändert werden. Ebenso der Eventbefehl auf der dritten Seite :arrow1: Schalterkontrolle:“Wolf_2“ oder „Wolf_3“ = Aus.



    :s_lightning: Jetzt habt Ihr drei Wölfe, die auf euch zugerast kommen, wenn ihr Ihnen denn zu nahe kommt.



    Dieses System gibt einem Spieler die Möglichkeit, kämpfen aus dem Weg zu gehen, wenn er den Sehr vorsichtig ist. Im Normalfall hat der Spieler einen Sichtbereich von acht Tiles nach rechts und links und nur sechs nach oben und unten. Durch Wetter und Licht Effekte und vor allem durch die Gestaltung einer Map, kann es stark erschwert werden, einen Mob zu sehen.





    Es gibt viele schöne Möglichkeiten.


    Man muss ja nicht zwangsläufig Monster nehmen.


    Wie wäre es beispielsweise mit NPC in einer Stadt, die auf den Spieler zugehen und Ihn ansprechen statt immer nur Umgekehrt?


    Wachen vor einem Schloss, könnten auch umsetztbar sein und das Steuer-Event ist auch fähig Sounds ein zu blenden wie es von Meridianbot ja auch beschrieben wurde.


    Notfalls sogar all dies gleichzeitig.



    Auch die Angesteuerten Monster kann man noch etwas aufwerten.


    So wäre es z.B. Möglich, einen Wolf, nach dem ersten Kampf als Spinne Respawnen zu lassen.


    All diese Möglichkeiten sind in meinem Beispiel auf Map 2 vorhanden.


    Schaut es euch an ….







    So,



    Ich hoffe, das euch das Tutorial hilft und das ich mich verständlich ausgedrückt habe.


    Wie immer ist Kritik, Meinungen oder gar ein Lob gern gesehen.


    :s_lightbulb2: Vor allem interessieren mich eure Ideen zur Verwendung.





    (Ich hoffe es klappt, hab das noch nie gemacht)



    Gruß,


    Coffee

  • Hab jetzt direkt Lust bekommen ein kleines stealth Game damit zu machen^^

    So gesehen mehr als brauchbar. Findet in meinem kleinen Projekt definitiv Platz! Vorallem da ich nicht wirklich Fan der Random bzw.erst-mal-ansprechen encounter bin.


    Gruß, Akabe!

  • Ein sehr verständliches Tutorial, hat mir sehr geholfen, Danke.


    Edit: Anstatt "$game_variables" wäre es dann "$gameVariables" und das quadrieren nicht mit "**2" sondern "^2"

    Dann funktioniert das ganze.


    Wie verhält es sich mit dem Respawn, wenn man die Map verlässt?

    Ich habe bei Events, die Respawnen sollen (Pflanzen, Gegner, sammelbare Items etc.), immer eine Varibale benutzt, mit der ich überprüfen kann, ob die gewünschte Zeit vergangen ist. Funktioniert das ganze auch mit "wait" ?

    Das würde nämlich für deutlich mehr Übersicht sorgen.


    Gruß Jagdfuerst

    Dieser Beitrag wurde bereits 2 Mal editiert, zuletzt von Jagdfuerst ()

  • Jetzt ist das schon über vier Jahre her ....


    ich hatte mir im Sale mal den MV gegönnt, und gestehe zu meiner Schande: Ich bekomme es selbst nicht zum laufen. ;(


    Die Änderungen von Jagdfuerst habe ich vorgenommen, aber der Scripcall funktioniert nicht mehr.

    Auch habe ich sowohl den eigenen Script call Befehl, wie den "Variablen ändern" Befehl : Script benutzt, ohne Erfolg.


    :!::?:


    Erst den Scriptcall: $g_v=$gameVariables


    Dann die Befehlszeile: Variablen Steuern [Zielvariable #0025] --> Skript:

    Math.pow(($g_v[29]-$g_v[26])^2+($g_v[30]-$g_v[27])^2)


    Mein Held hat die Variablen [#0029]= X-Koordinate und [#0030]= Y-Koordinate.

    Mein NPC hat die [#0026] = X und [#0027] = Y


    Aber aus einem Grund, der mir noch nicht ganz klar ist, funktionieren die Formeln nicht.

    Kann mir da jemand helfen?


    Ich bin einfach sehr lange raus, daher muss mir bitte Jemand auf die Sprünge helfen. ;(

    Bin für jede Hilfe Dankbar.


    Gruß,

    Coffee

    100User_CoffeeUser.png Vatertag_CoffeeUser.png

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von CoffeeUser ()