Sujet n°14120
Posté par myko le 11 Sep - 19:03 (2014)
Titre : Sprite réflection
Bonjour/Bonsoir ! Gros matou qui ronronne

Bon voilà, je vais directement expliquer ma demande...

Donc j'aimerai savoir si quelqu'un ici serait capable et aurait la gentillesse de pouvoir modifier le script de reflet sur l'eau afin que le chara ne se voit pas sur le bout de terre du tile face au chara (en gros que les pieds du chara ne soit pas reflétés sur la terre, mas que le reflet commence juste sur l'eau) Coupable



Déjà le script, après si une personne accepte, je pourrais lui fournir mon autotile d'eau Gros matou qui ronronne :

Spoiler
Code:

#============================================================================== # ■ Sprite_Reflection   
# Based on Sprite_Mirror, Modified By: JmsPlDnl, rewritten entirely by Rataime   
#==============================================================================   
CATERPILLAR_COMPATIBLE = true   
class Game_Party   
  attr_reader :characters   
end   
class Sprite_Reflection < RPG::Sprite   
 attr_accessor :character   
 def initialize(viewport=nil, character=nil,self_angle = 180)   
   super(viewport)   
   @character = character   
   @self_angle=self_angle   
   self.opacity=0   
   @reflected=false   
   @former=false   
   @moving=false   
   if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)==3   
     @reflected=true   
     @former=true   
   end   
   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   
     if @character.direction== 6   
           sy = ( 4- 2) / 2 * @ch   
     end   
     if @character.direction== 4   
           sy = ( 6- 2) / 2 * @ch   
    end   
    if @character.direction != 4 and @character.direction != 6   
          sy = (@character.direction - 2) / 2 * @ch   
    end   
   end   
     
   self.x = @character.screen_x   
   self.y = @character.screen_y-5   
   @moving=!(@character.real_x%128==0 and @character.real_y%128==0)   
   @d=@character.direction   
   @rect=[sx, sy, @cw, @ch] 
  if !(@moving)   
     if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)==3   
       @reflected=true   
       @former=true   
     else   
       @reflected=false     
       @former=false   
     end   
       
   else   
       case @d   
         
       when 2   
       if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+2)==3   
         @reflected=true   
         if @former==false   
           @offset = (@character.screen_y%32)*@ch/32   
           @rect=[sx, sy, @cw, @offset]     
 self.y=@character.screen_y-5   
 
 
  end
       else   
         @reflected=false     
       end   
         
       when 4   
       if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)!=3   
         @offset = ((@character.screen_x-@cw/2)%32)*@cw/32   
         @rect=[sx, sy, @offset, @ch] 
         self.x=@character.screen_x   
       else   
         @reflected=true   
         if @former==false   
           @offset = ((@character.screen_x-@cw/2)%32)*@cw/32   
           @rect=[sx+@offset, sy, @cw-@offset, @ch] 
           self.x=@character.screen_x-@offset   
         end   
       end   
         
       when 6   
       if $game_map.terrain_tag(@character.real_x/128+1,@character.real_y/128+1)!=3   
         @offset = ((@character.screen_x-@cw/2)%32)*@cw/32   
         @rect=[sx+@offset, sy, @cw-@offset, @ch] 
         self.x=@character.screen_x-@offset   
       else   
         @reflected=true   
         if @former==false   
           @offset = ((@character.screen_x-@cw/2)%32)*@cw/32   
           @rect=[sx, sy, @offset, @ch] 
           self.x=@character.screen_x 
         end   
       end   
         
       when 8   
       if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+2)==3   
         @reflected=true   
         if $game_map.terrain_tag(@character.real_x/128,@character.real_y/128+1)!=3   
           @offset = (@character.screen_y%32)*@ch/32   
           @rect=[sx, sy, @cw, @offset] 
           self.y=@character.screen_y-5   
         end   
       else   
         @reflected=false     
       end   
         
       end   
   end   
   if @reflected   
     self.opacity=128   
   else   
    @rect=[sx, sy, @cw, @ch] 
    self.opacity=0   
   end   
     
   if $game_map.terrain_tag((@character.real_x+64)/128,@character.real_y/128+2)!=3   
     if $game_map.terrain_tag((@character.real_x+64)/128,@character.real_y/128+2)!=3   
       @rect[1]= @rect[1]+@ch/2   
       @rect[3]= @rect[3]/2   
       self.y = self.y - @ch/2   
     else   
       @reflected=false   
     end   
   end   
       
   self.src_rect.set(@rect[0],@rect[1],@rect[2],@rect[3])   
     
   @character.is_a?(Game_Player) ? self.z = 9 : self.z = 5   
   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   
 end   
