Sujet n°8825
Posté par Master of Dragons le 29 Déc - 12:28 (2010)
Titre : [Script] Ombre dynamique (complet)
Bon, je sais qu'un script de ce genre a déjà été posté, cependant, j'ai remarqué qu'il posait des problèmes à certains...
Alors j'ai cherché, et quand je cherche, je trouve  Clin d'œil foireux

3 scripts :
           

Donc, pour commencer, remplacez Sprite_Character par :

Sprite_Character
#==============================================================================
# ¦ Sprite_Character modifié (See Sprite_Shadow and Sprite_Sun)
#==============================================================================

class Sprite_Character < RPG::Sprite

attr_accessor :character

def initialize(viewport, character = nil)
super(viewport)
@character = character
#------Sun edit----------
@sunlist=[]
if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["sun"])
if (character.list[1]!=nil and character.list[1].code == 108)
@self_angle=character.list[1].parameters[0]
else
@self_angle=45
end
if (character.list[2]!=nil and character.list[2].code == 108)
@self_opacity=character.list[2].parameters[0]
else
@self_opacity=128
end
for i in $game_map.events.keys.sort
if ($game_map.events.is_a?(Game_Event) and $game_map.events.list!=nil and $game_map.events.list[0].code == 108 and $game_map.events.list[0].parameters == ["o"])
@sunlist = Sprite_Sun.new(viewport, $game_map.events,@self_angle,@self_opacity)
end
end
@sunlist[1] = Sprite_Sun.new(viewport, $game_player,@self_angle,@self_opacity)
end
#------/Sun edit----------
#------Shadows edit---------
@ombrelist=[]
if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])
if (character.list[1]!=nil and character.list[1].code == 108)
@anglemin=character.list[1].parameters[0]
end
if (character.list[2]!=nil and character.list[2].code == 108)
@anglemax=character.list[2].parameters[0]
end
if (character.list[3]!=nil and character.list[3].code == 108)
@distancemax=character.list[3].parameters[0]
end
for i in $game_map.events.keys.sort
if ($game_map.events.is_a?(Game_Event) and $game_map.events.list!=nil and $game_map.events.list[0].code == 108 and $game_map.events.list[0].parameters == ["o"])
@ombrelist = Sprite_Shadow.new(viewport, $game_map.events,self,@anglemin,@anglemax,@distancemax)
end
end
@ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)
end
#------/Shadows edit----------
update
end

def update
super
if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_hue != @character.character_hue
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
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
else
self.bitmap = RPG::Cache.character(@character.character_name,
@character.character_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
end
end
self.visible = (not @character.transparent)
if @tile_id == 0
sx = @character.pattern * @cw
sy = (@character.direction - 2) / 2 * @ch
self.src_rect.set(sx, sy, @cw, @ch)
end
self.x = @character.screen_x
self.y = @character.screen_y
self.z = @character.screen_z(@ch)
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
#------Shadows edit----------
if @ombrelist!=[]
for i in 1..@ombrelist.size
if @ombrelist!=nil
@ombrelist.update
end
end
end
#------/Shadows edit----------
#------Shadows edit----------
if @sunlist!=[]
for i in 1..@sunlist.size
if @sunlist!=nil
@sunlist.update
end
end
end
#------/Shadows edit----------
end
end


Ensuite créez un script Sprite_Shadow ou Sprite_Ombre (comme vous voulez) et placez-le au-dessus de Main :

Sprite_Shadow
#==============================================================================
# ¦ Sprit_Ombre (Sprite_Ombre )
# Based on Genzai Kawakami's shadows, dynamisme by Rataime, extra features Boushy
#==============================================================================

class Sprite_Shadow < RPG::Sprite

attr_accessor :character # ??????

def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)
super(viewport)
@anglemin=anglemin.to_f
@anglemax=anglemax.to_f
@distancemax=distancemax.to_f
@character = character
@source = source
update
end

def update
super

