- BencocoMembre
- Nombre de messages : 31
Age : 34
Localisation : Alsace
Distinction : aucune
Date d'inscription : 04/03/2012
Générateur d'ombres
Mar 7 Mai 2013 - 1:43
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 !
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 :
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 :
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 !
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 !
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 !
- Elisa'Staffeux retraité
- Nombre de messages : 2924
Age : 26
Localisation : Par là-bas !
Distinction : Mon héritière que je chéris
[Coco' ]
Plus que 2 ans avant d'épouser Coco' ! Compte à rebours lancé !
[Auto-distinction]
Adepte du "Je le savais" alors qu'elle le savait pas.
Date d'inscription : 30/05/2009
Re: Générateur d'ombres
Mar 7 Mai 2013 - 17:02
+5 points de partage, merci pour le script, il est cool
- HeavenStaffeux retraité
- Nombre de messages : 2441
Age : 23
Localisation : Alpes-Maritimes VIRILITÉ OLALA
Distinction : Aucune
Date d'inscription : 18/10/2012
Re: Générateur d'ombres
Mar 7 Mai 2013 - 20:39
C'est super utile , merci du partage
Heav´n
Heav´n
- fraziel1305Membre
- Nombre de messages : 6
Age : 28
Localisation : Quimper
Distinction : aucune
Date d'inscription : 22/08/2016
Re: Générateur d'ombres
Mar 7 Aoû 2018 - 19:33
j'ai rencontré une erreur ligne 555 create_source à chaque fois que je veux me téléporter sur une autre map. je ne c'est pas comment régler l'erreur. Le script reste super merci pour le poste.
- ZouzakaMembre
- Nombre de messages : 302
Age : 26
Distinction : aucune
Date d'inscription : 25/12/2011
Re: Générateur d'ombres
Sam 18 Aoû 2018 - 19:08
Ce qui est bizarre c'est que je vois qu'il fait appel a la méthode "create_source" alors qu'elle n'existe même pas.
En gros, le script est incomplet.
En gros, le script est incomplet.
- CyrilRPGMembre
- Nombre de messages : 6
Age : 18
Distinction : aucune
Date d'inscription : 03/03/2018
Re: Générateur d'ombres
Mer 5 Sep 2018 - 13:21
Ah ouais, sympa comme script !
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum