Monster die mich in den Wahnsinn treiben...

Finch

Mächtiger Krieger
Mitglied seit
09.03.2009
Beiträge
107
Huhu..

wie ich in nem anderen Thread schonmal erwähnt hatte, hab ich mit dem makern schon lang nichts mehr am Hut, doch wie das Leben so spielt bekam ich Gestern mal wieder Lust drauf! Nun hatte ich mich heute mit nem Kollegen zusammen gesetzt um nen altes Projekt von uns neu aufzusetzen...das Prob ist nur das man so einiges verlernt hat und es nur seeehr langsam voran geht! :D

Wie auch immer, jedenfalls gehts um den Rmxp und grob gesagt um das Thema Ks! Geplant ist es das Standart Ks beizubehalten, die Monster in Dungeons oder generell ausserhalb der Worldmap aber als Event darzustellen! An sich ja noch kein Problem...
nun sollen sich die Monster natürlich auch auf den Spieler zubewegen, was ja auch noch kein Problem ist...eigentlich! Klappt auf kleinen Maps alles wunderbar...nun haben mer aber ne etwas größere Map...sagen wir 100x100 und der Spieler betritt sie von unten links...da die Events die die Monster darstellen natürlich alle auf "parallel process" gestellt sind als Startbedingung, rennen nun natürlich sämtliche Monster auf dieser 100x100 map auf unsere Recken zu...nicht alle finden ihren Weg, aber das ist ja nicht Sinn der Sache! ;)

Bei unsrem alten Projekt im Rm2k3 hatten mers iwie so hinbekommen das die Monster ihre Bewegungen erst begonnen haben, wenn sie im aktuellen screen zu sehen waren...nur wissen wir absolut nichtmehr wie wir das zustande gebracht haben!

Ich hab mir nun erstmal nur provisorisch geholfen indem ich den Monstern ne Art "Sichtradius" verpasst habe. Dafür hab ich in einem bestimmten Radius ums Monster herum Events erstellt die bei Player Berührung jeweils einen Switch aktivieren,woraufhin das jeweilige Monster sich in bewegung setzt! Ist ja alles schön und gut, klappt auch, aaaaaber das kanns ja nicht sein...das wäre ja am Ende ein Riesenmeer aus Events und Switches wenn man bei jedem Monster ein solches Spektakel veranstaltet!^^

Also, hier nun meine Frage: Wie würdet ihr das ganze Handhaben?

Ich hoffe ich habe das halbwegs verständlich rübergebracht, das is nich grad meine Stärke! :D

Bin zwar noch bei rpgxp.de angemeldet und könnte da sicherlich auch nachfragen, aaaaaber das Rpgmaker Topic geht hier iwie n bissel unter und ich denke auch hier sind einige Leute die sich mit sowas auskennen! ;)

Ich danke schonmal im Voraus...

so far
 

Kinta

Rebusmind is dead
Mitglied seit
06.08.2003
Beiträge
2.661
Ähm, ich hätte es genauso gemacht, wie du es schon beschrieben hast.
Man könnte sicher mit Ruby irgendwas Schönes schreiben, aber davon habe ich keine Ahnung.
Ich war jetzt natürlich keine Hilfe, aber ich finde deinen Ansatz schon gar nicht so schlecht.
Ich würde an deiner Stelle darüber nachdenken, ob du deine Maps in kleinere Untermaps einteilst, um die Performance zu verbessern, denn 100x100 große Maps können schon ein Problem werden.

Kinta
 
OP
OP
Finch

Finch

Mächtiger Krieger
Mitglied seit
09.03.2009
Beiträge
107
Ja, von Ruby hab ich leider auch keine Ahnung, wäre vllt mal ne Überlegung wert sich damit zu befassen...würd vieles einfacher machen, wenn man sich einige Scripts von anderen Leuten so ansieht! :p

Und die grösseren maps sind auch eher die krassen Ausnahmen, das würd glaub ich ziemlich die Atmosphäre zunichte machen diese maps in 5,6 maps zu unterteilen! Wenn mer iwann mal fertig werden, werden wir das Projekt auch auf schwächeren Rechnern testen, wenns echt zu Performancelastig wird an einigen Stellen, dann werd ichs nochmal ummappen, das is ja das kleinste Übel! ;)

Ich bin die ganze Zeit am überlegen ob man das Prob nicht mit irgendeinem Common Event lösen könnte....aber ich war nu echt zu lange raus als das mir was sinniges einfallen würde! :D

Ich hätte da noch ne kleine Frage: Kennt ihr iwelche Seiten aus Japan über den Xp? Am besten sollte man dort Ressourcen finden können die dem Rtp ähneln, da ich eh kein Japanisch kann, wäre der Rest relativ unwichtig! ;) Hatte damals mal einige gute Sites gefunden, aber iwie war jede Suche vergebens bisher....wollte nun nicht extra noch nen Thread aufmachen!

Achja, danke soweit Kinta! :)
 

Kinta

Rebusmind is dead
Mitglied seit
06.08.2003
Beiträge
2.661
Gibt es einen Grund dafür, dass die Seiten japanisch sein sollen?

Kinta
 
OP
OP
Finch

Finch

Mächtiger Krieger
Mitglied seit
09.03.2009
Beiträge
107
Japp, den gibts....ich denke man findet mehr an Ressourcen! Wenn ich mich auf Deutschen, Französischen...Seiten umschau, find ich mit Mühe und Not grade mal das nötigste! Und zum selber Pixeln sind wir zu dumm! :D
 

vault43

Halbgott
Mitglied seit
24.02.2005
Beiträge
442
Hmjoa, also wie dus jetzt gelöst hast, stelle ich mir das als zwei Eventrechtecke vor, beim Betreten des inneren Rechtecks wird das Monster "aktiviert", beim Betreten des äußeren Rechtecks deaktiviert. Wenn das nur eine Reihe ist, also die Events schalten den Switch bei Berührung jeweils um, könnte es sonst passieren, dass man genau auf das Event tritt und dann umdreht, dass Monster also den Helden bis in alle Ewigkeit verfolgt, es sei denn, er läuft nochmal in das entsprechende Rechteck.

Nachteil:
Selbst wenn die Monsterverfolgung wieder deaktiviert werden kann, geht das nur an konkreten Orten, was nur schwer für jedes Monster glaubhaft darstellbar ist. Ansonsten verfolgt einen das Monster nach Aktivierung immer, bis zum verlassen der Karte (oder länger, falls die Switches dann nich zurückgesetzt werden).


Mein Vorschlag wäre spontan, ein unsichtbares Parallel Process Event in irgendeine Ecke zu setzen, dass ständig die Koordinaten des Helden überprüft und dann mit den Eventkoordinaten der Monster vergleicht. Ist der Abstand (dazu gleich mehr) kleiner oder gleich dem gewünschten Sichtradius des speziellen Monsters, setzt du den Bewegungstyp des Monsterevents auf "Held verfolgen", ist der Abstand größer, setzt du den Bewegungstyp auf "zufällige Bewegung" oder "keine Bewegung" oder was immer zu dem Monster passt.

Wie wählt man jetzt den Abstand am besten? Die einfachste Möglichkeit wäre, sowohl die x-Differenz als auch die y-Differenz müssen für sich kleinergleich einem bestimmten Wert sein, bsw. 5. Damit würde man ein Quadrat der Seitenlänge 11 (5 in jeder Richtung + das Monster in der Mitte) als Sichtfeld festlegen, solange sich der Held darin aufhält, wird die Monsterverfolgung aktiviert, verlässt er es, verfällt das Monster in ein anderes Bewegungsmuster. Das Sichtfeld bewegt sich dadurch, dass es durch die Monsterkoordinaten bestimmt wird, mit dem Monster mit!
Außerdem kann auch das "weitersuchen" für eine gewisse Zeit simuliert werden, auch falls der Held aus dem "Sichtfeld" verschwindet, indem man einfach statt einem "if else" ein "if elseif (else)" verwendet. Bleiben wir beim Sichtfeld von eben, also das Quadrat der Seitenlänge 11. Wir wollen, dass selbst wenn der Held es schafft, das Monster soweit abzuhängen, dass es ihn nicht mehr direkt "sieht" noch kurzzeitig weiterverfolgt, bis es aufgibt, sagen wir in einem Quadrat mit Seitenlänge 21, etwa doppelte Sichtweite.
Also fragen wir zu erst ab "Sind die x- und y-Differenzen jeweils kleiner als 5?" und, ist dies nicht erfüllt, fragen wir "Ist mindestens(wichtig!) eine der Differenzen größer 10?" und packen hier im ja-Fall die Rückänderung des Bewegungsmuster auf zufällig/keine rein. Ein dritter Fall wird nicht benötigt.
So ein Quadrat ist jetzt aber nicht unbedingt schön, stattdessen kann man mit einer Raute ein rundlicheres Sichtfeld simulieren. Dazu fragt man einfach ab, ob die Summe der x- und y-Differenz kleinergleich einem bestimmten Wert ist. Bei 5 würde das Sichtfeld aus der dem Quadrat von oben einbeschriebenen Raute bestehen.

Was braucht man?
2 Variablen für die Heldenkoordinaten
2 Variablen für die Differenzen
je 2 Variablen pro Monster für dessen Koordinaten
optional: 1-2 Variablen pro Gegnertyp (Sichtfeld, Verfolgungsweite)

