Zuerst möchte ich klarstellen das nicht ich, sondern im Prinzip der Drake dieses Script gemacht hat. Ein paar Ideen und Veränderungen von KD, Phantom und mir sind ebenfalls mit drin und ich habe das Ganze als einzelnes Script zusammengetragen. RAMart hat zu entscheidenden Verbesserungen beigetragen.
Es gibt auch noch viele Fehler die im Zusammenhang mit Benutzung dieses Scripts auftauchen (Charas werden im Menü, bei Spielständen sowie im Editor nicht ordnungsgemäß angezeigt). Wer Lust hat diese Fehler auszubügeln, darf mich gerne kontaktieren.
Worum geht es eigentlich?
Normalerweise besteht ein XP Chara aus 4 Frames (2 Standposen, 2 Gehposen) sowie hier:
Durch das Script lässt ein Character auf mehr Frames erweitern, sowie dieser hier mit 8 Gehposen:
oder der hier mit 9 Gehposen:
Demo:
Als das Gerücht aufkam, das Charaktere mit mehr als 9 Frames nicht klappen würde, wollte ich es wissen und selbst ausprobieren. Nur sind Charaktere mit vielen Frames schwer zu finden, also habe ich mich an eine 3D Animation mit Tifa, bekannt aus FF7, gemacht. Herausgekommen sind 50 Laufframes + 1 Standframe. Achtung: Aufgrund der Größe des Charakters klappt die Demo möglicherweise bei einigen nicht. Testet selbst, Download hier.
Wer will kann auch mit der Frame Rate rumspielen (Event ganz unten links) und z.B. auf 10 oder 20 setzen, damit ihr seht wie flüssig die Bewegung ist.
Benutzung:
Die Anzahl der Gehposen ist variabel und wird im Dateinamen des Charakters bestimmt.
Einfach zum Dateinamen des Charakters ein f[x] einfügen. Wobei x für die Anzahl der Frames steht (inkl. Standpose).
Beispiele: Hero_f[8].png, Wachef[12]ani2.png, f[6]frau.png. Standard ist 4 und brauch nicht extra genannt zu werden (z.B. für RTP-Charas).
Um das Script zu verwenden: Script Editor öffnen, Rechtsklick auf Main, dann Insert wählen. Dort einen Namen eingeben (z.B. VCF) und im rechten Feld das Script einfach einfügen.
#============================================================================
# ** Variable Character Frames Script (Beta)
#============================================================================
# Idee und Ausführung: Der Drake, KD, Phantom, Ascare.
# Niemand verlangt ein extra Credit dafür, ihr könnt es einfach benutzen.
#
# Benutzung: Einfach zum Dateinamen des Charakters ein f[x] einfügen.
# Wobei x für die Anzahl der Frames steht (inkl. Standpose).
#
# Beispiele: Hero_f[8].png, Wachef[12]ani2.png, f[6]frau.png
# Standard ist 4 und brauch nicht extra genannt zu werden (z.B. für RTP-Charas).
#============================================================================
class Game_Character
#--------------------------------------------------------------------------
# * Get Character Frame
#--------------------------------------------------------------------------
def getCharFrame
self.character_name.sub(/f\[(\d+)\]/) { @CharFrame = $1.to_i }
@CharFrame = 4 if @CharFrame.nil?
return @CharFrame
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
# Branch with jumping, moving, and stopping
if jumping?
update_jump
elsif moving?
update_move
else
update_stop
end
# If animation count exceeds maximum value
# * Maximum value is move speed * 1 taken from basic value 18
if @anime_count > 18 - @move_speed * 2
# If stop animation is OFF when stopping
if not @step_anime and @stop_count > 0
# Return to original pattern
@pattern = @original_pattern
# If stop animation is ON when moving
else
# Update pattern
if @CharFrame == 4
@pattern = (@pattern + 1) % 4
else
@pattern = [((@pattern + 1) % getCharFrame), 1].max
end
end
# Clear animation count
@anime_count = 0
end
# If waiting
if @wait_count > 0
# Reduce wait count
@wait_count -= 1
return
end
# If move route is forced
if @move_route_forcing
# Custom move
move_type_custom
return
end
# When waiting for event execution or locked
if @starting or lock?
# Not moving by self
return
end
# If stop count exceeds a certain value (computed from move frequency)
if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
# Branch by move type
case @move_type
when 1 # Random
move_type_random
when 2 # Approach
move_type_toward_player
when 3 # Custom
move_type_custom
end
end
end
#--------------------------------------------------------------------------
# * Update frame (move)
#--------------------------------------------------------------------------
def update_move
# Convert map coordinates from map move speed into move distance
distance = 2 ** @move_speed
# If logical coordinates are further down than real coordinates
if @y * 128 > @real_y
# Move down
@real_y = [@real_y + distance, @y * 128].min
end
# If logical coordinates are more to the left than real coordinates
if @x * 128 < @real_x
# Move left
@real_x = [@real_x - distance, @x * 128].max
end
# If logical coordinates are more to the right than real coordinates
if @x * 128 > @real_x
# Move right
@real_x = [@real_x + distance, @x * 128].min
end
# If logical coordinates are further up than real coordinates
if @y * 128 < @real_y
# Move up
@real_y = [@real_y - distance, @y * 128].max
end
# If move animation is ON
if @walk_anime
# Increase animation count by 1.5
@anime_count += 1.5*(getCharFrame/4)
# If move animation is OFF, and stop animation is ON
elsif @step_anime
# Increase animation count by 1
@anime_count += 1*(getCharFrame/4)
end
end
#--------------------------------------------------------------------------
# * Frame Update (stop)
#--------------------------------------------------------------------------
def update_stop
# If stop animation is ON
if @step_anime
# Increase animation count by 1
@anime_count += 1*(getCharFrame/4)
# If stop animation is OFF, but current pattern is different from original
elsif @pattern != @original_pattern
# Increase animation count by 1.5
@anime_count += 1.5*(getCharFrame/4)
end
# When waiting for event execution, or not locked
# * If lock deals with event execution coming to a halt
unless @starting or lock?
# Increase stop count by 1
@stop_count += 1
end
end
end
class Sprite_Character < RPG::Sprite
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
super
# If tile ID, file name, or hue are different from current ones
if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_hue != @character.character_hue
# Remember tile ID, file name, and hue
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
# If tile ID value is valid
if @tile_id >= 384
self.bitmap = RPG::Cache.tile($game_map.tileset_name,
@tile_id, @character.character_hue)
self.src_rect.set(0, 0, 32, 32)
self.ox = 16
self.oy = 32
# If tile ID value is invalid
else
self.bitmap = RPG::Cache.character(@character.character_name,
@character.character_hue)
@CharFrame = @character.getCharFrame
@cw = bitmap.width / @CharFrame
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
end
end
# Set visible situation
self.visible = (not @character.transparent)
# If graphic is character
if @tile_id == 0
# Set rectangular transfer
sx = @character.pattern * @cw
sy = (@character.direction - 2) / 2 * @ch
self.src_rect.set(sx, sy, @cw, @ch)
end
# Set sprite coordinates
self.x = @character.screen_x
self.y = @character.screen_y
self.z = @character.screen_z(@ch)
# Set opacity level, blend method, and bush depth
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
# Animation
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
end
end
Funktionsweise:
Der grüne Bereich wird nur angezeigt wenn der Charakter stehen bleibt. Sobald er sich bewegt wird der rote Bereiche durchlaufen. In diesem Fall fängt er bei dem zweiten Frame an und läuft bis zum achten Frame, danach springt er wieder zurück auf den zweiten usw...
Nun, ich hoffe ihr könnt es so gut gebrauchen wie ich.
Geändert von Ascare (16.07.2007 um 10:48 Uhr)
Grund: Update v1.0
Eine Frage: Ist es auch möglich, für verschiedene Richtungen eine verschiedene Anzahl von Frames zu nutzen? (Wenn beispielsweise horizontales Bewegen 6-Frame Grafiken hat, und vertikal 7.)
Wow ein wirklich gutes script sehr nützlich aber ich hab eine Frage kann man sen grünen teil also den teil wo der hero steht auch verfielfalten sodass dem Hero wenn er steht der Wind durch die Haare weht etc.
Super, danke. Sieht wie die Lösung (einiger) meiner Probleme aus.
Nur noch eine dumme Frage: wie genau baue ich das Script ein? Muss ich es in ein neues Script-"Ding" tun, das ich irgendwie benenne, oder in ein vorhandenes Script-"Ding" (wie die Dinger wohl heißen ) dazuschreiben? Ich vermute ersteres?
Ja, neues Script. Sprich: Im Script Editor auf Main klicken, dann rechter Mausklick und Insert wählen. Danach sollte ein leerer Bereich erscheinen, dort einen Namen für das Script eingeben (beliebig) und dann rechts das gepostete Script einfügen. Das war's.
So, nun ist v1.0 erhältlich in der eine Ressourcenoptimierung und Fehlerausbüglung durch RAMart vorgenommen wurde, danke nochmals dafür!
Hinzugekommen ist auch eine krankhafte Scriptdemo mit Tifa.
Sauber, mehr als sauber.
Hab ich schon lange gesucht. VIELEN VIELEN DANK!!
Außerdem kenn ich da jemanden der sich noch mehr über dieses Script freuen
wird als ich.
Ich weis nicht ob du dich damit auskennst, aber wäre es möglich das Script zu erweitern, sodass Pixelmovement möglich ist? Weil dein aktuelles Script verträgt sich nicht mit dem Pixelmovementscript das ich verwende.
Unmöglich wäre es nicht, nur ist das denke ich mal eine Heidenaufwand diese Scripte zusammenzuschmelzen und lauffähig zu bekommen.
Brauchst du denn unbedingt Pixelmovement? Rein optisch sieht ein Char der sich mit mehr Frames bewegt eigentlich schon so aus, als würde er sich pixelweise vorwärts bewegen. Technisch ist das natürlich wieder was anderes.
Also Um das Charakterbild im Menü richtig anzeigen zu lassen,
kann man entweder
def draw_actor graphic (z 108 - 114) in Window_Base
mit demhier ersetzen :