Heaven Chevalier Dragon (niveau 1)
Messages postés : 755 Date d'inscription : 01/04/2013 Jauge LPC :
| Sujet: Générateur d'ombres Mar 14 Mai 2013 - 22:26 | |
| Yo ! Je vous partage unsecond script de Bencoco (avec son autorisation heav'idemment) - Bencoco a écrit:
- Bonsoir bonsoir
Ce soir je vous propose un script que j'ai écrit pour mon projet
L'utilisation est totalement libre (manquerais plus que je me fasse payer pour faire un truc aussi amusant que scripter !!) Mais n'oubliez pas de remercier Bencoco dans vos crédits ! :lotus:
Il permet tout simplement de générer une ombre à partir d'un évènement désigné comme source de lumière et comme une image vaut 1000 mots :
- Spoiler:
Pour l'utiliser rien de plus simple ! il suffit de mettre dans le nom de l'évent #source pour qu'il soit considéré comme source
EDIT : Pour orienter l'ombre il suffit d'ajouter les lettres H, B, G ou D dans le nom Les combinaisons sont possibles : HG GH BD... peu importe l'ordre des lettres bien entendu les combinaisons HB BH GD DG sont inutiles ^^
Ensuite on ne veut pas que tous les évent que l'on utilise aient une ombre comme un objet sur une table ... donc pour qu'un objet ait sa propre ombre il suffit d'ajouter #ombre dans son nom
J'avoue que je n'ai pas testé le script sur d'imenses maps donc je ne sais pas à quelle point il fait lagguer un jeu mais si vous parvenez à trouver les limites du script n'hésitez pas à me le dire ^^
et donc la bête à placer au dessus de main comme toujours :
- Spoiler:
- Code:
-
#============================================================================== # ■ Générateur d'ombres #------------------------------------------------------------------------------ # Script by Bencoco version 1.5 # Insérez #source dans le nom d'un évènement pour qu'il devienne une source # de lumière # # Pour orienter la source insérez H, B, G ou D après le mot source # H pour Haut, B pour Bas... vous avez compris je pense # Les combinaisons sont possibles HG BD... # mais pas HB, BH, GD, DG qui sont inutiles # # Insérez #ombre dans le nom d'un évènement pour qu'il ait sa propre ombre # N'oubliez pas de me citer dans les remerciements #==============================================================================
class Game_Event < Game_Character
attr_accessor :name
alias light_initialize initialize
def initialize(map_id, event) light_initialize(map_id, event) @name = @event.name end end
#============================================================================== # ■ Sprite_Shadow #------------------------------------------------------------------------------ # Sprite servant à afficher les ombres #==============================================================================
class Sprite_Shadow < Sprite_Base #-------------------------------------------------------------------------- # ● Variables publiques d'instance #-------------------------------------------------------------------------- attr_accessor :character #-------------------------------------------------------------------------- # ● Initialisation de l'objet #-------------------------------------------------------------------------- def initialize(viewport, character = nil, id) super(viewport) @character = character @id = id update end
#-------------------------------------------------------------------------- # ● Actualisation #-------------------------------------------------------------------------- def update super
update_bitmap update_src_rect update_position update_other
end #-------------------------------------------------------------------------- # ● Obtient l'image du tileset #-------------------------------------------------------------------------- def tileset_bitmap(tile_id) Cache.tileset($game_map.tileset.tileset_names[5 + tile_id / 256]) end #-------------------------------------------------------------------------- # ● Actualisation de l'image #-------------------------------------------------------------------------- def update_bitmap if graphic_changed? @tile_id = @character.tile_id @character_name = @character.character_name @character_index = @character.character_index if @tile_id > 0 set_tile_bitmap else set_character_bitmap end end end #-------------------------------------------------------------------------- # ● Détermine si le graphique à changé #-------------------------------------------------------------------------- def graphic_changed? @tile_id != @character.tile_id || @character_name != @character.character_name || @character_index != @character.character_index end #-------------------------------------------------------------------------- # ● Définit le bitmap de "Tile" #-------------------------------------------------------------------------- def set_tile_bitmap sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32; sy = @tile_id % 256 / 8 % 16 * 32; self.bitmap = tileset_bitmap(@tile_id) self.src_rect.set(sx, sy, 32, 32) self.ox = 16 self.oy = 32 end
#-------------------------------------------------------------------------- # ● Définit l'image du chara #-------------------------------------------------------------------------- def set_character_bitmap self.bitmap = Cache.character(@character_name) sign = @character_name[/^[\!\$]./] if sign && sign.include?('$') @cw = bitmap.width / 3 @ch = bitmap.height / 4 else @cw = bitmap.width / 12 @ch = bitmap.height / 8 end self.ox = @cw / 2 self.oy = @ch end #-------------------------------------------------------------------------- # ● Découpe la trame de chara #-------------------------------------------------------------------------- def update_src_rect
if @tile_id == 0 index = @character.character_index pattern = @character.pattern < 3 ? @character.pattern : 1 sx = (index % 4 * 3 + pattern) * @cw d1 = self.y - $game_map.events[@id].screen_y+4.to_f
d2 = $game_map.events[@id].screen_x - self.x.to_f if d2 == 0 if d1 > 0 sinus_a = 1 else sinus_a = -1 end else angle_r = (Math::atan((d1) / (d2))) sinus_a = Math::sin(angle_r) end direction_set = @character.direction # Détermine dans quelle direction regarde l'ombre if sinus_a<=0 if d1 <0 if self.angle > 45 case @character.direction when 2 direction_set = 4 when 4 direction_set = 8 when 6 direction_set = 2 when 8 direction_set = 6 end end
else if self.angle > -135 case @character.direction when 2 direction_set = 6 when 4 direction_set = 8 when 6 direction_set = 2 when 8 direction_set = 4 end else case @character.direction when 2 direction_set = 8 when 4 direction_set = 6 when 6 direction_set = 4 when 8 direction_set = 2 end end
end else if d1 <=0 if self.angle < -45 case @character.direction when 2 direction_set = 6 when 4 direction_set = 2 when 6 direction_set = 8 when 8 direction_set = 4 else end end
else if self.angle < 135 case @character.direction when 2 direction_set = 4 when 4 direction_set = 2 when 6 direction_set = 8 when 8 direction_set = 6 end else case @character.direction when 2 direction_set = 8 when 4 direction_set = 6 when 6 direction_set = 4 when 8 direction_set = 2 end end
end end sy = (index / 4 * 4 + (direction_set - 2) / 2) * @ch self.src_rect.set(sx, sy, @cw, @ch) dest_rect = Rect.new(32,32,32,32)
end
end #-------------------------------------------------------------------------- # ● Actualise la position #-------------------------------------------------------------------------- def update_position self.x = @character.screen_x self.y = @character.screen_y self.z = 0 end #-------------------------------------------------------------------------- # ●Actualise tout le reste #-------------------------------------------------------------------------- def update_other
self.blend_type = @character.blend_type self.bush_depth = @character.bush_depth self.tone.set(-255,-255,-255,255)
d1 = self.y - $game_map.events[@id].screen_y+4.to_f
d2 = $game_map.events[@id].screen_x - self.x.to_f
if d2 == 0 if d1 > 0 sinus_a = 1 angle_r = Math::PI/2 else sinus_a = -1 angle_r = -Math::PI/2 end else angle_r = (Math::atan((d1) / (d2))) sinus_a = Math::sin(angle_r) end if $game_map.events[@id].name =~ /H/ if $game_map.events[@id].name =~ /G/ if d1 > 0 and d2 < 0 self.visible = false else self.visible = !@character.transparent end else if $game_map.events[@id].name =~ /D/ if d1 > 0 and d2 > 0 self.visible = false else self.visible = !@character.transparent end else if d1 > 0 self.visible = false else self.visible = !@character.transparent end end end end if $game_map.events[@id].name =~ /B/ if $game_map.events[@id].name =~ /G/ if d1 < 0 and d2 < 0 self.visible = false else self.visible = !@character.transparent end else if $game_map.events[@id].name =~ /D/ if d1 < 0 and d2 > 0 self.visible = false else self.visible = !@character.transparent end else if d1 < 0 self.visible = false else self.visible = !@character.transparent end end end end if $game_map.events[@id].name =~ /G/ if $game_map.events[@id].name =~ /H/ if d1 > 0 and d2 < 0 self.visible = false else self.visible = !@character.transparent end else if $game_map.events[@id].name =~ /B/ if d1 < 0 and d2 < 0 self.visible = false else self.visible = !@character.transparent end else if d2 < 0 self.visible = false else self.visible = !@character.transparent end end end end if $game_map.events[@id].name =~ /D/ if $game_map.events[@id].name =~ /H/ if d1 > 0 and d2 > 0 self.visible = false else self.visible = !@character.transparent end else if $game_map.events[@id].name =~ /B/ if d1 < 0 and d2 > 0 self.visible = false else self.visible = !@character.transparent end else if d2 > 0 self.visible = false else self.visible = !@character.transparent end end end end
hyp = Math::sqrt((d1**2)+(d2**2)) if -hyp + 255 > 0 self.opacity = -hyp + 255 else self.opacity = 0 end
longueur = hyp/100 if longueur <= 0.8 self.zoom_y = 0.8 else self.zoom_y = hyp/100 end
if sinus_a<=0 if d1 < 0 self.angle = (360 * angle_r) / (2*Math::PI) + 90 end if d1 > 0 self.angle = (360 * angle_r) / (2*Math::PI) - 90 end if d1 == 0 if d2 >= 0 self.angle = (360 * angle_r) / (2*Math::PI) + 90 end if d2 <= 0 self.angle = (360 * angle_r) / (2*Math::PI) - 90 end end else if d1 < 0 self.angle = (360 * angle_r) / (2*Math::PI) - 90 end if d1 > 0 self.angle = (360 * angle_r) / (2*Math::PI) + 90 end if d1 == 0 if d2 >= 0 self.angle = (360 * angle_r) / (2*Math::PI) - 90 end if d2 <= 0 self.angle = (360 * angle_r) / (2*Math::PI) + 90 end end end
end
end
#============================================================================== # ■ Spriteset_Map #------------------------------------------------------------------------------ # Génère tout ce qui est visible sur la map #==============================================================================
class Spriteset_Map #-------------------------------------------------------------------------- # ● Initialisation de l'objet #-------------------------------------------------------------------------- alias ini_shadow initialize def initialize $sources = [] ini_shadow end #-------------------------------------------------------------------------- # ● Génère les sprites pour les chara #-------------------------------------------------------------------------- alias create_for_s create_characters def create_characters create_for_s create_characters_shadow end #-------------------------------------------------------------------------- # ● Génère les sprites pour les ombres #-------------------------------------------------------------------------- def create_characters_shadow @character_s_sprites = [] $game_map.events.values.each do |event| $game_map.events.values.each do |event_n| if event_n.name =~ /#source/ if event.name =~ /#ombre/ @character_s_sprites.push(Sprite_Shadow.new(@viewport1, event,event_n.id)) end end end end $game_map.vehicles.each do |vehicle| $game_map.events.values.each do |event_n| if event_n.name =~ /#source/ @character_s_sprites.push(Sprite_Shadow.new(@viewport1, vehicle,event_n.id)) end end end $game_player.followers.reverse_each do |follower| $game_map.events.values.each do |event_n| if event_n.name =~ /#source/ @character_s_sprites.push(Sprite_Shadow.new(@viewport1, follower,event_n.id)) end end end $game_map.events.values.each do |event_n| if event_n.name =~ /#source/ @character_s_sprites.push(Sprite_Shadow.new(@viewport1, $game_player,event_n.id)) end end @map_id = $game_map.map_id end
#-------------------------------------------------------------------------- # ● Libération #--------------------------------------------------------------------------
def dispose dispose_tilemap dispose_parallax dispose_characters dispose_characters_shadow dispose_source dispose_shadow dispose_weather dispose_pictures dispose_timer dispose_viewports end #-------------------------------------------------------------------------- # ● Libération des sprites d'ombres #-------------------------------------------------------------------------- def dispose_characters_shadow @character_s_sprites.each {|sprite| sprite.dispose } end #-------------------------------------------------------------------------- # ● Libération des sources #-------------------------------------------------------------------------- def dispose_source for n in 0..$sources.count $sources.delete_at 0 end end
#-------------------------------------------------------------------------- # ● Rafraichi l'affichage #-------------------------------------------------------------------------- def refresh_characters dispose_characters create_characters refresh_characters_shadow end
#-------------------------------------------------------------------------- # ● Rafraichi les ombres #-------------------------------------------------------------------------- def refresh_characters_shadow dispose_source create_source dispose_characters_shadow create_characters_shadow end
#-------------------------------------------------------------------------- # ● Actualisation #-------------------------------------------------------------------------- def update update_tileset update_tilemap update_parallax update_characters update_characters_shadow update_shadow update_weather update_pictures update_timer update_viewports end
#-------------------------------------------------------------------------- # ● Actualisation des ombres #-------------------------------------------------------------------------- def update_characters_shadow refresh_characters_shadow if @map_id != $game_map.map_id @character_s_sprites.each {|sprite| sprite.update } end #-------------------------------------------------------------------------- # ● Actualisation des sources #-------------------------------------------------------------------------- def update_sources create_source dispose_source end end
Je travail actuellement aussi sur un système de lumières je n'ai pas testé les scripts de lumière présents sur le forum mais je pense pas qu'il y ait d'interférences
Bonne continuation ! Heav'n |
|
Elekami Fondateur
Messages postés : 19071 Date d'inscription : 19/07/2008 Jauge LPC :
| Sujet: Re: Générateur d'ombres Mar 14 Mai 2013 - 22:31 | |
| Merci, je t'enlève des points ! |
|
Heaven Chevalier Dragon (niveau 1)
Messages postés : 755 Date d'inscription : 01/04/2013 Jauge LPC :
| Sujet: Re: Générateur d'ombres Mar 14 Mai 2013 - 22:40 | |
| Merci de m'enlever des points Heav'n |
|
Elekami Fondateur
Messages postés : 19071 Date d'inscription : 19/07/2008 Jauge LPC :
| Sujet: Re: Générateur d'ombres Mar 14 Mai 2013 - 22:42 | |
| De rien, ça me fait plaisir de t'aider à réduire ta jauge ! |
|
Vorselon Chevalier Mage (niveau 3)
Messages postés : 450 Date d'inscription : 27/04/2012 Jauge LPC :
| Sujet: Re: Générateur d'ombres Mar 14 Mai 2013 - 23:05 | |
| Merci du partage un script plutôt sympa. |
|
Zexion Administrateur
Messages postés : 6228 Date d'inscription : 04/01/2012 Jauge LPC :
| Sujet: Re: Générateur d'ombres Mer 15 Mai 2013 - 0:25 | |
| Toujours sympa, mais attention au lag en cas d'abus et aux incohérences avec les ombres des tilesets. |
|
Contenu sponsorisé
| Sujet: Re: Générateur d'ombres | |
| |
|