fantasy island


 
AccueilPortailFAQRechercherS'enregistrerMembresGroupesConnexion

Partagez | 
 

 faire son effet météo

Aller en bas 
AuteurMessage
darksonic872
the master
avatar

Nombre de messages : 53
Date d'inscription : 07/09/2006

MessageSujet: faire son effet météo   Lun 2 Oct - 7:05

A mettre au dessus de main et à appeller "météo" :

Code:
#==================================================
# Script créé par Corbaque
#--------------------------------------------------
# Nouveaux types d'effets météo
#--------------------------------------------------
# Pour lancer un effet, inserez un script en
# mettant :
# fonction(puissance de l'effet, temps de transtion)
# par exemple :
# acid(14, 26)
#==================================================
# ceci est un module intégré, il est donc modifié
module RPG
# ce script est aussi intégré
class Weather
# à l'initialisation
def initialize(viewport = nil)
# définition de variable
@type = 0
@max = 0
@ox = 0
@oy = 0
color1 = Color.new(255, 255, 255, 255)
color2 = Color.new(255, 255, 255, 128)
color3 = Color.new(0, 200, 0, 255)
color4 = Color.new(250, 0, 250, 128)
# définition des bitmaps des effets météo
# pluie
@rain_bitmap = Bitmap.new(7, 56)
for i in 0..6
@rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
end
# tempète
@storm_bitmap = Bitmap.new(34, 64)
for i in 0..31
@storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
@storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
@storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
end
# acide (ajouté)
@acid_bitmap = Bitmap.new(34, 64)
for i in 0..31
@acid_bitmap.fill_rect(33-i, i*2, 1, 2, color3)
@acid_bitmap.fill_rect(32-i, i*2, 1, 2, color4)
@acid_bitmap.fill_rect(31-i, i*2, 1, 2, color3)
end
# tempète de neige - modèle -
@pics = Bitmap.new(64, 64) # définition de la taille du bitmap
# boucle avec variable (i ici, qui auguemente de 1 à chaque fois que la boucle recommence)
for i in 0..31
# affichage de différents éléments (ici fill)
# décodage :
# variable.fill_rect(x, y, arrêt x, eppaisseur, couleur)
@pics.fill_rect(1, 1, 6, 4, color1)
@pics.fill_rect(1, 0, 4, 6, color1)
@pics.fill_rect(2, 2, 4, 2, color1)
@pics.fill_rect(2, 1, 2, 4, color1)
end
# neige
@snow_bitmap = Bitmap.new(6, 6)
@snow_bitmap.fill_rect(0, 1, 6, 4, color2)
@snow_bitmap.fill_rect(1, 0, 4, 6, color2)
@snow_bitmap.fill_rect(1, 2, 4, 2, color1)
@snow_bitmap.fill_rect(2, 1, 2, 4, color1)
# sprites utilisés
@sprites = []
for i in 1..40
sprite = Sprite.new(viewport)
sprite.z = 1000
sprite.visible = false
sprite.opacity = 0
@sprites.push(sprite)
end
# fin de la fonction
end
# fonction dispose
def dispose
# supression des sprites
for sprite in @sprites
sprite.dispose
end
# suppression des bitaps
@pics.dispose
@acid_bitmap.dispose
@rain_bitmap.dispose
@storm_bitmap.dispose
@snow_bitmap.dispose
end
# définition de la fonction
def type=(type)
# revenir si le type reste inchangé
return if @type == type
# définitionn de la météo
@type = type
# dans la variable type de météo
case @type
# quand 1 => bitmap pluie
when 1
bitmap = @rain_bitmap
# quand 2 => bitmap tempête
when 2
bitmap = @storm_bitmap
# quand 3 => bitmap neige
when 3
bitmap = @snow_bitmap
# quand 4 => bitmap acide
when 4
bitmap = @acid_bitmap
# quand 5 => bitmap pics - modèle -
when 5 # type correspondant à l'effet
# définition de la variable bitmap
bitmap = @pics
# sinon bitmap est indéfini
else
bitmap = nil
end
# définitions des sprites celon le bitmap
for i in 1..40
sprite = @sprites[i]
if sprite != nil
sprite.visible = (i <= @max)
sprite.bitmap = bitmap
end
end
# fin de la fonction
end
# fonction ox et oy, pour le mouvement
def ox=(ox)
return if @ox == ox;
@ox = ox
for sprite in @sprites
sprite.ox = @ox
end
end
def oy=(oy)
return if @oy == oy;
@oy = oy
for sprite in @sprites
sprite.oy = @oy
end
end
# définition de la fonction max (puissance de l'effet)
def max=(max)
return if @max == max;
@max = [[max, 0].max, 40].min
for i in 1..40
sprite = @sprites[i]
if sprite != nil
sprite.visible = (i <= @max)
end
end
end
# définition de la fonction update
def update
return if @type == 0
for i in 1..@max
sprite = @sprites[i]
if sprite == nil
break
end
if @type == 1
sprite.x -= 2
sprite.y += 16
sprite.opacity -= 8
end
if @type == 2
sprite.x -= 8
sprite.y += 16
sprite.opacity -= 12
end
if @type == 3
sprite.x -= 2
sprite.y += 8
sprite.opacity -= 8
end
if @type == 4
sprite.x -= 8
sprite.y += 16
sprite.opacity -= 12
end
# -modèle-
if @type == 5 # si le typecorrespond à l'effet
# modification des position x et y, ici en cercle
sprite.x += 10 * Math.cos(i * 3.14 / 10)
sprite.y += 10 * Math.sin(i * 3.14 / 10)
# baisse l'opacitée
sprite.opacity -= 6
end
# définition des variables x et y
x = sprite.x - @ox
y = sprite.y - @oy
# affichage des sprites aléatoirement
if sprite.opacity < 64 or x < -50 or x > 750 or y < -300 or y > 500
sprite.x = rand(800) - 50 + @ox
sprite.y = rand(800) - 200 + @oy
sprite.opacity = 255
end
end
end
attr_reader :type
attr_reader :max
attr_reader :ox
attr_reader :oy
# fin du script
end
# fin du module
end
# fonction de lancement de l'effet météo "acide"
def acid(power, duration)
$game_screen.weather(4, power, duration)
end
# fonction de lancement de l'effet météo "pics" -modèle-
def pics(power, duration)
$game_screen.weather(5, power, duration)
end
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://fantasy-island.bb-fr.com
darksonic872
the master
avatar

