Partagez
Aller en bas
avatar
Bencoco
Membre

Nombre de messages : 31
Age : 27
Localisation : Alsace
Distinction : aucune
Date d'inscription : 04/03/2012

Générateur d'ombres

le 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 :

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 Smile

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 Smile

Bonne continuation !



Dernière édition par Balbereith le Dim 12 Mai 2013 - 17:28, édité 3 fois (Raison : Ajout du choix de l'angle d'éclairage)
avatar
Elisa'
Staffeux retraité

Nombre de messages : 2924
Age : 20
Localisation : Par là-bas !
Distinction : Mon héritière que je chéris
[Coco' Smile]
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

le Mar 7 Mai 2013 - 17:02
+5 points de partage, merci pour le script, il est cool Smile

_________________


Cliquez ici pour voter pour la commu'
avatar
Heaven
Staffeux retraité

Nombre de messages : 2451
Age : 17
Localisation : Alpes-Maritimes VIRILITÉ OLALA
Distinction : Aucune
Date d'inscription : 18/10/2012

Re: Générateur d'ombres

le Mar 7 Mai 2013 - 20:39
C'est super utile , merci du partage Smile


Heav´n
avatar
fraziel1305
Membre

Nombre de messages : 6
Age : 22
Localisation : Quimper
Distinction : aucune
Date d'inscription : 22/08/2016

Re: Générateur d'ombres

le 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. Smile
Contenu sponsorisé

Re: Générateur d'ombres

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum