Assez de la pluie, de la neige, et de l'orage!! ^^ voilà du Soleil made in mhd! J'en avais déjà parlé dans la boite à idée.
-Description
Euh une image pour commencer serait bien ^^...
Bon, le screen n'est pas terrible terrible... c'est parce que les rayons apparaissent et disparaissent tant que la météo est active... Elle est "animée". Bon, ça n'éblouïe pas pour autant. En réalité, le soleil est un point hors de l'écran, et un ensemble de rayons semblants provenir de ce point. Les rayons apparaissent, puis disparraissent, ponctuellement ça peut être sympathique.
-Installation
Ce script n'échappe pas à la régle du "copiez en dessous de material". Il n'a pas de nécéssité particulière. Cet effet lumineux n'a pas besoin d'images.
-Utilisation
Il est très simple:
Activation: dans un appel de script mettre "$sun.play(intensité, temps)" comme pour les vraies météos: l'intensité va de 1 à 10, et le "temps" correspond au temps d'apparition de la météo.
Désactivation: "$sun.stop(temps)"
Alors, compliqué?
Il y a deux autres petites fonctions:
$sun.position(heure, minute) permet de faire le lien avec des scripts ou des events parallèlles de temps.
$sun.change_opacity(opacity, duration =0) permet de faire changer tous les rayons en une opacité commune.
-Configuration:
Le module de configuration est grand pour vous permettre de l'adapter à vos besoins. Référez-vous aux commentaires, normalement il devrait être assez compréhensible et permet beaucoup de variante.
-Le script:
Spoiler:
Code:
#=============================================================================== # # # Mto_Sun.v3 # # #=============================================================================== # #by Vincentmhd, #http://vincentmhdmaker.canalblog.com/ #v1 -> v2 Les rayon peuvent maintenant faire le tour complet de l'écran #v2 -> v3 Correction de la méthode Stop # Ajustement de la longueur des rayons en fonction de la distance du soleil possible # Meilleure gestion de l'intensité #=====================================NOTE====================================== =begin
Ce script est un script Météorologique. Il permet d'appeler le Soleil, comme on appelle la pluie, ou la neige.
Le soleil est composé de rayon qui suivent leur propre cycle. Ils apparaissent, restent, disparaissent, attendant, pour réapparaitre et ainsi de suite. A chaque réapparition ils changent de place, forme.
La position du Soleil se détermine par l'heure (et les minutes) appel par la méthode: $sun.position(heure,minutes)
Pour appeler le Soleil: $sun.play(Intensité, Temps_d'_apparition)
Pour arrêter la météo: $sun.stop(temps_de_disparition)
Pour changer l'opacité de tout les rayons à la fois momentanément $sun.change_opacity(opacity, duration =0)
Le tout est assez customisable dans le module ci-dessous.
#=============================================================================== # Soleil #=============================================================================== HEURE_DEFAULT = 14 #Pris si rien n'est spécifié MINUTE_DEFAULT = 0
CHANGE_DUREE = 60 #Durée moyenne de changement d'opacité général par défaut CHANCE_CHANGE = 5000 #Chance sur 1 d'avoir un changement d'opacité général #à la frame
DISTANCE_SOLEIL = 550 #Rayon de rotation X_ORIGINE = 416/2 #Axe de rotation Y_ORIGINE = 544/2 #Axe de rotation
TETA_MIN = 25 #Angle parcourru à l'écran (par rapport à la droite y = Y_ORIGINE) TETA_MAX = 155 #Angle parcourru à l'écran (par rapoort à la droite y = Y_ORIGINE)
RONDEUR = 90 #avec le placement des sprites sur les #contours et non directement au soleil #on perd la rondeur de celui-ci la rondeur #est un correctif fonction de la variance #angulaire et de l'angle avec l'axe #Soleil/centre de rotation
INFLUENCE_H = 90 #représente l'influence du pourcentage #horaire du soleil sur la dimension #des rayons: au zénith les rayons sont à #100% de leur longueur possible. Au #crépuscule et à l'aube, ils sont au #minimun à LONGUEUR_MIN*(1-INFLUENCE_H/100)
#convertir en radians def put_in_rad(angle) return angle = ((Math::PI.to_f * angle.to_f) /180) end
#plus ou moins X% def plus_ou_moins(nombre, pourcentage) pourcentage = (100 - pourcentage) + rand( pourcentage*2 ) pourcentage = pourcentage.to_f/100 nombre = nombre.to_f * pourcentage return nombre end end #Inclusion dans l'espace commun include Mhd_Math
#=============================================================================== # Ajout aux couleurs #===============================================================================
#============================================================================== # Ajout aux Bitmap #==============================================================================
class Bitmap
def moyenne_avec(bitmap) for x in 0...self.width for y in 0...self.height couleur = self.get_pixel(x,y) couleur.moyenne_avec(bitmap.get_pixel(x,y)) self.set_pixel(x,y,couleur) end end end
def gradient_param(colorA, colorB, param) return ((1-param)*colorA.to_f + (param)*colorB.to_f).to_i end
for x in 0...rect.width for y in 0...rect.height couleur_A = self.get_pixel(x + rect.x, y + rect.y) param = ((rect.width.to_f - x.to_f)*(y.to_f))/(rect.width.to_f * rect.height.to_f) couleur_C = gradient_color(couleur_A, couleur_B, param) self.set_pixel(x + rect.x, y + rect.y, couleur_C) end end end
def mhd_gradient_B(couleur_B, rect = self.rect) for x in 0...rect.width for y in 0...rect.height couleur_A = self.get_pixel(x + rect.x,y + rect.y) param = ((rect.width.to_f - x.to_f)*(rect.height.to_f - y.to_f))/(rect.width.to_f * rect.height.to_f) couleur_C = gradient_color(couleur_A, couleur_B, param) self.set_pixel(x + rect.x, y + rect.y, couleur_C) end end end
def mhd_gradient_C(couleur_B, rect = self.rect)
for y in 0...rect.height for x in 0...rect.width couleur_A = self.get_pixel(x + rect.x, y + rect.y) param = ((rect.height.to_f - y.to_f)*(x.to_f))/(rect.width.to_f * rect.height.to_f) couleur_C = gradient_color(couleur_A, couleur_B, param) self.set_pixel(x + rect.x, y + rect.y, couleur_C) end end end
def mhd_gradient_D(couleur_B, rect = self.rect) for y in 0...rect.height for x in 0...rect.width couleur_A = self.get_pixel(x + rect.x,y + rect.y) param = ((rect.width.to_f - x.to_f)*(rect.height.to_f - y.to_f))/(rect.width.to_f * rect.height.to_f) couleur_C = gradient_color(couleur_A, couleur_B, param) self.set_pixel(x + rect.x, y + rect.y, couleur_C) end end end
#=============================================================================== # Dessine des Rayons #===============================================================================
#=============================================================================== # La Sprite... #=============================================================================== #Créer la sprite, et les données physiques def creer_sprite(soleil_x, soleil_y, teta) @sprite = Sprite.new() @sprite.opacity = 0
if ((@pourcentage <= 1.0) && (@pourcentage >= 0.0)) position(soleil_x, soleil_y, teta) else @sprite.dispose end end
#regroupe les méthodes physiques def position(soleil_x, soleil_y, soleil_teta) if !(@sprite.disposed?) calcul_angle(soleil_teta) calcul_coord(soleil_x, soleil_y, @angle) choix_bitmap end end
#=============================================================================== # L'angle #=============================================================================== #Calcul l'angle du rayon en fonction de la position du soleil dans sa #trajectoire cela se manifeste en tout premier par son angle def calcul_angle(teta) if !(@sprite.disposed?) angle = 180 - teta delta = rand(Mhd_Sun::VARIANCE_ANGLE) if rand(2)>= 1 angle += delta else angle -= delta end @angle = angle #calcul rondeur @rondeur = (1 - Mhd_Sun::RONDEUR.to_f/100) + (Mhd_Sun::RONDEUR.to_f/100)*(1 - delta.to_f/(Mhd_Sun::VARIANCE_ANGLE.to_f)) end end
#=============================================================================== # Les coordonnées #=============================================================================== def calcul_coord(soleil_x, soleil_y, rayon_teta) if !(@sprite.disposed?) rayon_teta = put_in_rad(rayon_teta) b = (soleil_y.to_f + soleil_x.to_f * Math.tan(rayon_teta)) a = (b - soleil_y.to_f)/( - soleil_x.to_f)
i=[] j=[] k=[] l=[]
i[0] = 0.0 i[1] = b
j[0] = -b/a j[1] = 0.0
k[0] = 544.0 k[1] = 544.0*a +b
l[0] = (416.0 -b )/a l[1] = 416.0
tab = [i,j,k,l] id = nil distance = nil
for n in 0...tab.size() if ( (tab[n][1] >= 0) && (tab[n][1]<= 416) && (tab[n][0] >= 0) && (tab[n][0]<= 544) ) d = Math.sqrt((tab[n][1]-soleil_y)*(tab[n][1]-soleil_y) + (tab[n][0]-soleil_x)*(tab[n][0]-soleil_x)) if distance == nil distance = d id = n else if distance > d distance = d id = n end end end end
if !(id == nil) @distance = distance @sprite.x = tab[id][0] @sprite.y = tab[id][1] else @sprite.dispose end end end
#=============================================================================== # Choix de l'image #=============================================================================== #Selon les coordonées et l'angle du rayon, il ne va prendre la même image pour #masquer les coins de ces dernières. def choix_bitmap
if !(@sprite.disposed?) angle = @angle
#Condition permettant de connaitre le côté de l'apparition a = ( (angle >= -90) && (angle <= 0) && !(!(@sprite.y == 0)) ) b = ( (angle >= 0) && (angle <= 90) && !(!(@sprite.x == 0)) ) c = ( (angle >= 90) && (angle <= 180) && !(!(@sprite.y == 416)) ) d = ( (angle >= -180) && (angle <= -90) && !(!(@sprite.x == 544)) )
#Proportion des rayon en fonction du pourcentage horraire if(@pourcentage >0.5 ) proportion = 2*(1 - @pourcentage) else proportion = @pourcentage end proportion = (1 - Mhd_Sun::INFLUENCE_H.to_f/100) + ((Mhd_Sun::INFLUENCE_H.to_f/100) * proportion )
if (a||b||c||d) #Rayon de type B angle += 90 #angle à ré-adapter @sprite.bitmap = $mhd_ray_B
if ((longueur <= 0 )||( hauteur <= 0)) @sprite.dispose end end end
#=============================================================================== # Actions #=============================================================================== #Change l'opacité (indépendanment de fade-in et fade_out) def change_opacity( opacity, transition) @target_opacity = opacity @transition = transition if (transition == 0 && (!(@sprite.disposed?))) @sprite.opacity = @target_opacity end end
#Force le rayon à s'éteindre def fade_out(time) @wait = 0 @transition = 0 @duree = - time @soleil = 0 @fade = true end
#=============================================================================== # Cycle du Rayon #=============================================================================== def cycle_update(soleil_x, soleil_y, teta) #En suspend en cas de transition if @transition == 0
#Apparition if @duree > 0 d = @duree if !(@sprite.disposed?) @sprite.opacity = (@sprite.opacity * (d - 1) + @opacity) / d end @duree -= 1 if @duree == 0 @soleil = Mhd_Sun::SOLEIL_MIN + rand(Mhd_Sun::SOLEIL_MAX - Mhd_Sun::SOLEIL_MIN) end end
#Brille if @soleil >0 @soleil -=1 if @soleil == 0 @duree = -(Mhd_Sun::DUREE_APP_MIN + rand(Mhd_Sun::DUREE_APP_MAX - Mhd_Sun::DUREE_APP_MIN)) end end
#Disparition if @duree < 0 d = -@duree if !(@sprite.disposed?) @sprite.opacity = (@sprite.opacity * (d - 1) + 0) / d end @duree += 1 if (@duree == 0)&&(@wait >= 0) if @fade == true @wait=-1 else @wait = Mhd_Sun::WAIT_MIN + (((10 - @intensity.to_f)/10)*(Mhd_Sun::WAIT_MAX.to_f - Mhd_Sun::WAIT_MIN.to_f)) @wait = (Mhd_Math.plus_ou_moins( @wait , 20)).to_i end @sprite.dispose end end
#Attend if @wait >0 @wait -= 1 if @wait == 0 @opacity = Mhd_Sun::OPACITY_MIN + ((@intensity.to_f/10)*(Mhd_Sun::OPACITY_MAX.to_f - Mhd_Sun::OPACITY_MIN.to_f) ) @opacity = (Mhd_Math.plus_ou_moins( @opacity, 20)).to_i creer_sprite(soleil_x, soleil_y, teta) @duree = Mhd_Sun::DUREE_APP_MIN + rand(Mhd_Sun::DUREE_APP_MAX - Mhd_Sun::DUREE_APP_MIN) end end end end
def update_change_opacity if @transition > 0 if !(@sprite.disposed?) d = @transition @sprite.opacity = (@sprite.opacity * (d - 1) + @target_opacity) / d end @transition -= 1 if (@transition == 0) if (@duree > 0) @duree = (Mhd_Sun::DUREE_APP_MIN + rand(Mhd_Sun::DUREE_APP_MAX - Mhd_Sun::DUREE_APP_MIN)) else if (@duree < 0) @duree = -(Mhd_Sun::DUREE_APP_MIN + rand(Mhd_Sun::DUREE_APP_MAX - Mhd_Sun::DUREE_APP_MIN)) end end end end end
end
#=============================================================================== # # # Le Soleil # # #=============================================================================== class Mto_Sun
#Désactive def stop(time = 0) if @play == true @change_count = 0 @stop_time = time + 60 for i in 0...@soleil.size() @soleil[i].fade_out(time) end end end
#Calcul la position du Soleil def position(heure = Mhd_Sun::HEURE_DEFAULT, minute = Mhd_Sun::MINUTE_DEFAULT)
#Change toutes les opacités def change_opacity(opacity, time = Mhd_Sun::CHANGE_DUREE) @change_target = opacity @change_count = time
for i in 0...@soleil.size() @soleil[i].change_opacity(opacity, time) end end
#=============================================================================== # Update #=============================================================================== def create_rayon for i in 0...@nbs_rayon @soleil += [Rayon.new(@x, @y, @teta, @intensity, @pourcentage)] end end
def update stop_count if @play update_change for i in 0...@soleil.size() @soleil[i].update(@x, @y, @teta, @pourcentage) end end end
def stop_count if @stop_time > 0 @stop_time -= 1 if @stop_time == 0 @play = false @stop_time = -1 end end end
def stopping? if @stop_time > 0 return true else return false end end
def update_change #un seul changement par défaut à la fois if !(stopping?) if @change_count == 0 a = rand(@chance) if a == @chance/2 opacity = (@intensity.to_f)*255/10 opacity = (Mhd_Math.plus_ou_moins( opacity, 25)).to_i duree = Mhd_Sun::CHANGE_DUREE/2 + rand(Mhd_Sun::CHANGE_DUREE) change_opacity(opacity , duree) end else @change_count -= 1 end end end
end
#==============================================================================# # # # Création de la Météo et des images # # # #==============================================================================# class Scene_Title alias mhd_sun_create_game_objects create_game_objects def create_game_objects mhd_sun_create_game_objects
class Scene_Map alias vincentmhd_sun_update update def update vincentmhd_sun_update $sun.update end end
>> Démo
-Crédits : Vincentmhd
Hum je n'ai jamais envoyé un post de script aussi rapidement... Edit:: j'ai corrigé quelques petits défauts du script le soir même... je savais bien que c'était trop vite ^^
Dernière édition par vincentmhd le Dim 17 Jan 2010 - 14:00, édité 5 fois
Raitosan
† Fondateur du forum †
Age : 31 Inscrit le : 09/02/2008 Messages : 1974
Sujet: Re: [VX] Mto_Soleil Dim 3 Jan 2010 - 9:42
Merci pour ce script +3 en script et +1 en aide à la vie du forum
Diblo
Illusionniste Lv.12
Age : 115 Inscrit le : 07/08/2009 Messages : 774
Sujet: Re: [VX] Mto_Soleil Dim 3 Jan 2010 - 9:55
=o C'est beau merci beaucoup!
MirainoHikari
Ex-Admin-Script
Age : 42 Inscrit le : 26/05/2008 Messages : 2360
Sujet: Re: [VX] Mto_Soleil Dim 3 Jan 2010 - 10:45
Méteo Soleil Intence. C'est chouette comme idée. Merci du partage.
Raitosan
† Fondateur du forum †
Age : 31 Inscrit le : 09/02/2008 Messages : 1974
Sujet: Re: [VX] Mto_Soleil Lun 4 Jan 2010 - 20:26
je te rajoute +7 points en script, la nouvelle loi chez le staff est passer, tout scripts fait maison vaux 10 points
Matsuo Kaito
Age : 33 Inscrit le : 27/06/2008 Messages : 10881
Sujet: Re: [VX] Mto_Soleil Lun 4 Jan 2010 - 20:55
O_O
La "loi" existe depuis au moins un an ( enfin moi, ce que j'en dis ) Enfin bref, script pas mal, merci du partage
Edit: C'est vous qui l'avez décider tous seul. Depuis quand le staff a-t-il besoin de ton autorisation avant de faire quoi que ce soit ? Une règle appliquée depuis si longtemps, marquée dans la FAQ et tout ... vient pas faire un petit "toute nouvelle loi" si c'est juste une vieille loi que t'as voulu changé mais que les autres t'ont convaincu de ne pas faire et rend sa couleur à fabY >o> Edit: surtout pour le peut que vous avez utiliser les points -_- Arrête tes pathétiques reproches à retardement ! Qu'en sais-tu, d'ailleurs ? Vu ton manque de présence ... tu n'as pas pu voir si on donnait ou non ces fameux points - et si tu voyais que ce n'était pas le cas, c'était ton rôle de nous le dire. Mais bon .... faut pas trop t'en demander.
Dernière édition par Matsuo Kaito le Mar 5 Jan 2010 - 19:34, édité 2 fois
Darksmile
Maître du destin
Age : 28 Inscrit le : 05/11/2008 Messages : 2955
Sujet: Re: [VX] Mto_Soleil Mar 5 Jan 2010 - 1:43
Citation :
C'est vous qui l'avez décider tous seul.
Il y a un an... XD
Enfin, très bon script, mais il ne se passe aucun changement quand je veux faire disparaître l'effet de lumière par appel de script (pas dans un évenement en parallèle, ça ne marche pas, de toute façon...). Les rayons restent donc...
vincentmhd
Maire Lv.9
Age : 37 Inscrit le : 04/02/2009 Messages : 326
Sujet: Re: [VX] Mto_Soleil Mar 5 Jan 2010 - 17:39
Hum donc $sun.stop() ne fonctionne pas. J'ai fait des ajustements sans m'en préoccuper, à la base elle fonctionnait. Je viens juste de voir un "conflit" possible entre "stop()" et "update_change" de la classe soleil, il doit y avoir d'autres kwacks. Je vérifierai cela dès que possible.
Je n'ai pas rpg maker VX sur cet ordi, normalement je récupère mon ordi en fin de semaine. (je croise les doigts)
La Meche
Flibustier Lv.21
Age : 30 Inscrit le : 24/05/2008 Messages : 3234
Sujet: Re: [VX] Mto_Soleil Mar 5 Jan 2010 - 18:06
Enorme ce script ! (Enfin pour moi c'est plutôt le codage que le rendu x]) J'aimerais fouillé voir comment t'a fait pour afficher des rayons aussi... naturel sans images mais j'ai un peu la flemme >.>"
vincentmhd
Maire Lv.9
Age : 37 Inscrit le : 04/02/2009 Messages : 326
Sujet: Re: [VX] Mto_Soleil Mar 5 Jan 2010 - 20:12
^^, il a quoi mon rendu, c'est pas si mal. Après il y a suffisament de paramètres de config pour l'adapter...
(Je viens juste de me rendre compte que je m'embête pour rien avec la "rondeur" (je devrais simplement retranché à la longueur de la sprite, la distance entre le centre du soleil et la coord de la sprite (ce qui est calculé au moment de rechercher les coords de la sprite)...)
Pour créer les images ce n'est pas très compliqué, elles sont composées que de 2x2 dégradés. (dans un sens sur une moitié dans l'autre sur l'autre moitié (2x(un vertical et un horrizontal) ) Dans la démo, il un a une orbe bleue qui les fait apparaître.
Pour le placement des sprites, c'est là où j'ai eu besoin de réfléchir sur papier avant de faire sur machine (même si c'est glauque ^^). Il a quelques petites notions de géométrie (le plus "avancé", c'est les équations paramètriques du cercle, niveau 1er dans mes vieux souvenirs).
La Meche
Flibustier Lv.21
Age : 30 Inscrit le : 24/05/2008 Messages : 3234
Sujet: Re: [VX] Mto_Soleil Mer 6 Jan 2010 - 13:18
Citation :
il a quoi mon rendu, c'est pas si mal.
J'ai pas dit que c'était moche, j'ai dit que le codage avait l'air intéressant !
Citation :
Pour créer les images ce n'est pas très compliqué, elles sont composées que de 2x2 dégradés. (dans un sens sur une moitié dans l'autre sur l'autre moitié (2x(un vertical et un horrizontal) ) Dans la démo, il un a une orbe bleue qui les fait apparaître.
Et en français sa donne quoi ? ^^'
Mais vais quand essayer de m'y pencher... Même si je sens que je vais avoir de ces mals de têtes @_@
Darksmile
Maître du destin
Age : 28 Inscrit le : 05/11/2008 Messages : 2955
Sujet: Re: [VX] Mto_Soleil Mer 6 Jan 2010 - 23:58
En fait... Je rectifie : Une fois sur deux, à ce que j'ai pu observer, le $sun.stop(X) ne fait aucun effet. Mais parfois, le jeu plante : une erreur à la ligne 457.
vincentmhd
Maire Lv.9
Age : 37 Inscrit le : 04/02/2009 Messages : 326
Sujet: Re: [VX] Mto_Soleil Dim 17 Jan 2010 - 14:04
J'ai fait une correction de $sun.stop(X) qui fonctionne maintenant.
Cependant à la ligne 457 de la version que j'ai re-téléchargé à cause de multiples décès de discs durs, c'est un commentaire. J'ai fait d'autres petits changements donc j'ai peut-être corrigé le défaut sans le savoir.
Donc normalement c'est bon il fonctionne.
PS:: j'ai toujours pas d'ordi fonctionnel chez moi,
Dernière édition par vincentmhd le Jeu 4 Fév 2010 - 18:51, édité 1 fois
Eaon
Poulet carnivore Lv.2
Inscrit le : 29/11/2009 Messages : 23
Sujet: Re: [VX] Mto_Soleil Jeu 21 Jan 2010 - 8:04
Coool! Il est pratique pour faire des grottes(ça fait comme si il y avait des trous dans le plafond)! Merci!
Contenu sponsorisé
Sujet: Re: [VX] Mto_Soleil
[VX] Mto_Soleil
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum