Script couches de brouillard multiple

La création de jeux indépendants/amateurs (tuto, entraide, questions...) sous les moteurs de la série RPG Maker.
startos
Koruldia Master
Messages : 1307
Localisation : PARIS
Contact :

Script couches de brouillard multiple

Message non lu par startos » ven. oct. 24, 2008 8:22 am

Comme vous l'avez remarqués RPGMaker VX n'a plus d'option Fog à la XP...

Le seul inconvénient est qu'un certain nombre de propriétés sont à configurer manuellement, ce qui rend ce script un peu plus difficile à utiliser.

Code à placer dans l'éditeur de script, rubrique Materials. Cliquez droit sur "Insert Here"' et choisissez "insérer"', puis collez le code à gauche.

Ce script à plusieurs fonctions :
- Affiche un ou plusieurs brouillards.
- Possibilité de changer le chemin du dossier dans lequel l'image est stockée (par defaut Graphics/Pictures )
- Réglage de l'opacité, de la tonnalité, de la couleur, de la vitesse et direction de defilement, du grossissement et de la saturation.
- utilisation de brouillard pré-configurés, simplifiant l'intégration à une map.
- 2 commandes d'événement, 'Changer la tonalité' , Changer l'opacité.

Code : Tout sélectionner

#================================================= ==============

# ● [VX] ◦ Multiple Fogs ◦ □

# * Nombre de Couches de brouillard illimité*

#------------------------------------------------- -------------

# ◦ par Woratana [woratana@hotmail.com]

# ◦ Thaiware RPG Maker Community

# ◦ Sorti le: 13/05/2008

# ◦ Version: 1.0

#------------------------------------------------- -------------



#================================================= =================

# ** Utilisation **

# * Utilisez la commande 'Appeler un script' dans un Evenement pour les lignes qui suivent~

#------------------------------------------------- ----------------

#

#------------------------------------------------- --------------

# ** DEFINIR LES PROPRIETES ET L'AFFICHAGE DU BROUILLARD **

# * Vous devez définir les propriétés du brouillard, avant de l'afficher ~

#------------------------------------------------- ------------

# * Vous avez 3 possiblités pour définir les propriétés du brouillard:

# >> Définir le brouillard [Custom]:

# $fog.name = 'image_name' # nom du fichier image, doit etre dans le dossier défini dans ce script (voir plus bas).

# $fog.hue = (entier) # Teinte du brouillard. 0 - 360, 0 innactif.

# $fog.tone = [rouge, vers, bleu, gris] # teinte du brouillard.

# $fog.opacity = (entier) # opacité du brouillard. 0 - 255, brouillard invisible à 0.

# $fog.blend = (0, 1, ou 2) # type de fondu du brouillard. 0. Normal, 1  ajouter, 2 soustraire.

# $fog.zoom = (entier) # dimension du brouillard (en %). 100 pour sa taille normale.

# $fog.sx = (+ ou - entier) # vitesse et direction du brouillard sur l'axe  X.

# $fog.sy = (+ ou - entier) # vitesse et direction du brouillard sur l'axe  Y.

#

# >> Définir le brouillard [avec des PréConfigurations]:

# (Vous pouvez utiliser des brouillards préconfigurés, voir plus bas)

# $fog.load_preset(preset_id)

#

# >> Définir le brouillard [depuis un autre brouillard visible]:

# $fog.load_fog(fog_id)  # ID du brouillard à copier

#

#------------------------------------------------- -------------

# ** AFFICHER LE BROUILLARD **

#------------------------------------------------- ------------

# Apres avoir défini le brouillard, il faut l'afficher en appelant le script:

# $fog.show(fog_id)

#

# Dans le cas ou vous voudriez afficher un nouveau brouillard en remplacement d'un en cours d'utilisation, Appellez ce Script:

# $fog.show(old_fog_id, false)

#

# * fog_id: Numero identifiant lme brouillard.

# (Uniquement des chiffres positifs ou 0)

#

# Apres avoir affiché le brouillard, les propriétés que vous avez défini seront remplacées par celles par defaut.

# (Vous pouvez définir les propriétés par defautdans la partie Brouillard CONFIGURATION PAR DEFAUT plus bas)

#

#------------------------------------------------- -------------

# ** EFFACER UN BROUILLARD **

#------------------------------------------------- ------------

# Vous pouvez éffacer 1 ou plusieurs brouillards en une fois en appelant un script.

# $fog.delete(fog_id, fog_id, fog_id, ...)

#

#------------------------------------------------- --------------

# ** EVENEMENTS DE CONTROLE DU BROUILLARD **

#------------------------------------------------- ------------

# Changer la teinte:

# $game_map.fogtone(fog_id, [rouge, vert, bleu, gris], durée)

# ex. $game_map.fogtone(1, [100,200,-100,0], 10)



# Changer l'Opacité:

# $game_map.fogopac(fog_id, new_opacity, durée)

# ex. $game_map.fogopac(2, 200, 10)

#

#------------------------------------------------- --------------

# ** CONTROLES SUPPLEMENTAIRES **

#------------------------------------------------- ------------

# Changer le dossier des images par defaut:

# $game_map.fog_path = 'image_path'

# ex. $game_map.fog_path = 'Graphics/Pictures/'



# Fonction ON/OFF [Supprime automatiquement tous les brouillards lorsque le joueur est transféré]:

# $game_map.fog_reset = (true / false)

#

#================================================= ==============



#================================================= =================

# START ** MULTIPLE FOG SETUP **

#================================================= =================

class Game_Map

  alias wora_mulfog_gammap_ini initialize

  def initialize

    wora_mulfog_gammap_ini

    

    #================================================= =================

    # ** MULTIPLE FOG SETUP ** Propriétés

    #------------------------------------------------- -------------

    @fog_path = 'Graphics/Pictures/'

    # Dossier par defaut contenant les images des brouillards

    @fog_reset = true # (true or false)

    # Supprime les brouillards lors du tranfert du joueur

    #================================================= =================

    

    @mulfog_name = []

    @mulfog_hue = []

    @mulfog_opacity = []

    @mulfog_blend_type = []

    @mulfog_zoom = []

    @mulfog_sx = []

    @mulfog_sy = []

    @mulfog_ox = []

    @mulfog_oy = []

    @mulfog_tone = []

    @mulfog_tone_target = []

    @mulfog_tone_duration = []

    @mulfog_opacity_duration = []

    @mulfog_opacity_target = []

  end

end

class Wora_Multiple_Fog

  def set_default

    #================================================= =================

    # ** MULTIPLE FOG SETUP ** PROPRIETES PAR DEFAUT

    #------------------------------------------------- -------------

    @name = ''

    @hue = 0

    @opacity = 64

    @blend = 0

    @zoom = 200

    @sx = 0

    @sy = 0

    @tone = [0,0,0,0]

    #================================================= =================

  end

  

  def load_preset(preset_id)

    case preset_id

    #================================================= =================

    # ** MULTIPLE FOG SETUP ** PROPRIETE DES BROUILLARDS PRE-DEFINIS

    #------------------------------------------------- -------------

    when 1 # Preset ID 1

      @name = '001-Fog01'

      @hue = 0

      @tone = [0,0,0,0]

      @opacity = 255

      @blend = 0

      @zoom = 100

      @sx = 0

      @sy = 0

    when 2 # Preset ID 2

      @name = '001-Fog02'

      @hue = 0

      @tone = [0,0,0,0]

      @opacity = 60

      @blend = 1

      @zoom = 100

      @sx = -2

      @sy = -2

    when 3 # Preset ID 2

      @name = '001-Cloud01'

      @hue = 0

      @tone = [0,0,0,0]

      @opacity = 250

      @blend = 0

      @zoom = 100

      @sx = -5

      @sy = -3

    #================================================= =================

    end

  end

#================================================= =================

# END ** MULTIPLE FOG SETUP **

# * Ne rien changer de ce qui suit à moins que vous ne sachiez ce que vous faites.

#================================================= =================



  attr_accessor :name, :hue, :opacity, :blend, :zoom, :sx, :sy, :tone

  def initialize

    set_default

  end

  

  def load_fog(id)

    @name = $game_map.mulfog_name[id].sub($game_map.fog_path, '')

    @hue = $game_map.mulfog_hue[id]

    @opacity = $game_map.mulfog_opacity[id]

    @blend = $game_map.mulfog_blend_type[id]

    @zoom = $game_map.mulfog_zoom[id]

    @sx = $game_map.mulfog_sx[id]

    @sy = $game_map.mulfog_sy[id]

    tn = $game_map.mulfog_tone[id]

    @tone = [tn.red, tn.blue, tn.green, tn.gray]

  end



  def show(id, reset_all = true)

    $game_map.mulfog_name[id] = $game_map.fog_path + @name

    $game_map.mulfog_hue[id] = @hue

    $game_map.mulfog_opacity[id] = @opacity

    $game_map.mulfog_blend_type[id] = @blend

    $game_map.mulfog_zoom[id] = @zoom

    $game_map.mulfog_sx[id] = @sx

    $game_map.mulfog_sy[id] = @sy

    $game_map.mulfog_tone[id] = Tone.new(@tone[0], @tone[1], @tone[2], @tone[3])

    if $game_map.mulfog_ox[id].nil? or reset_all

      $game_map.mulfog_ox[id] = 0

      $game_map.mulfog_oy[id] = 0

      $game_map.mulfog_tone_target[id] = Tone.new(0, 0, 0, 0)

      $game_map.mulfog_tone_duration[id] = 0

      $game_map.mulfog_opacity_duration[id] = 0

      $game_map.mulfog_opacity_target[id] = 0

    end

    set_default

  end

  

  def delete(*args)

    args.each do |id|

      $game_map.mulfog_name[id] = ''

    end

  end

end



class Game_Interpreter

  alias wora_mulfog_interpret_com201 command_201

  #------------------------------------------------- -------------------------

  # * Transfer Player

  #------------------------------------------------- -------------------------

  def command_201

    if $game_map.fog_reset

      if @params[0] == 0; id_map = @params[1]

      else; id_map = $game_variables[@params[1]]

      end

      $game_map.clear_mulfog if id_map != @map_id

    end

    wora_mulfog_interpret_com201

  end

end



class Game_Map

  attr_accessor :mulfog_name, :mulfog_hue, :mulfog_opacity, :mulfog_blend_type,

  :mulfog_zoom, :mulfog_sx, :mulfog_sy, :mulfog_ox, :mulfog_oy, :mulfog_tone,

  :mulfog_tone_target, :mulfog_tone_duration, :mulfog_opacity_duration,

  :mulfog_opacity_target, :fog_reset, :fog_path

  

  alias wora_mulfog_gammap_upd update

  def update

    wora_mulfog_gammap_upd

    @mulfog_name.each_index do |i|

      next if @mulfog_name[i].nil? or @mulfog_name[i] == ''

      # Manage fog scrolling

      @mulfog_ox[i] -= @mulfog_sx[i] / 8.0

      @mulfog_oy[i] -= @mulfog_sy[i] / 8.0

      # Manage change in fog color tone

      if @mulfog_tone_duration[i] >= 1

        d = @mulfog_tone_duration[i]

        target = @mulfog_tone_target[i]

        @mulfog_tone[i].red = (@mulfog_tone[i].red * (d - 1) + target.red) / d

        @mulfog_tone[i].green = (@mulfog_tone[i].green * (d - 1) + target.green) / d

        @mulfog_tone[i].blue = (@mulfog_tone[i].blue * (d - 1) + target.blue) / d

        @mulfog_tone[i].gray = (@mulfog_tone[i].gray * (d - 1) + target.gray) / d

        @mulfog_tone_duration[i] -= 1

      end

      # Manage change in fog opacity level

      if @mulfog_opacity_duration[i] >= 1

        d = @mulfog_opacity_duration[i]

        @mulfog_opacity[i] = (@mulfog_opacity[i] * (d - 1) + @mulfog_opacity_target[i]) / d

        @mulfog_opacity_duration[i] -= 1

      end

    end

  end

  #------------------------------------------------- -------------------------

  # * Start Changing Fog Color Tone

  #------------------------------------------------- -------------------------

  def fogtone(i, tone, duration)

    duration = duration * 2

    tone = Tone.new(tone[0], tone[1], tone[2], tone[3])

    @mulfog_tone_target[i] = tone.clone

    @mulfog_tone_duration[i] = duration

    if @mulfog_tone_duration[i] == 0

      @mulfog_tone[i] = @mulfog_tone_target[i].clone

    end

  end

  #------------------------------------------------- -------------------------

  # * Start Changing Fog Opacity Level

  #------------------------------------------------- -------------------------

  def fogopac(i, opacity, duration)

    duration = duration * 2

    @mulfog_opacity_target[i] = opacity * 1.0

    @mulfog_opacity_duration[i] = duration

    if @mulfog_opacity_duration[i] == 0

      @mulfog_opacity[i] = @mulfog_opacity_target[i]

    end

  end

  

  def clear_mulfog

    @mulfog_name.each_index {|i| @mulfog_name[i] = '' }

  end

end

$worale = {} if !$worale

$worale['MutipleFog'] = true

$fog = Wora_Multiple_Fog.new

class Spriteset_Map

  alias wora_mulfog_sprmap_crepal create_parallax

  alias wora_mulfog_sprmap_updpal update_parallax

  alias wora_mulfog_sprmap_dispal dispose_parallax

  

  def create_parallax

    @mulfog = []

    @mulfog_name = []

    @mulfog_hue = []

    wora_mulfog_sprmap_crepal

  end

  

  def update_parallax

    wora_mulfog_sprmap_updpal

    $game_map.mulfog_name.each_index do |i|

      next if $game_map.mulfog_name[i].nil?

      # If fog is different than current fog

      if @mulfog_name[i] != $game_map.mulfog_name[i] or @mulfog_hue[i] != $game_map.mulfog_hue[i]

        @mulfog_name[i] = $game_map.mulfog_name[i]

        @mulfog_hue[i] = $game_map.mulfog_hue[i]

        if @mulfog[i].nil?

          @mulfog[i] = Plane.new(@viewport1)

          @mulfog[i].z = 3000

        end

        if @mulfog[i].bitmap != nil

          @mulfog[i].bitmap.dispose

          @mulfog[i].bitmap = nil

        end

        if @mulfog_name[i] != ''

          @mulfog[i].bitmap = Cache.load_bitmap('', @mulfog_name[i], @mulfog_hue[i])

        end

        Graphics.frame_reset

      end

      next if @mulfog[i].bitmap.nil?

      # Update fog plane

      @mulfog[i].zoom_x = ($game_map.mulfog_zoom[i] / 100.0) if @mulfog[i].zoom_x != ($game_map.mulfog_zoom[i] / 100.0)

      @mulfog[i].zoom_y = ($game_map.mulfog_zoom[i] / 100.0) if @mulfog[i].zoom_y != ($game_map.mulfog_zoom[i] / 100.0)

      @mulfog[i].opacity = $game_map.mulfog_opacity[i] if @mulfog[i].opacity != $game_map.mulfog_opacity[i]

      @mulfog[i].blend_type = $game_map.mulfog_blend_type[i] if @mulfog[i].blend_type != $game_map.mulfog_blend_type[i]

      @mulfog[i].ox = ($game_map.display_x / 8.0 + $game_map.mulfog_ox[i]) if @mulfog[i].ox != ($game_map.display_x / 8.0 + $game_map.mulfog_ox[i])

      @mulfog[i].oy = ($game_map.display_y / 8.0 + $game_map.mulfog_oy[i]) if @mulfog[i].oy != ($game_map.display_y / 8.0 + $game_map.mulfog_oy[i])

      @mulfog[i].tone = $game_map.mulfog_tone[i] if @mulfog[i].tone != $game_map.mulfog_tone[i]

    end

  end

  

  def dispose_parallax

    @mulfog.each_index do |i|

      next if @mulfog[i].nil?

      @mulfog[i].bitmap.dispose if !@mulfog[i].bitmap.nil?

      @mulfog[i].dispose

    end

    wora_mulfog_sprmap_dispal

  end

end

#================================================= =================

# [END] VX Multiple Fog by Woratana [woratana@hotmail.com]

#================================================= =================
Pour ajouter un brouillard, vous avez 2 solutions :
- soit il faut définir le brouillard via un script.
Image


- soit vous définissez un ou plusieurs brouillards via une préconfiguration.
Image
La préconfiguration est à créer dans le script principal fourni plus haut, à partir de la ligne 134.
Image

Dans les 2 cas, ne pas oublier d'ajouter la commande 'Effacer cet évènement' Pour éviter tout conflit et être sur que cet évenement ne se produira qu'une seule fois en entrant dans cette map.
Vous avez la possiblité d'activer automatiquement l'évenement ou de passer par une condition.
Image

Avatar de l’utilisateur
KaYsEr
KoruTeam
KoruTeam
Messages : 5151
Localisation : Londres
Contact :

Message non lu par KaYsEr » sam. oct. 25, 2008 9:37 am

Hé bien, c'est très complet au moins niveau mode d'emploi.

Je vais l'ouvrir en ruby d'ici peu afin de voir ce que ça peut apporter afin de nous faire gagner du temps.

Ne connaissant pas bien RPGMAKER XP, je ne sais pas vraiment ce qu'implique le FOG dans toutes ses possibilités.
Et, est ce que ce script permet de tout refaire comme XP ? Ou + ? (ou moins -_-)

Concrètement, le fog sous xp, c'était un système de sprite en couche supérieur, qui défile exactement comme on veut, et qui se boucle parfaitement c'est ça ?
(faut donc prévoir le coup et faire une image "bouclable")

Rien de plus ?
Genre quand on scroll ça donne quoi, ça reste fixe et continu son mouvement, ou ça fait comme dans la démo remix et ça s'accelere/ralentis en mode "hors de controle" ?

Car justement tout à l'heure j'ai un peu commencé à y jeter un oeil en mode "image fixe" ou séquence animé, en labo ce sera pour un effet d'atmosphère, donc pas vraiment la même gestion que pour de la brume en extérieur.

J'ai hâte de tester pour voir ce que ça donne, même si c'est moins pratique c'est pas un drame, ya des presets en prime. Cool.


PS : On pourrait donc faire un fog immobile en guise de couche supérieur pour afficher des objets de map ? :love: :hein: :love:
Si toutefois cette méthode n'est pas trop gourmande en CPU.
On peut cumuler des fofog aussi je crois... doit y'avoir un système de couche, en tout cas c'est bien ya les 3 options de fusion et le HUE...
LE truc dommage => Pas de distortions/ondulations... Grrr elle se fait désirer cette fonction, j'ai toujours pas choppé le code ruby pour ça (pourtant RGSS2 le comporte, suffit de voir les fonds de combat VX).
La démo remix en était bourré lol, faut rendre hommage à ça >___<, ce bon vieil effet de chaleur dans la cabane de l'infirmière... :pleure:
Image

startos
Koruldia Master
Messages : 1307
Localisation : PARIS
Contact :

Message non lu par startos » sam. oct. 25, 2008 11:28 am

LE fog est plutôt bien géré sur XP...
Après sur VX, je ne sais pas ce que donne ce script... L'avantage est de cumuler plusieurs fogs... Pour une map fermée, il y a toujours la possibilité de créer un fog fixe et d'en rajouter un autre avec un alpha plus fort avec un très léger défilement... Les deux couches se superposent pour laisser apparaître une sorte de variation statique... (faut faire des essais... Je ne demande qu'à voir ça !!! :love:
Image

Abdc
Koruldia God Warrior
Messages : 970
Localisation : L'atlantide
Contact :

Message non lu par Abdc » mer. mars 25, 2009 10:10 am

j'ai essayé,et ca me fiche ca:
"le fichier Graphic/pictures/001-Cloud01 n'a pas été trouver"

Avatar de l’utilisateur
KaYsEr
KoruTeam
KoruTeam
Messages : 5151
Localisation : Londres
Contact :

Message non lu par KaYsEr » mer. mars 25, 2009 1:28 pm

Bah oui, le système ne trouve pas ton fichier image qui doit servir de fog car t'en a pas créé...

Fait un truc rapide à partir d'un panorama de ciel (dans le dossier panor yena un) et renomme le "001-Cloud01", t'as qu'à écrire une connerie sur l'image au pinceau pour bien savoir que c'est ton truc... Et bien entendu tu le met dans le dossier picture de ton jeu.


Sinon ce script permet de faire mieux que XP en effet, mais avec un peu plus de difficultés... Bien que ce soit vraiment simple, disons niveau "débutant confirmé qui commence à toucher un peu". Son seul point faible est la gestion des couches vis à vis des autres éléments. Mais on va en faire une rétro-ingé pour le refaire en mieux, car c'est assez utile ça.
(on a déjà réussi la même chose en ce qui concerne les multi-panor)
Image