Beachte dabei, dass man nicht für jede Karte neue Variablen braucht. Sagst du dir also, es gibt auf allen Karten im Spiel maximal 15 bewegliche Feinde, legst du einfach 30 Variablen an, mit Namen wie "Monster1_x", "Monster1_y", "Monster2_x",...
Die kannst du dann auf jeder Karte neu verwenden, das PPE legt ja fest, die Koordinaten wessen Events in die Variablen gespeichert werden.
Die optionalen Variablen sind praktisch, weil ja wahrscheinlich alle Gegner derselben Art denselben Sichtradius haben sollen (bis auf Ausnahmen in gescripteten Szenen o.ä. vielleicht). Stellst du beim Testen fest, dass Sichtfeld oder Verfolgungsweite für eine bestimmte Monsterart doch nicht so toll sind, und hast immer mit den entsprechenden Sichtfeldvariablen verglichen, änderst du einfach den Initialisierungswert dieser beiden Variablen, statt für jedes Monster die Rechnung zu editieren.

Zu beachten ist noch: Beim Vergleichen des Abstandes IMMER vorher den Betrag bilden, entweder über einbinden von RGSS-code ins Event (Befehl is glaube ich *.abs) oder über zusätzliche if-Abfragen "if Variable Abstand_x < 0: Abstand_x * (-1)".
Bei einem rautenförmigen Sichtfeld unbedingt VOR dem aufaddieren der Differenzen den Betrag der Differenzen für sich bilden.


Vorteil:
Entdecken, Verfolgen und Verfolgungsabbruch sind nicht mehr ortsgebunden, außerdem hat man nicht mehr tausende switchaktivier-events auf der Map rumfliegen.


Joa, so müsste das eigentlich funzen (auch wenn ichs nicht garantiere =D), wobei ich mir bei vielen Monstern auf der Map schon Perfomanceeinbrüche vorstellen KÖNNTE (hab das ganze ja nie ausprobiert).
Wenn eventuell ein kleines Aufbaubeispiel eines dieser PPEs gewünscht ist, könnte ich mal versuchen, das hier zu vermitteln, aber eigentlich müsste das auch mit dieser Anleitung schon klappen ^^

Mit Ruby dürfte es schwer werden, da was zu verändern, zumindest als Anfänger. Wenn ich das grad richtig im Kopf habe, müsste man dafür am Map- oder Eventinterpreter rumbasteln, aber da sollte man sich ernsthaft eher nur mit viel Erfahrung ransetzen ;)
 
OP
OP
Finch

Finch

Mächtiger Krieger
Mitglied seit
09.03.2009
Beiträge
107
Das nenn ich mal ne komplexe Antwort! Oo Thx

Das hört sich auch funktionstüchtig an, ich werds am Ende des We´s probieren und dann teil ich euch hier das Ergebnis mit! Mit meiner provisorischen Methode gibts bei mir schon leichte Performance Probs ab spätestens dem10. Gegner auf ner relativ großen Map! Und das ganze soll am Ende ja nich ne Minanforderung von 3,4gh und nen gig ram haben!^^

Und ja, das Problem mit der Gegnerverfolgung ist/war schwer beizukommen und hat rauchende Köpfe erfordert! :D Ich meine mich aber auch an einige Skripte erinnern zu können, mit denen man Npc´s nen Sichtradius verpassen kann....aber ich meine nur solche gesehen zu haben die dem Npc nen kleinen Kegel als radius geben! Das reicht vorne und hinten nich aus...höchstens für solch Schleichmissionen wie in Asgards Schloss (Vampires Dawn 2) falls euch das nen Begriff ist.

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

Edit um nen Doppelpost zu vermeiden:
Gestern kamen wir endlich mal wieder zusammen um mal n bissel weiter zu arbeiten am Projekt! Die Sache mit dem Parallel Process, den Variablen und Koordinaten klappte zwar nach einigen Startschwierigkeiten, die Performance war allerdings auch nicht wirklich besser als bei der Ursprünglichen Methode, es sind einfach zu viele Monster auf großen Karten! Da wir es aber um jeden Preis vermeiden wollen 1000 kleine maps mit 2000 Teleport Events zu haben, benutzen wir nun vorerst erstmal die Encounters mit Average steps unter der jeweiligen Map Einstellung...wir können uns ja nun nicht ewig an dem Problem aufhalten und sonst nicht vorrankommen! ;) Vllt finden wir im laufe der Zeit noch eine Lösung dafür die auf unsere Vorstellungen passt und bauen es später ins Spiel ein, mal schauen!

Alle die das hier mitgelesen haben und die Monster auch visuell darstellen wollen UND kleinere Karten mit weniger Monstern drauf verwenden wollen, können aber gut und gerne zu Vault´s Lösung greifen und sie benutzen! 8-10 Monster lassen sich meiner Erfahrung nach noch ganz gut darstellen, danach sinken die fps drastisch! ;)

An dieser Stelle nochmal ein herzliches Dankeschön von uns an dich Vault und deine Bemühungen! :)

So far
 
Zuletzt bearbeitet:
Oben