Archiv verlassen und diese Seite im Standarddesign anzeigen : Eventgröße auf mehrere Tiles erweitern
Mionmoin.
Da in meinem Spiel einige Charsets vorkommen deren Größe die Eventgröße von einem Tile bei weitem überschreiten (in etwa wie der Oger aus dem RTP) könnte ich ein Skript das den Platz der verbrauchten Tiles erhöht echt gut gebrauchen, damit "on hero touch" an allen Tiles die vom Charset bedeckt werden funktioniert und das Event auch nicht über Kanten hinauslaufen kann bzw. durch zu enge Wege kommt. Man sollte daher die Breite und die Höhe des Events bestimmen können (z.B. duch den Eventnamen oder ein Comment), das Charset sollte auch bei graden Tilesetzahlen noch zentral angezeigt werden und die Koordinatenabfrage müsste irgendwie geregelt sein, bei "Random Movement" müsste das Ganze auch noch irgendwie hinhauen. Besonders klasse wäre es, wenn man das mit dem Helden auch anstellen könnte...
Ich weiß das es viel verlangt ist, aber es wäre einfach nett wenn sich jemand meiner erbarmen könnte und mir das schreiben. Vielleicht gibt es dafür auch schon ein Skript das ich nur übersehen hab... ô__O
Falls sich jemand die Mühe machen sollte mir das zu basteln würde ich natürlich auf Wunsch einen Credits-Eintrag und dazu eine Pixelei, ein Artwork, Facesets oder ähnliches anbieten, das in etwa den Aufwand für mich darstellt den der Skripter mit dem Skript hatte.
mhm
Shining Advances
18.06.2009, 11:47
also mit ungeraden breiten/höhen hab ich grad sowas geschrieben, aber ich versteh nicht ganz was du mit zentral bei den geraden meinst.
dass die event grafik 2 tiles bedeckt und dann die eine hälfte vom char auf dem einen tile steht und die andere auf dem anderen feld?
Jepp, genau das. Ist ne überflüssige Information, die eigendlich nur verwirrt, wenn ichs mir so recht überlege...
der Satz rührt nur daher das ich erst überlegt habe das ganze selber zu lösen indem ich das Event-kopieren-Skript dafür benutze, da hat mich die Frage einfach vor ein Problem gestellt.^^
Shining Advances
18.06.2009, 12:17
class Game_Event
alias size_refresh refresh
attr_reader :size
def refresh
size_refresh
for i in 0...@list.size
if @list[i].code == 108
if @list[i].parameters.to_s.upcase == "SIZE"
@size[0] = @list[i+1].parameters.to_s.to_i
@size[1] = @list[i+2].parameters.to_s.to_i
end
end
end
end
end
class Game_Character
alias size_initialize initialize
def initialize
@size = []
size_initialize
end
def screen_x
if @size[0].nil? or @size[0] % 2 == 1
return (@real_x - $game_map.display_x + 3) / 4 + 16
else
return ((@real_x - $game_map.display_x + 3) / 4 + 16) - @size[0] * 8
end
end
def passable?(x, y, d)
if @size[0].nil?
return size_passable(x,y,d)
else
for i in -(@size[0] / 2)..@size[0] / 2 + @size[0] % 2 - 1
for c in -(@size[1])+1..0
return false unless size_passable(x+i,y+c,d)
end
end
return true
end
end
def size_passable(x,y,d)
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
unless $game_map.valid?(new_x, new_y)
return false
end
if @through
return true
end
unless $game_map.passable?(x, y, d, self)
return false
end
unless $game_map.passable?(new_x, new_y, 10 - d)
return false
end
for event in $game_map.events.values
next if event == self
if event.size[0].nil?
h = hit(event,new_x,new_y)
return h if h == false
else
for i in -(event.size[0] / 2) - event.size[0] % 2 + 1..event.size[0] / 2
for c in -event.size[1]+1..0
h = hit(event,new_x+i,new_y-c)
return h if h == false
end
end
end
end
if $game_player.x == new_x and $game_player.y == new_y
unless $game_player.through
if @character_name != ""
return false
end
end
end
return true
end
def hit(event,new_x,new_y)
if event.x == new_x and event.y == new_y
unless event.through
if self != $game_player
return false
end
if event.character_name != ""
return false
end
end
end
return true
end
end
über main einfügen und beim event ein kommentar einfügen
size
2
1
in diesem fall wäre das event 2 felder breit und 1 feld hoch.
bitte immer beide größenangaben machen und nicht nur die breite angeben!
das ganze muss natürlich nur bei events eingefügt werden, die eine sonder größe haben.
falls es irgendwie probleme damit geben sollte oder was nicht ganz so ist wie erwünscht einfach sagen :)
ääähhh... kann es sein, dass du statt "Kommentar" "Call Script" meinst?:confused:
Hey, das ist echt super, danke!
Was nur noch wirklich klasse wäre, wäre wenn das Urevent von allen belegten Stellen aus ausgelöst werden könnte. Wenn ich beispielsweise den Oger von einer Stelle aus anspreche an der nicht das Ursprungsevent liegt reagiert dieser garnicht. Ansonsten funktioniert das ganze soweit brilliant. :]
ääähhh... kann es sein, dass du statt "Kommentar" "Call Script" meinst?:confused:
Ne. Ist schon so richtig.
Shining Advances
18.06.2009, 20:36
ah stimmt die trigger hab ich vollkommen vergessen -.-
werd mich ransetzen und es gleich hier hinzufügen.
edit
uh damit hat ich grad echt schwierigkeiten. ich hoffe es funzt soweit :/
is bisher nur touch. enter mach ich morgen hab da jetzt keine zeit mehr für.
class Game_Event
def check_event_trigger_touch(x, y)
# If event is running
if $game_system.map_interpreter.running?
return
end
# If trigger is [touch from event] and consistent with player coordinates
min = $game_player.x+ @size[0].to_i%2-1- @size[0].to_i / 2
max = $game_player.x+ @size[0].to_i / 2+ @size[0].to_i % 2-1
if @trigger == 2 and $game_player.x.between?(min,max) and $game_player.y == y
# If starting determinant other than jumping is front event
if not jumping? and not over_trigger?
start
end
end
end
end
class Game_Player
def check_event_trigger_touch(x, y)
result = false
# If event is running
if $game_system.map_interpreter.running?
return result
end
# All event loops
for event in $game_map.events.values
# If event coordinates and triggers are consistent
min = event.x+event.size[0].to_i%2-1-event.size[0].to_i / 2
max = event.x+event.size[0].to_i / 2+event.size[0].to_i % 2-1
ny = y
ny = y + event.size[1]-1 unless event.size[0].nil?
if event.x.between?(min,max) and event.y.between?(y,ny) and [1,2].include?(event.trigger)
# If starting determinant is front event (other than jumping)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
return result
end
end
Hey, coole Sache, danke das du dir so ne Arbeit machst. Es klappt soweit auch größtenteils (hab das neue Skript jetzt einfach unter das alte geschrieben, weils sonst mit ner Fehlermeldung zusammengebrochen ist).
Nur, wenn mehrere Events direkt nebeneinander stehen, werden alle Events ausgeführt die auf "On Touch" stehen, egal welches man davon berührt.
Und ist es Absicht, das sich das Event mit dem Face zur Seite dreht wenn das Feld weiter als 2 Tiles vom Ursprungsevent entfernt ist?
Shining Advances
19.06.2009, 14:49
class Game_Event
def check_event_trigger_touch(x, y)
# If event is running
if $game_system.map_interpreter.running?
return
end
# If trigger is [touch from event] and consistent with player coordinates
min = $game_player.x+ @size[0].to_i%2-1- @size[0].to_i / 2
max = $game_player.x+ @size[0].to_i / 2+ @size[0].to_i % 2-1
ny = y
ny = y - @size[1] + 1 unless @size[0].nil?
if @trigger == 2 and x.between?(min,max) and $game_player.y.between?(ny,y)
# If starting determinant other than jumping is front event
if not jumping? and not over_trigger?
start
end
end
end
end
class Game_Player
def check_event_trigger_touch(x, y)
result = false
# If event is running
if $game_system.map_interpreter.running?
return result
end
# All event loops
for event in $game_map.events.values
# If event coordinates and triggers are consistent
min = event.x+event.size[0].to_i%2-1-event.size[0].to_i / 2
max = event.x+event.size[0].to_i / 2+event.size[0].to_i % 2-1
ny = y
ny = y + event.size[1]-1 unless event.size[0].nil?
if x.between?(min,max) and event.y.between?(y,ny) and [1,2].include?(event.trigger)
# If starting determinant is front event (other than jumping)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
return result
end
#--------------------------------------------------------------------------
# * Front Envent Starting Determinant
#--------------------------------------------------------------------------
def check_event_trigger_there(triggers)
result = false
# If event is running
if $game_system.map_interpreter.running?
return result
end
# Calculate front event coordinates
new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
# All event loops
for event in $game_map.events.values
min = event.x+event.size[0].to_i%2-1-event.size[0].to_i / 2
max = event.x+event.size[0].to_i / 2+event.size[0].to_i % 2-1
ny = new_y
ny = new_y + event.size[1]-1 unless event.size[0].nil?
# If event coordinates and triggers are consistent
if new_x.between?(min,max) and event.y.between?(new_y,ny) and
triggers.include?(event.trigger)
# If starting determinant is front event (other than jumping)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
# If fitting event is not found
if result == false
# If front tile is a counter
if $game_map.counter?(new_x, new_y)
# Calculate 1 tile inside coordinates
new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
# All event loops
for event in $game_map.events.values
min = event.x+event.size[0].to_i%2-1-event.size[0].to_i / 2
max = event.x+event.size[0].to_i / 2+event.size[0].to_i % 2-1
ny = new_y
ny = new_y + event.size[1]-1 unless event.size[0].nil?
# If event coordinates and triggers are consistent
if new_x.between?(min,max) and event.y.between?(new_y,ny) and
triggers.include?(event.trigger)
# If starting determinant is front event (other than jumping)
if not event.jumping? and not event.over_trigger?
event.start
result = true
end
end
end
end
end
return result
end
end
das 2. script damit ersetzen.
die bugs sollten nun weg sein und die anderen trigger werden nun unterstützt.
Okay, ist schon fast perfekt, nur crasht das ganze Teil wenn man "erase Event" aufruft mit der Meldung:
Skript 'GrosseEvents' line 6: NoMethodError accured
undefined method 'size' for nil:NilClass
Und ist es eigendlich kompiziert einzubauen das die Events auch bei der Einstellung "through" noch groß bleiben?
Shining Advances
19.06.2009, 17:09
mach mal nach size_refresh (zeile 5) eine neue zeile und füge dort
return if @list.nil? ein.
das mit through sollte nicht so schwer sein gib mir 10 min :D
class Game_Player
def check_event_trigger_here(triggers)
result = false
# If event is running
if $game_system.map_interpreter.running?
return result
end
# All event loops
for event in $game_map.events.values
# If event coordinates and triggers are consistent
min = event.x+event.size[0].to_i%2-1-event.size[0].to_i / 2
max = event.x+event.size[0].to_i / 2+event.size[0].to_i % 2-1
ny = @y
ny = @y + event.size[1]-1 unless event.size[0].nil?
if @x.between?(min,max) and event.y.between?(@y,ny) and triggers.include?(event.trigger)
# If starting determinant is same position event (other than jumping)
if not event.jumping? and event.over_trigger?
event.start
result = true
end
end
end
return result
end
end
Junge, du bist ein Genie, danke!
Ich hätte das garantiert nicht selber hinbekommen, schon garnicht so gut, echt. Dicken Dank. Klappt jetzt auch alles.
Und das mit dem "trough" ist auch genial, endlich on-touch-events die Cutscenes oder Ähnliches starten nicht mehr tausendfach kopieren zu müssen sondern alles direkt in einem bauen zu können ist sehr angenehm. Hail the Faulness :D
Nja, solltest du interesse an ner grafischen Arbeit haben kannste dich ja melden. Falls du Referenzen willst, in meiner Sig ist ein Link zu meinem DeviantArt-Account.;)
Giantlink
11.07.2009, 15:47
Hey, cooles Script, genau danach habe ich gesucht. Ich hab nur ein kleines Problem (vielleicht habe ich auch was falsch gemacht) und zwar:
Wenn ich das Script so einfüge wie du es gesagt hast, kann ich mit jedem Event nur noch aus zwei Felder "Entfernung" sozusagen interagieren (ohne dass ich ein Comment aufrufe). Dabei sagst du ja, dass man diesen Comment: Size x,y nur bei Events einfügen muss, die breiter sind als normale Events.
Hoffe du verstehst, was ich meine. Wie gesagt, vielleicht mach ich was falsch, wäre aber nett, wenn du mir da helfen könntest. :)
Schonmal Danke im Voraus http://www.multimediaxis.de/images/smilies/old/sm_12.gif
Shining Advances
11.07.2009, 16:23
oh man ich glaub langsam das teil wird niemals perfekt funktionieren -.-
irgendwo müsste @size = [] stehen. ist glaub ich in zeile 21, aber bei den vielen nachträglichen veränderungen bin ich mir nicht sicher wie zuverlässig zeilen angaben noch sind...
wie auch immer...ersetze das durch @size = [1,1]
das sollte den fehler beheben, da es nun jedes event automatisch auf die höhe/breite von 1 setzt. (ka wieso ich das nicht von anfang an drin hatte o_O)
Giantlink
11.07.2009, 16:58
Super, scheint zu klappen. Vielen Dank - werde dich in den Credits berücksichtigen :)
Sollte es noch Probleme geben, werde ich das schreiben.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.