Nombre de messages : 53
Date d'inscription : 07/09/2006

MessageSujet: Re: faire son effet météo   Lun 2 Oct - 7:05

les deux météos créées sont pluie acide et tempête de neige,
à appeler resppectivement (insertion de script) :
acid(puissance, transition)
et
pics(puissance, transition)

Faire son propre effet météo

Un tutoriel créé par Corbaque

Comment faire un effet météo ?
C'est ce que je vais vous expliquer dans ce tutoriel.
Tout d'abord observont un effet météo :
Il y a un motif qui est répété, une boule blanche par exmple, pour simplifier
La chose au lieu d'être bourin (faire les motifs un par un) nous allons en faire un pour tous !
Ce motif est appelé "Sprite" il est utiliser pour différentes choses, mais ici nous allons simplement
Faire une petite image, car, étant donné que le calcule dois être rapide et efficace,
Il se dois une optimisation maximale,
C'est à dire pas un sprite de 500 pixel sur 500 pixel pour un motif de 3 pixel sur 3 pixel.
Mais maintenant comment dessine t'on le motif lui même ?
Tout d'avord il faut définire la taille du bitmap -la taille du motif- en évitant de trop grande valeur pour les raisons ci-dessus.
Nous avons donc besoin d'une variable, qui ici sera nommée "test",
Elle seras utilisée dans plusieurs méthode (def) mais seulement cette classe, conclusion nous utilisons le type @nom,
Soit dans notre cas "@test" par la suite nous la rendons égale à un bitmap, les valeurs entre parenthèse sont
Respectivement la largeure et la hauteure, ici 64 sur 64, soit :

Code:
@test = Bitmap.new(64, 64)Nous avons donc notre zone de travaille, il nous faut donc la remplir !
Nous avons plusieurs possibilités :
Un texte :

Code:
@test.draw_text(x, y, largeur, hauteur, "texte")Un pixel :

Code:
@test.set_pixel(x, y, couleur)Un rectangle (plusieurs pixels)

Code:
@test.fill_rect(x, y, largeur, hauteur, couleur)Maintenant on la définie comment la couleur ?
Il faut simplement appeller la classe Color, avec les bons parramètres, soit :

Code:
Color.new(rouge, vert, bleu, opacitée)Pour un texte il faut définir la couleur du bitmap directement soit :

Code:
@test.color = Color.new(rouge, vert, bleu, opacitée)Mais aussi la police :

Code:
@test.font.name = "Arial"Ainsi que la taille de la police :

Code:
@test.font.size = 50Bon un petit exemple ?
Notre météo "test" sera une pluie de "c" violet, voici donc nos quelques lignes :

Code:
@test = Bitmap.new(64, 64)
@test.color = Color.new(200, 0, 200, 255)
@test.font.name = "Arial"
@test.font.size = 50
@test.draw_text(4, 4, 64, 64, "c")Maintenant il faut le mettre ou notre définition ?
Simplement dans la méthode initialize, avec les autres.
Comment éviter que les motifs restent à l'écran sans bouger quand je change d'effet météo ?
Simplement en appellant la fonction dispose de notre variable, soit :
@test.dispose
Je le met où ?
Avec les autres !
En effet ils sont tous regroupés à la fin de la méthode initialize,
Pour retrouver rapidement lancer une recherche via ctrl + F avec "dispose"

