[VX-Ace] Mein versuch einer HitBox für ein Zelda KS
Da mir das ewige Variablen gestelle zu Zeitaufwendig wurde, fing ich an einfache RGSS Zeilen zu lernen und in den
Eventscriptbefehlen zu nutzen, leider war dies auch noch nicht gut genug, deshalb hab ich nun meinen ersten Prototypen
einer Eventbefehl "Script" Trefferabfragenbox für hunderte Gegner entworfen.
Was haltet ihr davon, wie würded ihr es machen? Eigentlich bin ich ja nur Eventer und kann noch nicht Scripten da ich die Sprachen nicht kann.
Benutzt wird es als Common Event ohne Trigger, das von Geschoss Events bei Bedarf aufgerufen wird. Dabei ist es egal welche Event ID so ein Geschoss hat.
Der Eventbefehl Script ist klasse seit sie mehr Zeilen möglich gemacht haben.
#----------------------------------------------
#Hit_Box Version1.0 16.06.2014 by Bex
#----------------------------------------------
evid_min = 1
evid_max = 10
#----------------------------------------------
until evid_min > evid_max
if $game_map.events[evid_min] != nil
if Math.sqrt(($game_map.events[evid_min].screen_x -
$game_map.events[@event_id].screen_x)**2 + ($game_map.events[evid_min].screen_y -
$game_map.events[@event_id].screen_y)**2) <= 20
if evid_min != @event_id
$game_self_switches[[$game_map.map_id, evid_min, 'A']] = true
end ; end ; end
evid_min += 1
end
angefangen hatte ich mit einen simplen Loop der schaut ob die Events existieren, damit das Spiel nicht abstürzt falls die mal nicht existent sind.
evid_min = 1
evid_max = 10
until evid_min > evid_max
if $game_map.events[evid_min] != nil
$game_message.add("This Event exist")
else
$game_message.add("This Event isnt existing")
end
evid_min += 1
end
_______________________________________________________ ToDo:
+Verschieden grosse Geschosse und Gegner ermöglichen
Ja da hasst du völlig recht. Ich hatte die Kreisform genommen, falls ich später flächenschaden einbauen will,so das der dann rund ist und nicht quadratisch.^^
Mir gefiel halt das das jeweilige Event das das Comon Event aufruft automatisch als Geschoss eingeordnet wird.
Das Script schaut ob eines der Events mit der ID 1 bis z.B 200 von dem aufrufenden Event getroffen wurde.
In der Regel bewegt man sein Event ganz schnell über die Karte und ruft nach jedem Schritt einmal das Common Event auf, das schaut
ob ein Event getroffen wurde, auf dem Map Tile. Nur halt mit Pixelkoordianten, damit die trefferabfrage auch reibungslos funktioniert.
Die Frage ist jedoch was "getroffen" bedeutet.
Wie ist "getroffen" definiert? Über die Größe der verwendeten Character-Grafiken? Über die Tiles auf der Map? Über irgendeine arbiträre Nummer?
Ah ok,
also als getroffen gilt jedes abgefragte Event das sich im Radius von 20Pixeln auf der Pixelkoordinate des sich bewegenden 32x32 Charsets befindet zum Zeitpunkt des aufrufs.
Wenn das Event also nicht NIL ist und es sich im angegebenen Eventradius befindet und es nicht selber das Geschoss ist, dann wird das Event als getroffen makiert
und der Self SwitchA aktiviert vom getroffenen Event.
Sobald das System wächst müssen je nach Aufbau weitere Abfragen und Werte ergänzt werden.
Edit1: Sollte ich z.B charsets grösser als VX standard grösse abfragen wollen, so müsste ich die Trefferbox anpassen.
Edit2: Ja grössere Gegner wären schon cool, werde es wohl nochmal anpassen sobald ich ein Self Variablen Script einfüge.
Das ist schoneinmal ein wenig näher, aber immer noch nicht ganz genau.
Immerhin wird das Geschoss wohl auch eine Größe besitzen; wenn du sagst "innerhalb von 20 Pixeln", dann muss klar sein ob du damit meinst, ob der Mittelpunkt des Geschosses sich nicht mehr als 20 Pixel von einer der Kanten des Ziels befindet, oder ob sich die nächstliegende Kante des Geschosses nicht mehr als 20 Pixel von einer der Kanten des Ziels entfernt ist.
Immerhin sind beide Events ja nicht Punkte sondern Quadrate.
Es werden die Bildmittelpunkte verrechnet und die entfernung zueinander als abstand abgefragt..
Die Gegner haben bei dieser Rechnung nur ihre Bildmitte. Oder du kannst dir aussauchen ob das Geschoss oder das Event eine Kugel mit Radius 20Pixel ist und das andere nur ein Punkt.
Ich glaube ich weiss worauf du hinaus willst, aber dafür kenne ich glaube ich noch nicht die Formel zwei unterschielich grosse rechtecke zu vergleichen.
Das bisherige funktioniert wunderbar für das 32x32 Tilegrid. 2x .abs rechtecke wären gut für XP grösse.
Wie ich nun aber beiden eine grösse gebe und sie vergleiche? Wäre cool wenn du mir die Lösung sagst.
EDIT:
MAP X und Y springen um sobald ein Movecommand gegeben wurde, das heisst die Figur befindet sich optisch auf einem Feld obwohl sie es nichtmehr ist und umgekehrt. Screenvariablen verhindern diesen umstand. Bei sich schnell bewegenden Events immer Screenvariablen nehmen.Ansonsten frustest du deine Spieler mit Bugs.
Bei statischen objekten ruhig map x und y nehmen.
Edit: Kelven hat recht mit der Hitbox. (abstand 20 Pixel klappt am besten) Grössere Gegner die flach und lang oder hoch sind wäre natürlich noch wünschenswerter. Habe ja erst angefangen damit. Mal sehen wie man das System am besten erweitert.
ToDo
+Verschieden grosse Gegner und Geschosse
Das weiss ich nicht ist aber irrelevant, da ein pixel und ein Tile(32Pixel) ja schon ein grösserer unterschied sind.
Auf jedenfall tritt der Bug das ein geschoss durch einen gegner fliegt und nicht trifft nur bei mapkoordianten auf, bei pixelkoordinaten
funktioniert es einwandfrei. (wurde auch schon von anderen mit dem selben ergebniss getestet--Info also bestätigt in vielen Tests^^)
Ich glaube ich muss dem Geschoss und dem Event eine Range geben, wie vergleiche ich die dann aber am besten?
bzw wie macht man das mit den quadraten, erster gedanke klingt noch sehr simpel, aber wie rechnet man das ohne ein Dutzend Conditional branches für die grössen? Weiss das wer von euch? (Keine lust im übertragenen sinne den Pytagoras neu auszurechnen^^)
Es stellt sich natürlich die Frage, ob es auf dem Ace überhaupt einen Unterschied macht, ob man die Event-Koordinaten oder deren Umrechnung in Pixelkoordinaten nimmt. Das hängt maßgeblich davon ab, wie und wann die Pixelkoordinaten bestimmt werden. Auf den alten Makern sollen die Pixelkoordinaten schon nach "halben" Schritten bestimmt werden, d. h. sie sind etwas genauer als die Event-Koordinaten. Aber ist das auf dem Ace genauso?
@Cornix
Ich gehe mal davon aus, dass Bex, so wie es auf den alten Makern üblich war, nur von Events spricht. D. h. Geschosse und Ziele haben alle eine 32x32-Hitbox, sprich das Tile, das sie einnehmen.