end   
#===================================================   
# ▼ CLASS Sprite_Character edit   
#===================================================   
class Sprite_Character < RPG::Sprite   
  alias reflect_initialize initialize   
     
  def initialize(viewport, character = nil)   
    @character = character   
    @reflection = [] 
    super(viewport)   
    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["r"])   
     @reflection.push(Sprite_Reflection.new(viewport,@character))   
    end   
    if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["hero_r"])   
     @reflection.push(Sprite_Reflection.new(viewport,$game_player))   
#===================================================   
# ● Compatibility with fukuyama's caterpillar script   
#===================================================   
if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil   
  for member in $game_party.characters   
    @reflection.push(Sprite_Reflection.new(viewport,member))   
  end   
end   
#===================================================   
# ● End of the compatibility   
#===================================================   
    end   
    reflect_initialize(viewport, @character)   
  end   
     
  alias reflect_update update   
     
  def update   
   reflect_update   
   if @reflection!=nil   
     for reflect in @reflection   
       reflect.update   
     end   
   end   
  end   
     
end


En espérant trouver une âme charitable Gros matou qui ronronne

Posté par LockHeart le 13 Sep - 18:05 (2014)
Bonjour
voila je croix que sais sa que tu veux :
Spoiler
./8269.html

Posté par myko le 13 Sep - 18:37 (2014)
Merci de ta réponse mais c'est pas exactement ça que je veux, car celui-ci n'est pas adapté à mon autotile d'eau que j'utilise :/

Posté par Pαlвσlѕку le 13 Sep - 18:41 (2014)
Le script de la page de LockHeart contient des commentaires que j'ai moi-même écrit il y a plusieurs années.
Tu devrais t'en servir pour modifier le script à ta convenance.

Posté par myko le 13 Sep - 23:04 (2014)
Après plusieurs essais différents, soit le reflet ne s'affiche pas, soit rien ne change :/

Posté par Nuri Yuri le 14 Sep - 08:45 (2014)
Faut soit faire du pixel shading (bonne chance) soit utiliser un trick tout con :
-Tu crée les bordures de tes autotiles sans la flotte dans ton tileset.
-Tu les met en priorité de superposition 1.
-Tu paramètre le script pour que le reflet ait les même coordonnées x,y et z que le joueur ou n'importe quel évent MAIS qu'il soit affiché vers le bas (faudra jouer avec les ox/oy, angle, peut être mirror et src_rect si besoins pour mettre des dimensions négatives).

En théorie, si tout est fait correctement : La bordure ayant la propriété d'être affiché en superposition 1 s'affiche au dessus du héros si le héros se trouve à une coordonnée y inférieur ou égale à celle du tile donc le reflet ayant une coordonnée réelle inférieur ou égale à celle du tile (si tu as strictement copié les coordonnées du héros) devrait se trouver sous le tile. Comme la partie terre est opaque, toute la partie du reflet sous la terre est invisible, par contre, la partie eau étant invisible, toute la partie du reflet sur l'eau sera visible ainsi tu auras un reflet correct.

Par contre, faut coder et prévoir la perte de couche de mapping dans les zone de passage entre terre et eau :p