Suche RGSS Kenner - Passability Abfragen in Movementskript einbauen!
Hi,
Habe ne Zeit lang ein Skript bzw. einen Skripter gesucht, der mir ein Movementskript erstellen könnte. Genauer gesagt, ich möchte dass die Charaktere nicht 32 pixel weit bei einem schritt laufen sondern 16 pixel.
Ein Pixel Movement Skript ist in meinen Augen 1. sinnfrei und unnötig und 2. zu viel performance fressend.
Ich habe auch glücklicherweise das Skript bekommen. Derula (Techniker von Genocide) hat freundlicherweise sein Movementskript, mit welchem u.a. die bewegungen mit 16 pixel laufen frei zur verfügung gestellt.
Das ist das Skript
Funktioniert auch wunderbar... allerdings ist ein Problem vorhanden. Da man in meinem Fall ja jetzt 16 pixel mit einem schritt macht, kann man quasi auch zwischen 2 events stehen (von der position her). Das sähe so aus:
Wie man vllt. schon ahnen kann, geht es mir genau um so einen Problemfall. Denn momentan ist es so, dass der Held im aufgeführten Beispiel nach unten gehen könnte. Das ist und soll aber nicht möglich sein. Denn, wenn der Held jetzt nach unten geht, steht er zwischen 2 Feldern bei denen keine passability nach links bzw. nach rechts vorhanden ist.
Lösung:
Oben, wenn der Held nach rechts oder links läuft und eben zwischen 2 Feldern steht.
Unten, wenn der Held nach oben oder unten läuft und zwischen 2 Feldern ist.
Beim Roten Punkt sollte keine Bewegung möglich sein, beim Grünen Punkt schon. Das heißt, eine zusätzliche Abfrage bei jeder Richtung, Links und Rechts die selbe Abfrage sowie bei Oben und Unten.
Links und Rechts: Hat oberes Feld eine Begehbarkeit nach unten und unteres Feld eine Begehbarkeit nach oben?
Oben und Unten: Hat linkes Feld eine Begehbarkeit nach rechts und rechtes Feld eine Begehbarkeit nach links?
Ich habe jetzt nur die relevanten Begehbarkeitspfeile reingezeichnet, da es ja sowieso nicht möglich ist, wenn man zwischen zwei Feldern ist, sich z.B. von links nach rechts zu bewegen, wenn eins der 2 Felder keine Begehbarkeit nach links besitzt. Das heißt also auch, dass eben nur die eingezeichneten Pfeile abgefragt werden müssen.
Es wäre wirklich nett, wenn ein fähiger Skripter diese Abfragen in das Skript noch einbauen könnte.
module Genocide_Movement
class :Game_Character
def passable?(x, y, d, s = EVENT_DISTANCE, n = get_new_coordinates(x, y, d, s))
# Get new coordinates
new_x, new_y, dx, dy = *n
# If coordinates are outside of map: impassable
return false unless $game_map.valid?(new_x, new_y)
# If through is ON: passable
return true if @through
# Get move distance
s *= 0.25
# Standfeld berechnen
fx, fy = x.to_field, y.to_field
# Überprüfen, ob neues Feld betreten wird
cx = ((x - fx).abs < s and 0 < dx*(new_x - x))
cy = ((y - fy).abs < s and 0 < dy*(new_y - y))
#if cx and cy
# return false unless $game_map.passable?(fx, fy, d) and $game_map.passable?(fx + dx, fy + dy, 10 - d)
if cx
return false unless $game_map.passable?(fx, fy, 5 + dx) and $game_map.passable?(fx + dx, fy, 5 - dx)
# Wenn y-Koordinate *,5 ist, Feld daneben prüfen
if y != fy
unless $game_map.passable?(fx, fy + (y <=> fy), 5 + dx) and
$game_map.passable?(fx + dx, fy + (y <=> fy), 5 - dx)
return false
end
unless $game_map.passable?(fx + dx, fy + (y <=> fy), 8) and
$game_map.passable?(fx + dx, fy + (y <=> fy), fy + dy, 2)
return false
end
end
end
if cy
return false unless $game_map.passable?(fx, fy, 5 - 3*dy) and $game_map.passable?(fx, fy + dy, 5 + 3*dy)
# Wenn x-Koordinate *,5 ist, Feld daneben prüfen
if x != fx
unless $game_map.passable?(fx + (x <=> fx), fy, 5 - 3*dy) and
$game_map.passable?(fx + (x <=> fx), fy + dy, 5 + 3*dy)
return false
end
unless $game_map.passable?(fx + (x <=> fx), fy + dy, 4) and
$game_map.passable?(fx + (x <=> fx), fy + dy, 6)
return false
end
end
end
# Loop all events
for event in $game_map.events.values
next if event == self or event.through
# If through is OFF and (self is player => partner graphic as character)
# and event coordinates are consistent with move destination
if #not event.through and event.character_name != "" and
(self != $game_player or event.character_name != "") and
(event.x - new_x).abs < 1 and (event.y - new_y).abs < 1
# impassable
return false
end
end
# If self is not player, player through is OFF coordinates are consistent
# with move destination and your own graphic is the character
if self != $game_player and not $game_player.through and
@character_name != "" and ($game_player.x - new_x).abs < 1 and
($game_player.y - new_y).abs < 1
# impassable
return false
end
# passable
return true
end
end
end
diese boolsche algebra ist die hölle ._.
wie immer ein ostereierscript...viel spaß beim eier bugs finden. habs nicht ausreichend getestet.^^
falls du was finden solltest bescheid geben und mir auf die finger haun.
Man, du hättest aber echt mal sagen können, wie mans einbaut lol xD. Ich hab erst probiert und geguckt, ob mans vllt. ins skript selber einfügt und was überschreibt etc. Aber habs jetzt als neues Skript natürlich reingemacht.
Und... FUNKTIONIERT! Geil ^^... Vielen Dank! Ich denke mal, es werden keine Bugs auftreten (hoffentlich). Wenn doch, meld ich mich entsprechend .
Hab beide Skripte kurz angetestet, und durch die 8-Dir Steuerung tauchen immer noch Fehler auf.
Bei PLAYER_DISTANCE = 1 und 2, schiebt sich der Charakter diagonal so ungeschickt in die Kanten, das er dann dort drinnen stecken bleibt (und höchstens mit Maker-Strg rauskommt).
Bei DISTANCE 3, bleibt er nur Teils hängen, geht aber auch diagonal mitten durch den Zaun (und 4 ist ja Standart).
Wenn man die 8-Dir Steuerung jedoch auf False setzt, läuft es auf den ersten Blick einwandfrei (ausser das man recht häufig gegen die Kanten läuft). ^^