Mais s'il y a plusieurs effets météos, comment le script fais pour pas se mélanger les pinceaux ?
En faite lorsque nous appellons un effet météo nous ajoutons un argument (un nombre ici) qui défini
L'effet en question. Dans cette méthodes sont définis les 40 sprites de l'effet météo, qui auront le bitmap
De tel ou tel variable, celon l'argument. Pour être plus clair regardons cette partie de la méthode :
Definition de la méthode, avec entre parenthèse un argument appelé type.

Code:
def type=(type)Dans le cas où l'argument proposé est le même que celui précédament choisi, la méthode s'arrête (via return) :

Code:
return if @type == typeA partir de maintenant nous somme sur que la variable type de la classe (ancienne effet météo) et celle de la méthode (nouvelle effet)
Sont différents, nous rendons donc celle de la classe égale à celle de la méthode, c'est à dire qu'ici nous changeons d'effet :

Code:
@type = typeMaintenant nous avons le bon type, mais le bitmap est celui de l'ancienne effet, donc celon notre variable type (de la classe),
Nous allons faire un bitmap différent :
- Dans la variable type de la classe :

Code:
case @type- quand 1 => bitmap pluie

Code:
when 1
bitmap = @rain_bitmap- quand 2 => bitmap tempête

Code:
when 2
bitmap = @storm_bitmap- quand 3 => bitmap neige

Code:
when 3
bitmap = @snow_bitmap- quand 4 => bitmap acide

Code:
when 4
bitmap = @acid_bitmap- quand 5 => bitmap pics

Code:
when 5
bitmap = @pics
- Si ce n'est pas le cas il n'y a pas d'effet météo

Code:
else
bitmap = nil
- Fin de la case

Code:
endUn exemple d'insertion ?
Vous avez pus voir que l'enchainement étais logique, le type 1 est la pluie, le type 2 la tempète... nous nous arrêtons ici au type 5
Donc juste aprés l'égalisation du bitmap, vous pouvez ajouter votre effet, qui sera le type 6, 7, 8 ou 154 si cela vous amuse !
Comme ceci :

Code:
when 5
bitmap = @pics
when 6
bitmap = @test
end # fin de case (ne pas mettre deux fois !)Simple non ?

Mais maintenant, comment on dis au motifs d'aller en bas à droite par exemple ?
Tout ce passe dans la méthode de mise à jour (update)
Ou tout est défini !
Observons cette méthode :
- Définition de la méthode (sans argument => pas besoin) :

Code:
def update- Revenir s'il n'y a pas d'effet météo => logique :

Code:
return if @type == 0- Boucle celon une variable i, qui à chaque répétition de la variable auguementra de 1,
Jusqu'à la valeur de la variable max de la classe :

Code:
for i in 1..@max- Définition de la variable sprite de la méthode comme le sprite d'id i (la variable ci-dessus)

Code:
sprite = @sprites[i]- Si le sprite n'existe pas (est égal à rien) la boucle s'arrête :

Code:
if sprite == nil
break
end- Maintenant plusieurs condition font les mouvements selon le type de l'effet météo :

Code:
if @type == 1
sprite.x -= 2
sprite.y += 16
sprite.opacity -= 8
elsif @type == 2
sprite.x -= 8
sprite.y += 16
sprite.opacity -= 12
elsif @type == 3
sprite.x -= 2
sprite.y += 8
sprite.opacity -= 8
elsif @type == 4
sprite.x -= 8
sprite.y += 16
sprite.opacity -= 12
elsif @type == 5
sprite.x += 10 * Math.cos(i * 3.14 / 10)
sprite.y += 10 * Math.sin(i * 3.14 / 10)
sprite.opacity -= 6
endPour en inserrer un il suffit d'ajouter une condition "sinon si" => elsif avec @index = type de l'effet météo (6 par exemple)
Voici donc pour notre météo test :

Code:
elsif @type == 5
sprite.x += 10 * Math.cos(i * 3.14 / 10)
sprite.y += 10 * Math.sin(i * 3.14 / 10)
elsif @type == 6 #=> l'effet "test"
sprite.x -= 2
sprite.y -= 2
endEt voila votre effet météo est installé !
Maintenant bous allons simplifier son appelle, avec une petite méthode !
Tout à la fin de votre script (aprés les end) définissez une méthode (ici test) avec les bons arguments :

Code:
def test(force, transition)
$game_screen.weather(5, force, transition)
end
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://fantasy-island.bb-fr.com
 
faire son effet météo
Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
fantasy island :: RPG maker :: Scripts-
Sauter vers: