Archiv verlassen und diese Seite im Standarddesign anzeigen : Drachenbeschwörung mit 4 Events
Caine Luveno
24.01.2006, 19:40
Folgendes:
Für mein AKS benötige ich einige Beschwörungszauber von Drachen und Elementarwesen.
Problem: Zumindest die Drachen sollten größer sein als der Held. Ich dachte da an 4 Events. Und wenn ich eh schon so viele Events dafür nehme können die Elementare auch dementsprechend groß gemacht werden.
Ich hab ne pixelgenaue Animation hingekriegt das alle 4 Events perfekt aneinander passen. In jede Blickrichtung.
Ebenso war es mir möglich, eine Kollisionsabfrage mit statischen Objekten zu erstellen.
Mein Problem sind Held und Gegner die sich bewegen!
Ich versuche es mal zu verdeutlichen:
xxxx
xxxx
xxxx
xxxx
Nehmen wir mal an jedes x steht für ein freies Feld auf der Karte.
xxxx
ddxx
ddxx
xxxx
Die D-Felder sind die 4 Events des Drachen.
xxgx
ddxx
ddxx
xxxx
das g Feld ist ein Gegner der sich zufällig irgendwie bewegt.
xxqx
dd>x
dd>x
xxxx
Die spitzen Klammern sind die Felder auf die sich der Drache bewegen will also nach rechts.
Als erstes habe ich eine Abfrage ob diese beiden Felder frei sind. Wenn ja, sollen alle 4 Events nach rechts laufen (in diesem Beispiel).
Wie oben gesagt, alles kein Problem ABER:
Während der Bewegungszeit dieser Events, ist es möglich, das sich ein Gegner quasi auf die bereits als frei abgefragten Felder schiebt.
Bedeuted: Die Drachenevents kriegen den Befehl zu marschieren und dann stellt sich hinen unerwarted etwas in den Weg.
Resultat: Die Events verschieben sich weil 2 sich doch nicht bewegen können und der Drache ist hinüber.
Dazu muss ich sagen ich frage das ganze via MapX MapY Koordinaten ab, weil SceneX und SceneY sind zu genau dafür. wenn ich das verwende zerfällt mir mein Drache schon nach einer Bewegung in seine Einzelteile -_-
Hat da jemand ne Lösung parat wie ich das anstellen könnte das diese vier Events auf jeden Fall immer zusammenbleiben?
(Pictures sind keine Alternative da diese sich über allen Layern befinden und es scheiße aussieht wenn der Drache auf einmal über ner Säule die bis zur Decke eines Raumes geht hinwegfliegt -_-)
Mir fallen 2 Lösungen ein:
1. Der Drache reserviert die Felder die er für seine Bewegung braucht für sich. Also werden die Felder für den Gegner geblockt und der Gegner weiß "aha, da darf ich nicht hin". Ich weiß nicht wie das scriptmäßig aussehen würde, aber ungefähr so: Wenn der Drache sich diese 2 Felder als Ziel ausgesucht hat, setzt du 2 unsichtbare Events und lässt deren Koordinaten in Variablen abspeichern. Der Gegner vergleicht die XY-Koordinaten der Felder mit seinen eigenen und wenn er dem "geschützten Bereich" zu Nahe kommt entfernt er sich von diesen. Könnte ziemlich viel Scriptaufwand bedeuten.
2. Den RMXP verwenden, da er eine variable Charsetgröße hat wäre das kein Problem.
Phönix Tear
24.01.2006, 21:56
Erstmal eine Frage vorweg:
Wie viel Zeit vergeht wärend du abfragst ob ein Feld frei ist oder nicht bis das sich das Event bewegt? Außerdem wüsste ich noch gerne wie du abfragst ob ein Feld frei ist. Durch ein Event das du nach vorne schiebst um zu schaun ob es sich bewegen kann oder Terrain ID?
An sich sollte nämlich der obere Gegner geblockt werden. Wenn ich mich nicht irre springt die Kollisionsabfrage deines Events sofort auf das nächste Feld über, sobald die Bewegung beginnt. Das heißt an sich, wenn die Bewegung direkt (also mit der minimal erreichbaren Verzögerung) nach der Abfrage startet, bereits der Drache auf dem Feld ist und somit das andere Event geblockt wird. Ich weiß nicht genau ob es dann zu Sonderfällen kommen kann (ich gehe mal davon aus) wo ein Gegner exakt in dem winzig kleinen Zwischenraum zwischen Abfrage und Bewegung einen Schritt vor den Drachen macht, aber an sich sollte sich die Häufigkeit solcher Fälle dadurch minimieren...
Eine weitere Möglichkeit (die die ich bevorzugen würde ^^) wäre ein nettes "Zermatsch"-Extra für den Drachen. Du setzt deine Drachen Events einfach auf "Start Slip Through", bewegst sie und fragst danach ab ob ein armes anderes Event (also ein Gegner (oder auch Freund)) unter den Füßen des Drachens ist. Wenn ja kannst du dieses Event ja entweder töten (vielleicht etwas zu hart, macht es dann auch zu einfach) oder es Schaden nehmen lassen und via erneuter Kollisionsabfrage an die nächste (und möglichst in der richtigen Richtung liegende) freie Stelle bewegen. Wäre so vielleicht ganz nett ^^.
Ascare's Vorschlag (Nummer 1 ._.) ist sicherlich auch zu gebrauchen. Die Koords in zwei extra Variablen speichern und dann allen anderen, "kleinen" Events sagen, dass sie auf diese Felder in dem Moment wo die Koordinaten größer als 0 sind nicht drauf dürfen (für den Fall das der Drache auch auf die Koords (0|0) kann, solltest du also immer das "größer gleich 0" verwenden und nach der Bewegung des Drachens sowohl X wie auch Y auf -1 stellen. Ich schätze aber mal das die Warscheinlichkeit das der Drache genau auf (0|0) mit einem Gegner kollidiert so gering ist, dass du getrost einfach Fragen kannst ob eine der beiden Variablen größer als 0 ist und dementsprechend dann den Gegner verbieten kannst sich dahin zu bewegen...)
mfg
Phönix Tear
machs doch einfach mit pics...
wenn nicht:
mach ne zusätzliche Fork, die den gegner abfragt, und wenn g=d muss einer ausweichen.
Caine Luveno
25.01.2006, 18:38
Das Drachenscript läuft folgendermaßen:
1. Zufällige Bewegungsrichtung wählen (Random 1-4)
2. Abfrage der Bewegungsrichtungen und je nachdem entsprechende Reaktion, mal ein Beispiel für eine Bewegung nach Oben:
Change Variable: DragonTile1X set DragonUpLeftTile.XCoords;
Change Variable: DragonTile1Y set DragonUpLeftTile.YCoords;
Change Variable: DragonTile2X set DragonUpRightTile.XCoords;
Change Variable: DragonTile2Y set DragonUpRightTile.YCoords;
Teleport Event: DragonTestevent(DragonTile1X, DragonTile1Y);
MoveEvent: DragonTestevent; //step up
Wait 0,0 //move all kann ich nicht nehmen da im schlimmsten falle 9 events zeitgleich unterschiedlich lange bewegungen ausführen und das gesamte ks dann etwas hängt, das Testevent bewegt sich mit einigen MoveSpeedUp Befehlen damits möglichst schnell geht
Change Variable: DragonTestX set DragonTestevent.XCoords;
Change Variable: DragonTestY set DragonTestevent.YCoords;
if (Var: DragonTile1X != VariableDragonTestX) { //!= nicht gleich
ChangeSwitch: Tile1CanMove switch on
}
//und das ganze dann noch einmal für das zweite Tile das gefragt werden muss, sind ja immer nur die ersten beiden welchge direkt in die Bewegungsrichtung gucken, also quasi der Kopf des Drachen. Kann der sich bewegen zieht der rest einfach nur nach
if (Switch: Tile1CanMove = on) {
if (Switch: Tile2CanMove = on) {
MoveEvent: DragonUpLeftTile step up;
MoveEvent: DragonUpRightTile step up;
MoveEvent: DragonDownLeftTile step up;
MoveEvent: DragonDownRightTile step up;
}
}
Wait 1,0sec;
//der letzte Wait gibt quasi ledeglich an wie lange der drache zwischen zwei Schritten wartet. Bei einer Sekunde ist das nen bischen abgehackt, bei 0,5 bis 0,1 schon sehr flüssig. Ich habe jedoch festgestellt das je länger der Drache wartet die Anzahl der "Zerstörungen" des Drachens zurückgeht, wobei man ja meinen sollte das wenn er sich schneller bewegt die anderen Events weniger Chancen haben seine Plätze zu rauben.
zu euren Vorschlägen:
Die Lösung mit dem Reservieren klingt ganz gut. Das mit Events zu machen wäre dumm weil der Drache auf SameLevelAs-Hero steht und um andere Gegner zu blocken diese BlockEvents auch SameLevelAs-Hero haben müssten was dann auch den Drachen blockt. (die BlockEvents dann auch zu bewegegen erzeugt das selbe Problem nur halt dann mit 6 anstatt 4 Events)
Per Koordinaten wäre das was anderes... ich müsste janur vor der Bewegung in ein paar Variablen die Ziel-Koordinaten speichern, und dann im Event der Gegner Bewegung Abfragen, ob in der Richtung in die er marschieren will also Z.b. nach rechts seine X Koordinate+1 und die Y-Koordinate unverändert sich gleicht mit den reservierten Variablen. Bei links wäre das X-1, bei nach oben Y-1 und n<ch unten Y+1. Das ist eigentlich weniger Aufwand und diese Möglichkeit werde ich wohl auch mal ausprobieren. Da gibts dann nur das Problem das ich weder Step-Towards-Hero oder RandomWalk verwenden kann und demnach die gesamte Bewegung, auch für Angriffe, ändern muss.
Der "Zermatsch"-Effekt ist ja sehr witzig, hat aber folgenden Nachteil:
xxxxx
ddgBx
dd>xx
xxxxx
So, Drache will nach rechts, hat mit der Bewegung begonnen, Gegner kommt dazwischen, Gegenr nimmt Schaden und wird zurückgeworfen, bloß, da ist ihm was im weg, nämlich B, Objekt Held oder anderes was den Gegner blockt... nach unten darf er nicht und oben könnte sich ja nach der Gegnerbewegung von G noch ein anderer Gegner breit gemacht haben, also so:
gxgxx
dd>Bx
dd>xx
xxxxx
Ausgansposition nach Test
xgxxx
ddgBx
dd>xx
xxxxx
Gegner kommt dazwischen, kann nicht nach rechts und nach unten und muss nach oben
xxgxx
ddgBx
dd>xx
xxxxx
Aber da steht schon jemand anderes im Weg, kann ja auch der Hero seibnd er grad nen Angriff starten möchte.... und peng das wars mit dem Drachen ^^
Das Szenario kommt öfter vor als man denkt... vorallem wenn man den Drachen als "geleitschutz" verwenden will und sich als Held immer bei ihm aufhält. Resultat durch Step-Toward-Hero kommen alle Geghner in die Nähe des Drachen und das wird bei 8 Gegnern streckenweiße echt eng... vorallem in Wäldern!
Warum Pictures nicht gehen habe ich bereits gesagt. Pictures liegen über allen Layern, Resultat: Bei ner Säule von Boden bis Decke wird es komisch wenn der Drache da auf einmal drüber hinweg fliegt.
Zum RMXP: Hmm.... ich konvertier garantiert kein RM2k Spiel das seit 3 Jahren in Arbeit ist und eine 2,5MB RPG_RT.ldb Datei hat in einen anderen Maker ^^
Und danke für die guten Antworten. Mit dem reservieren könnte es sogar klappen ^^
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.