if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_hue != @character.character_hue
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
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
else
self.bitmap = RPG::Cache.character(@character.character_name,
@character.character_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
end
end
self.visible = (not @character.transparent)
if @tile_id == 0
sx = @character.pattern * @cw
@direct=@character.direction

if self.angle>90 or angle<-90

if @direct== 6
sy = ( 4- 2) / 2 * @ch
end
if @direct== 4
sy = ( 6- 2) / 2 * @ch
end
if @direct != 4 and @direct !=6
sy = (@character.direction - 2) / 2 * @ch
end
else
sy = (@character.direction - 2) / 2 * @ch
end
self.src_rect.set(sx, sy, @cw, @ch)
end
self.x = @character.screen_x
self.y = @character.screen_y-5
self.z = @character.screen_z(@ch)-1
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
@deltax=@source.x-self.x
@deltay= @source.y-self.y
self.angle = 57.3*Math.atan2(@deltax, @deltay )
@angle_trigo=self.angle+90
if @angle_trigo<0
@angle_trigo=360+@angle_trigo
end
self.color = Color.new(0, 0, 0)
@distance = ((@deltax ** 2) + (@deltay ** 2))
self.opacity = 1200000/(@distance+6000)
@distance = @distance ** 0.5
if @distancemax !=0 and @distance>=@distancemax
self.opacity=0
end
if @anglemin !=0 or @anglemax !=0
if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax
self.opacity=0
end
if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax
self.opacity=0
end
end
end
end



Enfin, créez un troisième script que vous nommerez Sprite_Sun ou Sprite_Soleil (encore une fois, vous choisissez) au dessus de Main :

Sprite_Sun
#==============================================================================
# ¦ Sprite_Sun
# # Based on Sprite_Shadow, modified by Rataime
#==============================================================================

class Sprite_Sun < RPG::Sprite
attr_accessor :character

def initialize(viewport, character = nil, self_angle = 45,self_opacity = 128)
super(viewport)
@character = character
@self_angle=self_angle
@self_opacity=self_opacity
update
end

def update
super
if @tile_id != @character.tile_id or
@character_name != @character.character_name or
@character_hue != @character.character_hue
@tile_id = @character.tile_id
@character_name = @character.character_name
@character_hue = @character.character_hue
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
else
self.bitmap = RPG::Cache.character(@character.character_name,
@character.character_hue)
@cw = bitmap.width / 4
@ch = bitmap.height / 4
self.ox = @cw / 2
self.oy = @ch
end
end

self.visible = (not @character.transparent)

if @tile_id == 0
sx = @character.pattern * @cw
@direct=@character.direction

if self.angle>90 or angle<-90

if @direct== 6
sy = ( 4- 2) / 2 * @ch#@character.direction
end
if @direct== 4
sy = ( 6- 2) / 2 * @ch
end
if @direct != 4 and @direct !=6
sy = (@character.direction - 2) / 2 * @ch
end
else
sy = (@character.direction - 2) / 2 * @ch
end
self.src_rect.set(sx, sy, @cw, @ch)
end
self.x = @character.screen_x
self.y = @character.screen_y-5
self.z = @character.screen_z(@ch)-1
self.opacity = @character.opacity
self.blend_type = @character.blend_type
self.bush_depth = @character.bush_depth
if @character.animation_id != 0
animation = $data_animations[@character.animation_id]
animation(animation, true)
@character.animation_id = 0
end
self.angle = @self_angle-90
self.color = Color.new(0, 0, 0)
self.opacity = @self_opacity
end
end



Pour le fonctionnement :
           

-Créer une source lumineuse :

La source lumineuse sera un évènement parallèle avec, au début, un commentaire : s

-Créer une ombre pour un évènement (autre que le héros) :

L'évènement devra avoir, au début, le commentaire : o
(Par défaut, la source lumineuse projettera le faisceau lumineux à 360 degrés.)

-Petits effets :

Pour l'imiter la source, ajoutez-y deux autres commentaires avec chacun un chiffre qui définie un angle. C'est l'angle de la lumière projetée. Par exemple une lumière qui donne de la lumière seulement vers la droite et non vers la gauche.
Le premier commentaire sera pour définir l'angle de départ, le second, pour l'angle de fin.

Un quatrième commentaire servira à définir la longueur en pixel pour l'ombre. Ce commentaire comportera un chiffre entre 500 et 1000 (nombre de pixels)


Pour l'extérieur, il suffit de mettre, sur un évènement parallèle, un commentaire : sun. Pour limiter le soleil, vous pouvez définir la puissance de luminosité du soleil avec un commentaire comprenant un nombre entre 30 er 200 pour foncé ou pâle (200, c'est très pâle).


NOTE : Le héros a déjà son ombre.
           



Générique :
Scripts de
Rataime et Genzai Kawakami.



REMARQUES(personnelles ^^) :

Ces scripts sont incompatibles avec le "script de reflet sur l'eau" pour deux bonnes raisons :

-Tout d'abord, l'ombre sera décalée par rapport au reflet (très moche)
-Un évènement (sauf le héros) ne peut avoir ET le commentaire pour le reflet ET le commentaire pour l'ombre.

COMPATIBLE AVEC LES SYSTEMES PSP !
         
  

Voilà ^^
J'ai refait entièrement les explications et corrigé les fautes pour une meilleure compréhension.

Merci de me dire si ça vous a servi (que je sache si je peux en mettre d'autres Clin d'œil foireux )



Posté par Arc-Arceus le 1 Jan - 18:31 (2011)
Oui, je me souviens que D-black en avait posté un qui ne marchait pas terrible avec psp...
Tu l'as essayé et il fonctionne ?

Posté par Master of Dragons le 1 Jan - 19:12 (2011)
Il marche très bien.
Aucun problème, sauf peut-être que j'arrive pas à définir l'angle du soleil, mais le reste, c'est au poil Clin d'œil foireux

Posté par Nabusius le 27 Sep - 18:27 (2012)
Bonjour désoler pour le necro-necro post mais je n'arrive pas a le faire fonctionner :

---------- Erreur de script : Sprite_Character ----------
----- Version du logiciel : PSP DS v0.4
----- Type
NoMethodError

----- Message
- ARGS - []
undefined method `update' for [nil, #<Sprite_Sun:0x827d870>]:Array

----- Position dans Sprite_Character
Ligne 109

----- Backtrace
Script : Sprite_Character | Ligne : 109 | Méthode : in `update'
Script : Sprite_Character | Ligne : 107 | Méthode : in `each'
Script : Sprite_Character | Ligne : 107 | Méthode : in `update'
Script : Sprite_Character | Ligne : 53 | Méthode : in `initialize'
Script : Spriteset_Map | Ligne : 37 | Méthode : in `new'
Script : Spriteset_Map | Ligne : 37 | Méthode : in `initialize'
Script : Spriteset_Map | Ligne : 36 | Méthode : in `each'
Script : Spriteset_Map | Ligne : 36 | Méthode : in `initialize'
Script : Scene_Map | Ligne : 13 | Méthode : in `new'
Script : Scene_Map | Ligne : 13 | Méthode : in `main'
Script : Main | Ligne : 58

Posté par Zohran le 25 Nov - 18:03 (2012)
J'ai exactement le même problème, t'as pas vérifié le script, ça c'est sûr...

Posté par Master of Dragons le 9 Avr - 23:14 (2013)
Après un looong moment d'absence, je reviens sur mes sujets. J'ai réessayé le script, il marche pour moi.

Posté par Pαlвσlѕку le 9 Avr - 23:31 (2013)
En effet ça fait un bon moment.
Re-bienvenue à toi sur le forum. Imbécile heureux

Posté par Master of Dragons le 9 Avr - 23:32 (2013)
Merci ^^ Je reviens avec quelques idées nouvelles en épérant qu'elles marcheront et que je pourrais avoir le temps de les finaliser.