Anstoß für dieses Script gab schmoggi (http://www.multimediaxis.de/threads/...ackel-%28XP%29)
da er auf der Suche nach einem guten Lichteffekte Script für den XP war. Nach einiger Suche habe ich das Script im gezeigten Video gefunden und
erstmal so gut es ging ins Deutsche übersetzt.
Funktion:
Mit dem Script kann man dynamische Lichteffekte mit Bildern erzeugen. Fackeln, Taschenlampen, Kamine, Licht durch Fenster, Strassenlaternen, Aura, Scheinwerfer uvm.
Kurz noch die Erklärung:
Das Script stammt aus der brasilianischen Community, dort gibt es eine Art SDK, nennt sich Legacy Engine.
Als Teil dieser Engine gibt es ein Script für Lichteffekte.
Teil 1 ist die Basis und wird benötigt für alle Unterscripte der Legacy Engine.
Teil 2 ist das eigentliche Script für die Lichteffekte.
#==============================================================================
# Legacy Engine - Lighting
# von Atoa
#==============================================================================
# Updates
# v 1.0 - 09 / 03 / 2012 - Deutsche Übersetzung von Ascare
# v 1.0 - 16 / 07 / 2011 - Script veröffentlicht
#
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Dieses Skript ermöglicht es, verschiedene Lichteffekte auf Maps hinzuzufügen.
# Aber dies funktioniert anders als die meisten anderen Skripte dieser Art.
# In der Regel werden Lichteffekte einfach durch Bilder dargestellt, jedoch
# wird das Licht bei Verdunkelung auch den Lichteffekt beeinflussen,
# da sie nicht auf einer Ebene mit der Schattenebene ist.
# Dieses Skript wirkt sich anders aus, indem Sie die Bilder des Lichteffekts
# auf die gleiche Ebene zeichnet wie die des Schattens. Dadurch bleibt das
# Licht von der Verdunkelung der Map unbeeinflusst und lässt fortgeschrittene
# Lichteffekte zu.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# BILDER FÜR DEN LICHTEFFEKT:
# Die Lichteffekte müssen in den Ordner Graphics/Lights. In der Demo sind
# dort Bilder als Beispiele gespeichert. Diese können auch farblich verändert
# werden um den Lichteffekt zu studieren.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# EINEN LICHTEFFEKT ERSTELLEN
# Zunächst einmal ist es nötig den Schatten als neue Ebene zu kreieren.
# Auf diesem werden dann die Lichter eingefügt.
# Dafür sollte man per Call Script Funktion folgendes aufrufen:
# create_shade(OPAZITÄT, ROT, GRÜN, BLAU, TYP)
# OPAZITÄT : Grad der Opazität des Schatten zwischen 0 und 255. Standard 160.
# ROT : Rotton zwischen 0 und 255. Standard 0.
# GRÜN : Grünton zwischen 0 und 255. Standard 0.
# BLAU : Blauton zwischen 0 und 255. Standard 0.
# TYP : Art des Effekts. 0 = normal, 1 = additiv, 2 = invertiert.
# Standard ist 2 (Farben umgekehrt)
#
# Ist die Schattenebene erstellt, gibt es mehrere Möglichkeiten
# das Licht zu definieren.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# LICHT DURCH KOMMENTARE
# Ein Lichteffekt kann in einem Kommentar eingesetzt werden.
# Diese Lichter sind solange aktiv, wie die Event-Seite, die das Kommentar
# enthält, ebenfalls aktiv ist.
# Als Kommntar geht das wie folgt:
# LIGHT (a) o v s x y z
# a : Name der Bilddatei, in Klammern.
# o : Opazität zwischen 0 und 255.
# v : Grad der Variation der Opazität zwischen 0 und 255.
# s : Geschwindigkeit der Änderung der Opazität zwischen 0 und 255.
# x : Einstellung der Position x
# y : Einstellung der Position y
# z : zoom
# Bsp.:
# LIGHT (licht weiß) 160 0 0 0 5 1
#
# Es gibt auch einige vordefinierte Werte für einen Kommentar.
# SIMPLE LIGHT Opazität
# SIMPLE LAMP Opazität
# SIMPLE TORCH Opazität
# SIMPLE WINDOW A Opazität
# SIMPLE WINDOW B Opazität
# FLASH LIGHT Opazität
# FLASH LAMP Opazität
# FLASH TORCH Opazität
# FLASH WINDOW A Opazität
# FLASH WINDOW B Opazität
# LANTERN Opazität
# Die Opazität ist die Deckkraft des Lichts und kann auch hier ausgelassen
# werden. Der Befehl "SIMPLE" erzeugt ein einfaches Licht, der Befehl
# "FLASH" erzeugt ein pulsierendes Licht. Und LANTERN aktiviert eine Lampe.
# (ein Licht direkt vor dem Charakter).
#
# Bsp.:
# SIMPLE LIGHT
# FLASH TORCH 200
#
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# LICHT PER SCRIPT
# Der Lichteffekt kann auch per Script Befehl aufgerufen werden. Der Effekt ist
# aber nur solange aktiv, bis ein Mapwechsel stattfindet. Auf jeder neuen Map
# muss das Licht durch einen neuen Scriptaufruf erzeugt werden.
#
# Es gibt dafür zwei Scriptbefehle, jeweils für Charaktere und für Events.
# player_light(img, id, index, o, x, y, v, s, z) # Für Charaktere
# event_light(img, id, index, o, x, y, v, s, z) # Für Events
# img : Name der Bilddatei
# id : ID des Lichteffekts um jedes Licht zu identifizieren, modifizieren
# oder zu entfernen. Verschiedene Lichter sollten auch unterschiedliche
# IDs haben.
# index : Dies ist die Index ID und nur nötig, wenn man das Hintereinander-
# Laufen Script der 'Legacy Engine' verwendet. Standardgemäß ist dies 0.
# o : Opazität zwischen 0 und 255.
# x : Einstellung der Position x
# y : Einstellung der Position y
# v : Grad der Variation der Opazität zwischen 0 und 255.
# s : Geschwindigkeit der Änderung der Opazität zwischen 0 und 255.
# z : zoom
# Alle Werte nach index können auch ausgelassen werden.
# Bsp.:
# player_light("Licht", 1, 0, 200)
# event_light("Fackel", 2, 5, 200, 0, 0, 50, 3)
#
# Es ist auch möglich ein Licht nur einem Tile zuzuordnen. Der Befehl dazu:
# map_light(img, id, mx, my, o, x, y, v, s, z)
# img : Name der Bilddatei
# id : ID des Lichteffekts um jedes Licht zu identifizieren, modifizieren
# oder zu entfernen. Verschiedene Lichter sollten auch unterschiedliche
# IDs haben.
# mx : X-Koordinate der Map
# my : Y-Koordinate der Map
# x : Einstellung der Position x
# y : Einstellung der Position y
# v : Grad der Variation der Opazität zwischen 0 und 255.
# s : Geschwindigkeit der Änderung der Opazität zwischen 0 und 255.
# z : zoom
# Alle Werte nach (index?) können auch ausgelassen werden.
# Bsp.:
# map_light("Lampe", 3, 5, 6, 225)
#
# TASCHENLAMPEN sind Lichter die sich automatisch vor dem Spieler/Event bewegen.
# Folgende Befehle sind zum (de)aktivieren der Taschnelampe:
# player_lantern_on(index, opacity) # Taschenlampe für Spieler aktivieren
# event_lantern_on(index, opacity) # Taschenlampe für Event aktivieren
# player_lantern_off(index) # Taschenlampe für Spieler deaktivieren
# event_lantern_off(index) # Taschenlampe für Event deaktivieren
# index : Dies ist die Index ID des Events. Für den Spieler nur nötig, wenn
# man das Hintereinander-Laufen Script der 'Legacy Engine' verwendet.
# Standardgemäß ist dies 0.
# opacity : Opazität zwischen 0 und 255.
#
# Der Lichteffekt kann durch einen einfachen Befehl deaktiviert werden:
# remove_light(id)
# id : Die ID des Lichteffekts der zuvor angegeben wurde.
#
#==============================================================================
$legacy_engine = {} if $legacy_engine.nil?
$legacy_engine["Light Effect"] = true
#==============================================================================
# ** RPG::Cache
#------------------------------------------------------------------------------
# Modul das Bitmaps lädt und speichert
#==============================================================================
module RPG::Cache
#--------------------------------------------------------------------------
# Lädt die Grafiken für den Lichteffekt
# filename : Dateiname
# hue : Information über den Farbton
#--------------------------------------------------------------------------
def self.lights(filename)
self.load_bitmap('Graphics/Lights/', filename)
end
end
#==============================================================================
# ** Sprite_Light
#------------------------------------------------------------------------------
# Klasse, das die Darstellung des Lichts auf dem Sprite verwaltet
#==============================================================================
class Sprite_Light < RPG::Sprite
#--------------------------------------------------------------------------
# Public Variablen
#--------------------------------------------------------------------------
attr_reader :lights
attr_reader :update_tone
#--------------------------------------------------------------------------
# Objekt-Initialisierung
# args : Einstellungswert
#--------------------------------------------------------------------------
def initialize(*args)
args.flatten!
super(args.last)
self.bitmap = Bitmap.new(640, 480)
self.blend_type = args[0]
self.opacity = args[4]
@new_opacity = $game_map.new_opacity.nil? ? args[4] : $game_map.new_opacity
@max_opacity = $game_map.max_opacity.nil? ? args[4] : $game_map.max_opacity
@change_speed = $game_map.change_speed.nil? ? 0 : $game_map.change_speed
self.z = 100
color(args[1], args[2], args[3])
@lights = {}
@update_list = []
end
#--------------------------------------------------------------------------
# Frames updaten
#--------------------------------------------------------------------------
def update
super
self.ox = $game_map.adjust_x($game_map.display_x) / 4
self.oy = $game_map.adjust_y($game_map.display_y) / 4
update_lights
update_opacity
end
#--------------------------------------------------------------------------
# Lichter updaten
#--------------------------------------------------------------------------
def update_lights
map_x = $game_map.adjust_x($game_map.display_x) / 4
map_y = $game_map.adjust_y($game_map.display_y) / 4
rect = Rect.new(map_x, map_y, 640, 480)
self.bitmap.fill_rect(rect, @color)
for light in @lights.values
light.update
next unless on_screen?(light, map_x, map_y)
draw_light(light, light.x, light.y)
end
end
#--------------------------------------------------------------------------
# Definition des Lichts auf der Map
# light : das Licht Sprite
# map_x : X-Position auf der Karte
# map_y : Y-Position auf der Karte
#--------------------------------------------------------------------------
def on_screen?(light, map_x, map_y)
return false unless (light.x.between?(map_x, map_x + 640) or
(light.x + light.width).between?(map_x, map_x + 640))
return false unless (light.y.between?(map_y, map_y + 480) or
(light.y + light.height).between?(map_y, map_y + 480))
return true
end
#--------------------------------------------------------------------------
# Zeichne Licht
# light : das Licht Sprite
# x : x-Position
# y : y-Position
#--------------------------------------------------------------------------
def draw_light(light, x, y)
img = light.bitmap
rect = Rect.new(x, y, light.width, light.height)
self.bitmap.stretch_blt(rect, img, img.rect, light.opacity)
end
#--------------------------------------------------------------------------
# Farben setzen
# red : rot färben
# green : grün färben
# blue : blau färben
#--------------------------------------------------------------------------
def color(red = 0, green = 0, blue = 0)
if self.blend_type == 2
@color = Color.new(255 - red, 255 - green, 255 - blue, 255)
else
@color = Color.new(red, green, blue, 255)
end
end
#--------------------------------------------------------------------------
# Neues Licht kreieren
# value : Einstellung
#--------------------------------------------------------------------------
def create_light(value)
args = value.dup
remove_light(args[0])
@lights[args[0]] = Light_Sprite.new(args)
end
#--------------------------------------------------------------------------
# Licht entfernen
# id : ID des Bildes
#--------------------------------------------------------------------------
def remove_light(id)
return if @lights[id].nil?
@lights.delete(id)
end
#--------------------------------------------------------------------------
# Opazität updaten
#--------------------------------------------------------------------------
def update_opacity
if @max_opacity != self.opacity
if @max_opacity > self.opacity
@new_opacity += @change_speed
self.opacity = [@new_opacity, @max_opacity].min.to_i
elsif @max_opacity < self.opacity
@new_opacity -= @change_speed
self.opacity = [@new_opacity, @max_opacity].max.to_i
end
end
$game_map.shade_opacity = self.opacity
$game_map.new_opacity = @new_opacity
$game_map.max_opacity = @max_opacity
$game_map.change_speed = @change_speed
end
#--------------------------------------------------------------------------
# Transparenz ändern
# args : Einstellung
#--------------------------------------------------------------------------
def opacity_change(*args)
args.flatten!
@max_opacity = args[0]
@new_opacity = self.opacity.to_f
@change_speed = args[1].to_f
end
#--------------------------------------------------------------------------
# Entsorgen
#--------------------------------------------------------------------------
def dispose
super
@lights.values {|light| light.dispose unless light.bitmap.disposed?}
end
end
#==============================================================================
# ** Light_Sprite
#------------------------------------------------------------------------------
# Klasse, die die einzelnen Sprites von jedem Lichtpunkt verwaltet
#==============================================================================
#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
# Diese Klasse verwaltet die Maps. Dies bestimmt das Scrollen und die
# Passierbarkeit. Bezieh dich auf $game_map für die Instanzen dieser Klasse.
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# Public Variablen
#--------------------------------------------------------------------------
attr_accessor :light_effect
attr_accessor :lights
attr_accessor :remove_lights
attr_accessor :shade_opacity
attr_accessor :opacity_change
attr_accessor :max_opacity
attr_accessor :new_opacity
attr_accessor :change_speed
#--------------------------------------------------------------------------
# Einstellung
# map_id : ID der Map
#--------------------------------------------------------------------------
alias setup_lighteffects setup
def setup(map_id)
clear_lights
setup_lighteffects(map_id)
end
#--------------------------------------------------------------------------
# Werte der Lichter zurücksetzen
#--------------------------------------------------------------------------
def clear_lights
@lights = {}
@remove_lights = []
@shade_opacity = 0
@light_effect = nil
@max_opacity = nil
@new_opacity = nil
@change_speed = nil
end
end
#==============================================================================
# ** Game_Character (Teil 1)
#------------------------------------------------------------------------------
# Diese Klasse beschäftigt sich mit den Helden. Dies wird als Superklasse für
# die Klassen Game_Player und Game_Event verwendet.
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# Public Variablen
#--------------------------------------------------------------------------
attr_accessor :lantern
#--------------------------------------------------------------------------
# Objekt-Initialisierung
#--------------------------------------------------------------------------
alias initialize_lighteffects initialize
def initialize
initialize_lighteffects
@lantern = 0
end
#--------------------------------------------------------------------------
# Frames updaten
#--------------------------------------------------------------------------
alias update_lighteffects update
def update
update_lighteffects
dir = $legacy_engine["Rotational Move"] ? @new_direction : @direction
if @lantern != 0 and @lantern_direction != dir
@lantern_direction = dir
id = self.event? ? "EL#{@id}" : "AL#{@id}"
tp = self.event? ? 'event' : 'actor'
case @lantern_direction
when 1
img = 'lantern_downleft'
value = [id, img, {tp => @id}, @lantern, -48, 48, 0, 0, 1.0]
when 2
img = 'lantern_down'
value = [id, img, {tp => @id}, @lantern, 0, 64, 0, 0, 1.0]
when 3
img = 'lantern_downright'
value = [id, img, {tp => @id}, @lantern, 48, 48, 0, 0, 1.0]
when 4
img = 'lantern_left'
value = [id, img, {tp => @id}, @lantern, -64, 0, 0, 0, 1.0]
when 6
img = 'lantern_right'
value = [id, img, {tp => @id}, @lantern, 64, 0, 0, 0, 1.0]
when 7
img = 'lantern_upleft'
value = [id, img, {tp => @id}, @lantern, -48, -48, 0, 0, 1.0]
when 8
img = 'lantern_up'
value = [id, img, {tp => @id}, @lantern, 0, -64, 0, 0, 1.0]
when 9
img = 'lantern_upright'
value = [id, img, {tp => @id}, @lantern, 48, -48, 0, 0, 1.0]
end
$game_map.lights[id] = value
elsif @lantern == 0 and @lantern_direction != nil
id = self.event? ? "EL#{@id}" : "AL#{@id}"
$game_map.remove_lights << id if $game_map.remove_lights != nil
@lantern_direction = nil
end
end
end
#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
# Diese Klasse verwaltet Events. Es steuert die Funktion der Eventseiten, den
# Wechsel, die Bedingungen, sowie parallele Prozesse. Es wird innerhalb der
# Game_Map Klasse verwendet.
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# Entferne den Flag der Initialisierung
#--------------------------------------------------------------------------
alias clear_starting_lighteffects clear_starting
def clear_starting
clear_starting_lighteffects
@lantern = 0
$game_map.remove_lights << "EV#{@id}" if $game_map.remove_lights != nil
refresh_lights unless @page.nil?
end
#--------------------------------------------------------------------------
# Lichter updaten
#--------------------------------------------------------------------------
def refresh_lights
for comment in comments
if comment =~ /SIMPLE[ ]*LIGHT[ ]*(\d+)?/i
set_light("EV#{@id}", "light", $1)
elsif comment =~ /SIMPLE[ ]*LAMP[ ]*(\d+)?/i
set_light("EV#{@id}", "lamp", $1)
elsif comment =~ /SIMPLE[ ]*TORCH[ ]*(\d+)?/i
set_light("EV#{@id}", "torch", $1)
elsif comment =~ /SIMPLE[ ]*WINDOW[ ]*A[ ]*(\d+)?/i
set_light("EV#{@id}", "window", $1)
elsif comment =~ /SIMPLE[ ]*WINDOW[ ]*B[ ]*(\d+)?/i
set_light("EV#{@id}", "window", $1, 0, 0, 0, -14)
elsif comment =~ /FLASH[ ]*LIGHT[ ]*(\d+)?[ ]*(\d+)?[ ]*(\d+)?/i
set_light("EV#{@id}", "light", $1, $2, $3)
elsif comment =~ /FLASH[ ]*LAMP[ ]*(\d+)?[ ]*(\d+)?[ ]*(\d+)?/i
set_light("EV#{@id}", "lamp", $1, $2, $3)
elsif comment =~ /FLASH[ ]*TORCH[ ]*(\d+)?[ ]*(\d+)?[ ]*(\d+)?/i
set_light("EV#{@id}", "torch", $1, $2, $3, 0, 0, 2.0)
elsif comment =~ /FLASH[ ]*WINDOW[ ]*A[ ]*(\d+)?[ ]*(\d+)?[ ]*(\d+)?/i
set_light("EV#{@id}", "window", $1, $2, $3)
elsif comment =~ /FLASH[ ]*WINDOW[ ]*B[ ]*(\d+)?[ ]*(\d+)?[ ]*(\d+)?/i
set_light("EV#{@id}", "window", $1, $2, $3, 0, -14)
elsif comment =~ /LIGHT[ ]\((\w+)\)((?:[ ]*(?:[\+\-]?\d+))*)/i
v = []
name = $1.dup
$2.scan(/\d+/).each {|i| v << i}
set_light("EV#{@id}", name, v[0], v[1], v[1], v[3], v[4], v[5])
elsif comment =~ /LANTERN[ ]*(\d+)?/i
@lantern = ($1.nil? ? 255 : $1.to_i)
end
end
end
#--------------------------------------------------------------------------
# Lichter definieren
# id : ID des Lichts
# name : Name der Bilddatei
# op : Opazität
# vr : Grad der Variation
# sp : Geschwindigkeit der Variation
# x : Einstellung der Position x
# y : Einstellung der Position y
# zm : zoom
#--------------------------------------------------------------------------
def set_light(id, name, op, vr = 0, sp = 0, x = 0, y = 0, zm = 1.0)
op = op.nil? ? 255 : op.to_i
vr = vr.nil? ? 50 : vr.to_i
sp = sp.nil? ? 2 : sp.to_i
x = x.nil? ? 0 : x.to_i
y = y.nil? ? 0 : x.to_i
zm = zm.nil? ? 1.0 : zm.to_f
value = [id, name, {'event' => @id}, op, x, y, vr, sp, zm]
$game_map.lights[id] = value
$game_map.remove_lights.delete(id)
end
end
#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
# Zu dieser Klasse gehören alle Sprites auf dem Bildschirm, Tilesets, Helden, etc.
# Diese Klasse ist in der Klasse Scene_Map enthalten.
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# Public Variablen
#--------------------------------------------------------------------------
attr_reader :light_effects
#--------------------------------------------------------------------------
# Objekt-Initialisierung
#--------------------------------------------------------------------------
alias initialize_lighteffects initialize
def initialize
initialize_lighteffects
update_light
end
#--------------------------------------------------------------------------
# Frames updaten
#--------------------------------------------------------------------------
alias update_lighteffects update
def update
update_lighteffects
update_light
end
#--------------------------------------------------------------------------
# Entsorgen
#--------------------------------------------------------------------------
alias dispose_lighteffects dispose
def dispose
dispose_lighteffects
dispose_light unless $scene.is_a?(Scene_Map)
end
#--------------------------------------------------------------------------
# Lichter updaten
#--------------------------------------------------------------------------
def update_light
update_shade
update_effects
update_shade_opacity
end
#--------------------------------------------------------------------------
# Lichteffekt entfernen
#--------------------------------------------------------------------------
def dispose_light
if @light_effect != nil
@light_effect.dispose
@light_effect = nil
@light_values = nil
end
end
#--------------------------------------------------------------------------
# Schatten updaten
#--------------------------------------------------------------------------
def update_shade
if $game_map.light_effect != nil and (@light_effect.nil? or
$game_map.light_effect != @light_values)
@light_effect.dispose if @light_effect != nil
@light_values = $game_map.light_effect
@light_effect = Sprite_Light.new(@light_values, @viewport2)
$game_map.event_list.each {|ev| ev.refresh_lights}
elsif $game_map.light_effect != nil and @light_effect != nil
@light_effect.update
elsif $game_map.light_effect.nil? and @light_effect != nil
dispose_lights
end
end
#--------------------------------------------------------------------------
# Lichteffekte updaten
#--------------------------------------------------------------------------
def update_effects
return if @light_effect.nil? or $game_map.lights.empty?
for key in $game_map.lights.keys
if $game_map.remove_lights.include?(key)
@light_effect.remove_light(key)
$game_map.lights.delete(key)
next
end
next if @light_effect.lights[key] != nil and
@light_effect.lights[key].values == $game_map.lights[key]
@light_effect.create_light($game_map.lights[key])
end
$game_map.remove_lights.clear
end
#--------------------------------------------------------------------------
# Opazität des Schattens updaten
#--------------------------------------------------------------------------
def update_shade_opacity
if $game_map.opacity_change != nil
@light_effect.opacity_change($game_map.opacity_change)
$game_map.opacity_change = nil
end
end
end
#==============================================================================
# ** Interpreter
#------------------------------------------------------------------------------
# Es ist die Klasse, die die Befehle der In-Game Events interpretiert.
# Es wird innerhalb der Klasse Game_Event und Game_System verwendet.
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# Schatten kreieren
# op : Opazität
# red : Rot färben
# green : Grün färben
# blue : Blau färben
# type : Art des Effekts
#--------------------------------------------------------------------------
def create_shade(op = 160, red = 0, green = 0, blue = 0, type = 2)
$game_map.light_effect = [type, red, green, blue, op, true]
end
#--------------------------------------------------------------------------
# Opazität des Schattens ändern
# op : Neuer Wert für die Opazität
# speed : Geschwindigkeit der Änderung
#--------------------------------------------------------------------------
def change_opacity(op = 160, speed = 1)
return if $game_map.light_effect.nil?
$game_map.opacity_change = [op, speed]
end
#--------------------------------------------------------------------------
# Licht kreieren für den Spieler
# img : Name der Bilddatei
# id : ID des Lichteffekts
# index : Index
# op : Opazität
# x : Einstellung der Position x
# y : Einstellung der Position y
# var : Variation des Lichts
# speed : Geschwindigkeit der Änderung des Lichts
# zoom : zoom des Lichteffektes
#--------------------------------------------------------------------------
def player_light(img, id, index = 0, op = 160, x = 0, y = 0,
var = 0, speed = 0, zoom = 1.0)
actor = ($legacy_engine["Caterpillar"] and index > 0) ?
$game_player.actors[index - 1] : $game_player
return if actor.nil?
actor = {'actor' => index}
$game_map.lights[id] = [id, img, actor, op, x, y, var, speed, zoom]
end
#--------------------------------------------------------------------------
# Licht kreieren für ein Event
# img : Name der Bilddatei
# id : ID des Lichteffekts
# index : ID des Events
# op : Opazität
# x : Einstellung der Position x
# y : Einstellung der Position y
# var : Variation des Lichts
# speed : Geschwindigkeit der Änderung des Lichts
# zoom : zoom des Lichteffektes
#--------------------------------------------------------------------------
def event_light(img, id, index = 0, op = 160, x = 0, y = 0,
var = 0, speed = 0, zoom = 1.0)
return if $game_map.events[index].nil?
event = {'event' => index}
$game_map.lights[id] = [id, img, event, op, x, y, var, speed, zoom]
end
#--------------------------------------------------------------------------
# Licht kreieren auf der Map
# img : Name der Bilddatei
# id : ID des Lichteffekts
# mx : x-Koordinate des Tiles, die Licht erhält
# my : y-Koordinate des Tiles, die Licht erhält
# op : Opazität
# x : Einstellung der Position x
# y : Einstellung der Position y
# var : Variation des Lichts
# speed : Geschwindigkeit der Änderung des Lichts
# zoom : zoom des Lichteffektes
#--------------------------------------------------------------------------
def map_light(img, id, mx = 0, my = 0, op = 160, x = 0, y = 0,
var = 0, speed = 0, zoom = 1.0)
pos = {:x => mx, :y => my}
$game_map.lights[id] = [id, img, pos, op, x, y, var, speed, zoom]
end
#--------------------------------------------------------------------------
# Lichter entfernen
# id : ID des Lichteffektes
#--------------------------------------------------------------------------
def remove_light(id)
$game_map.remove_lights << id if $game_map.remove_lights != nil
end
#--------------------------------------------------------------------------
# Opazität des Schattens ändern
#--------------------------------------------------------------------------
def shade_opacity
return $game_map.shade_opacity
end
#--------------------------------------------------------------------------
# Taschenlampe des Spielers aktivieren
# index : Index
# opacity : Opazität
#--------------------------------------------------------------------------
def player_lantern_on(index = 0, opacity = 255)
actor = ($legacy_engine["Caterpillar"] and index > 0) ?
$game_player.actors[index - 1] : $game_player
return if actor.nil?
actor.lantern = opacity
end
#--------------------------------------------------------------------------
# Taschenlampe des Spielers deaktivieren
# index : Index
#--------------------------------------------------------------------------
def player_lantern_off(index = 0)
actor = ($legacy_engine["Caterpillar"] and index > 0) ?
$game_player.actors[index - 1] : $game_player
return if actor.nil?
actor.lantern = 0
end
#--------------------------------------------------------------------------
# Taschenlampe des Events aktivieren
# index : Index
# opacity : Opazität
#--------------------------------------------------------------------------
def event_lantern_on(index = 0, opacity = 255)
return if $game_map.events[index].nil?
$game_map.events[index].lantern = opacity
end
#--------------------------------------------------------------------------
# Taschenlampe des Events deaktivieren
# index : Index
#--------------------------------------------------------------------------
def event_lantern_off(index = 0)
return if $game_map.events[index].nil?
$game_map.events[index].lantern = 0
end
end
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# Diese Klasse verarbeitet die Maps.
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
# Public Variablen
#--------------------------------------------------------------------------
attr_reader :spriteset
#--------------------------------------------------------------------------
# Teleport
#--------------------------------------------------------------------------
alias transfer_player_lighteffects transfer_player
def transfer_player
@spriteset.dispose_light
$game_map.clear_lights
transfer_player_lighteffects
end
end
Wichtig: Die Demo damit ihr das Ganze mal in Aktion sehen könnt. Download
Screen:
PS: Würde mich freuen wenn ihr eure Erfahrungen mit dem Script hier teilt. Auch bin ich noch nicht hinter jede Funktion durchgestiegen. Was ist zB der Unterschied zwischen Simple Window A und B?
PPS: Opazität steht übrigens für Deckkraft.
Dann mal viel Spaß mit der Benutzung, ich zumindest kann's SEHR gut gebrauchen.
Lustig... dabei kenn ich das Santuario RPG Maker Forum ^^. Diese Legacy Engine ist wirklich ne feine Arbeit, für diejenigen die bestimmte Sachen wie Catepillar oder Springe etc. eben sowas suchen ist das eine Überlegung aufjedenfall wert.
Muss nur allerdings darauf hinweisen, dass es unter CC License steht und soweit ich gelesen habe sollte das Skript bzw. dieses ganze Legacy Paket nirgends anders vorgestellt werden als auf santuario. Ich hoffe, du hast den Ersteller dies bzgl. gefragt!
Habe mir die Demo und das Skript angeschaut, ist aufjedenfall mächtig das Ding. Im Grunde genau das was ich gesucht habe, super! Es läuft schnell, ohne lag (bei ca. 100 events getestet, was sowieso kaum der realität entsprechen dürfte).
Mir fehlt allerdings leider eine Fade in/out Funktion für die Lichter! Es ist zwar mit Umwegen möglich sowas nachzubauen (schleife, variablen hochzählene etc.) ist aber wie gesagt umständlich. Für die Schatten Ebene gibt eine entsprechende Funktion (die leider in der Anleitung nicht beschrieben ist) und da die Lichter selber ja auch das flackern Feature besitzen, müsste eine Fade in/out Funktion leicht machbar sein. Wäre echt cool, wenn da jmd. was bauen könnte.
Allerdings gibt es auch ein etwas größeres Problem, was aber zu beheben ist! Pictures, Wetter Effekte, Fogs etc. werden auch unterhalb der Schatten Ebene angezeigt, sowie auch unter den Lichtern.
Um das zu beheben, muss man im Basis Skript ganz unten im Abschnitt Spriteset_Map die jeweiligen Viewports der Funktionen (Fog, Weather, Pictures) ändern. Wenn man den Viewport auf 3 stellt, werden die Sachen wieder ganz normal über der Schatten Ebene angezeigt.
Bin auch auf Cornix seine Arbeit gespannt und was das Skript so für Funktionen bietet. Vllt. kann man ja die besten Dinge miteinander kombinieren und ein super Skript daraus basteln .
Ich habe mir nun die Zeit genommen mich durch das Script zu lesen. Der Script-Stil ist nicht sonderlich freundlich wenn man das sagen darf und erschwert das Verständnis zunehmend.
Von der Idee her arbeitet das Script beinahe so wie meine Idee es vorsah. Nur an einer kritischen Stelle wurde eine andere Lösung genommen.
Nämlich das updaten der Lichteffekte.
Das Script arbeitet nämlich tatsächlich so, dass es jedes Frame jeden einzelnen Lichteffekt welcher auf der Karte gerade sichtbar ist komplett neu zeichnet genauso wie die Hintergrunddunkelheit.
Ich jedoch wollte nur diejenigen Lichteffekte neuzeichnen lassen welche sich mit einer sich bewegenden Lichtquelle überschneiden und auch nur in den dafür notwendigen Punkten.
Tatsächlich kann man nicht sagen ob die eine oder andere Variante besser ist, da es hier auf die Situation ankommt.
Um das zu erläutern:
1). Gibt es garkeine sich bewegenden Lichtquellen in dem Spiel ist meine Variante leichtverständlich besser, dann wird nämlich bei einem Update überhaupt garnichts gemacht werden müssen.
2). Gibt es nur bewegliche Lichtquellen so müssten in beiden fällen sowieso alle Lichtquellen neu gezeichnet werden, meine Variante würde allerdings zusätzlichen Overhead für, in diesem Fall nutzlose, berechnungen produzieren und deshalb schlechter ausfallen.
3). Gibt es wenige bewegliche Lichtquellen und einige verstreute einzelne unbewegliche Lichtquellen auf der Karte, wie es der Standard sein sollte, dann sollte theoretisch meine Variante besser abschneiden, da nur das nötigste in den nötigen Fällen neugezeichnet werden würde und nicht alles.
4). Gibt es eine bewegliche Lichtquelle die plötzlich auf sehr viele dicht beieinanderstehende unbewegliche Lichtquellen trifft so wird meine Variante wahrscheinlich ebenfalls schlechter abschneiden als die andere aus dem gleichen Grund wie im Punkt 2).
5). Außerdem ist ein unterschied, dass diese Methode die hier gezeigt wird einen konstanten Performance-Verbrauch besitzt während meine Variante nur arbeitet wenn etwas passiert. Das heist, stehen alle beweglichen Lichtquellen gerade still so wird auch wirklich nichts gemacht, stehen im Moment alle Lichtquellen so weit von einander entfernt dass sie sich nicht überschneiden muss ebenfalls nichts, beziehungsweise nur wenig, gemacht werden.
Ich denke wirklich, dass man vielleicht versuchen sollte beides einzubauen und nach Bedarf zu wechseln.
Nachdem ich mich heute nocheinmal an das Script gesetzt habe konnte ich auch den letzten Bug aus dem Algorithmus entfernen und es funktioniert nun, allerdings noch nicht in einer Form wie man es dem Standardbenutzer vorwerfen könnte.
Ich denke ich werde eine Testumgebung in naher Zukunft veröffentlichen können.