Sujet n°2642
Posté par Empire1601 le 14 Jan - 17:33 (2009)
Titre : [Tuto] Créer des événements qui intéragissent dans le temps
Bonjour  Petit saligaud mal élevé
Comme je l'ai dit plus tôt, j'ai décider d'apprendre à ceux qui ne le savent pas à utiliser le temps dans leurs évent (pour les rendre plus attractifs entre autre)  Imbécile heureux
Aujourd'hui ce n'est pas un tuto spécialisé que je vais poster mais un ensemble de toutes les fonctions possibles grâce au temps dans les évents  Clin d'œil foireux

Bien sur, je ne pourrais pas tout faire aujourd'hui et il m'arrivera parfois de renvoyer des liens vers d'autres tuto (c'est en quelque sorte un petit sommaire Clin d'œil foireux )

Voici le sommaire (qui sera complété au fur et à mesure) :
A. L'heure
Je vais vous présenter ici quelques fonctions qui vont nous simplifier la vie dans nos futur events Petit saligaud mal élevé
(les programmeurs sont des grands flemmards c'est bien connu :mrgreen: )
Voici l'outil indispensable pour faire des events opérationnels Time.now() (c'est en grand donc c'est à retenir ^_^)
Cette fonction de la librairie ruby va nous renvoyer toutes les informations que l'on veut sur le temps en fonction de ce qu'on lui demande (et même plus, je n'ai pas pu encore toute l'explorer ^_^)
Allé en avant ! Petit saligaud mal élevé

1. Le script
Je crois que vous vous rappelez tous des versions O/A/C, avec les pokémons pokémons que l'on ne pouvais capturer que la nuit et le thé du matin de votre voisine à Bour Geon :mrgreen:
Et bien vous avez la possibilté de faire ça vous aussi Petit saligaud mal élevé
Gràce à Time.now().hour vous allez pouvoir réaliser vos rèves les plus fous ! (non quand même pas ^^")
Je vous ai donc concocté une petite fonction qui vous simplifiera la vie Bouche extensiblek:
(je vous conseil de le prendre car il m'ait arrivé plusieurs fois de me tromper dans l'écriture de Time.now() :mrgreen: )
 Placez le dans l'un des scripts contenant "interpreter" entre les deux derniers "end" Clin d'œil foireux
Code:



 def calHour
    hour = Time.now().hour
    return hour
end



Astuce : les interpreters sont des scripts regroupant les fonction utilisées dans les événements (ex: ajouter_pokemon). Avec quelques connaissances de ruby, vous pouvez facilement créer les votre et ainsi ne pas avoir à faire des évents trop compliqués Clin d'œil foireux

2.Des évents qui utilisent l'heure
Maintenant nous allons pouvoir faire en sorte que certaines commandes comme "donner un objet" ne s'éxécutent que entre certaines heures :D
Pour cela il faudra faire des testes Petit saligaud mal élevé
Insérez une condition dans l'event de votre choix Clin d'œil foireux

 
Code:


 if calHour >= x and calHour < y



x est la l'heure de début et y l'heure de fin

Astuce : si vous avez quelques compétences de programation vous avez pu reconnaitre certains aspects dans cette condition comme le ">=" qui compare calHour et x (si l'heure est supérieur ou égale à x)  et "<"qui compare calHour et y (si l'heure est strictement inférieur à y) mais aussi le "and" qui permet d'utiliser plusieurs condition en une seule ; il y a or aussi par exemple (je ne vais pas vous expliquer ce que fait chaque connecteur, il faut tout de même un minimum de connaissances en anglais ^_^")

Exemple :
Code:



 Condition : si Script : if calHour == 10
      Message : Tient Salut ! 
      Message : Veux-tu du thé avec un nuage de lait ? 



   /!\ On utilise == pour une égalité et non = /!\


3. Des pokémons sauvages nomades en fonction du moment de la journée

Vous en avez rêvé, et bien c'est possible :mrgreen:
Pour faire cette fonction, je vous invite à aller faire un petit tour dans L'Annexe 1 qui explique comment et l'intérêt de s'occuper des pokémons sauvages en script Clin d'œil foireux
Une foi cela fait, on va pouvoir s'attaquer au vif du sujet rajouter une nouvelle commande qui nous simplifiera la vie  :mrgreen:
Je vous propose encore une foi d'aller faire un tour dans le script interpreter et d'insérer ce code au même endroit que précédemment  Imbécile heureux
 
Code:



  #Simplification de la période de la journée 
  def dayPeriod
    period = 0
    if Time.now().hour > 6
      period = "matin"
      if Time.now().hour > 13
        period = "aprem"
       if Time.now().hour > 16
         period = "soir"
         if Time.now().hour > 20
           period = "nuit"
         end
       end
     end
   end
   if Time.now().hour < 7
    period = "nuit"
   end
   return period
   end





Ne vous inquiétez pas, je ne vous ai pas fait faire ça pour rien Imbécile heureux
En effet, sans ce script vous auriez du faire ceci pour paramétrer une rencontre de pokémon simple :

 
Code:



  set_encounter(15, [1, [41, 3, 4] , [74, 3, 4] ])
  Condition : si Script Time.now().hour > 20 or Time.now().hour < 7
   set_encounter(15, [1, [92, 4, 3] , [74, 3, 4]  , [41, 3, 4]])
   :Fin



Ici je fais apparaitre un pokemon uniquement la nuit (fantominus) Clin d'œil foireux
Mais maintenant gràce à ce petit bout de code vous n'aurez plus qu'à faire ça :

 
Code:



 set_encounter(15, [1, [41, 3, 4] , [74, 3, 4] ])
 Condition : si Script dayPeriod == "nuit"
   set_encounter(15, [1, [92, 4, 3] , [74, 3, 4]  , [41, 3, 4]])
    :Fin
    


Moi je trouve ça plus simple, je sais pas pour vous :mrgreen:

Astuce : Si pour vous la nuit n'est pas à la même heure que ce que j'ai configuré rien ne vous empêche de modifier mon code Clin d'œil foireux





B. Les jours de la semaine
1. Le principe
J'ai déjà rédigé ce tuto sur un autre topic mais je vais le remettre ici pour centraliser :D
Vous avez sans doute déjà observé des personnages dans les versions commerciales qui vous offrait, par exemple, un objet différent chaque jour ; et bien nous allons apprendre comment faire ça Clin d'œil foireux , vous allez voir ce n'est pas bien compliqué à utiliser Imbécile heureux

Première étape : le script
Vous allez devoir copier/coller se script de mon invention que j'ai fais hier sur ma calculatrice Petit saligaud mal élevé
Placez le dans l'un des scripts contenant "interpreter" entre les deux derniers "end" Clin d'œil foireux
 
Code:



   def calDay
    all = (Time.now().year * 365 + (Time.now().year / 4)) + Time.now().day + 5
    if (!(Time.now().year % 4))
      all = all - 1
    end
    if (Time.now().month > 1)
      all = all + 31
    end
    if (Time.now().month > 2)
      if (Time.now().year / 4)
        all = all + 28
      end
      if (!(Time.now().year / 4))
        all = all + 29
      end
    end
    if (Time.now().month > 3)
      all = all + 31
    end
    if (Time.now().month > 4)
      all = all + 30
    end
    if (Time.now().month > 5)
      all = all + 31
    end
    if (Time.now().month > 6)
      all = all + 30
    end
    if (Time.now().month > 7)
      all = all + 31
    end
    if (Time.now().month > 8 )      
      all = all + 31
    end
    if (Time.now().month > 9)
      all = all + 30
    end
    if (Time.now().month > 10)
      all = all + 31
    end
    if (Time.now().month > 11)
      all = all + 30
    end
    dayN = all % 7
    if dayN == 1
      return "Lundi"
    end
    if dayN == 2
      return "Mardi"
    end
    if dayN == 3
      return "Mercredi"
    end
    if dayN == 4
      return "Jeudi"
    end
    if dayN == 5
      return "Vendredi"
    end
    if dayN == 6
      return "Samedi"
    end
    if dayN == 0
      return "Dimanche"
    end
  end










Astuce : les interpreters sont des scripts regroupant les fonction utilisées dans les événements (ex: ajouter_pokemon). Avec quelques connaissances de ruby, vous pouvez facilement créer les votre Clin d'œil foireux

Deuxième étape : l'évent
Maintenant que RMXP connait cette fonction nous allons pouvoir l'utiliser dans des conditions Clin d'œil foireux
Placé une condition dans laquelle vous insérerez les différentes commandes qui ne s'exécutent que le jour que vous souhaité  Petit saligaud mal élevé
Cette condition s'exécute par un script respectant la syntaxe suivante :

 
Code:



calDay == "Jour" 




Si vous voulez que votre personnage fasse une certaine action uniquement le dimanche il faudra faire une condition en fonction du script suivant :

 
Code:



calDay == "Dimanche" 



Voici un exemple rudimentaire d'utilisation de ce script Clin d'œil foireux :


Astuce : Vous pouvez combiner les conditions en les séparant par des "or". Avec "calDay == "Mercredi" or calDay == "Dimanche"", l'évent ne se déroulera que le Mercredi ou le dimanche Clin d'œil foireux

/!\ Attention à la majuscule devant le nom du jour /!\

2. Gestion des events journaliers avancée

Ce script (que j'ai mis du temps à développer mais ça en vaut la peine ^_^) donne un bon éventail de possibilités pour vos évents les plus fous Petit saligaud mal élevé
  • Un pokemon n'apparaissant qu'un seul jour de la semaine
  • Un bâtiment (magasin?) fermé le dimanche :mrgreen:
  • Des dresseurs journaliers
  • ...
Je vais essayer de vous expliquer le premier de ces exemple, le pokemon journalier, car il me permettra de vous apprendre une techniques qui vous sera bien utile pour les pokemons sauvages (si vous utilisé mon tuto Petit saligaud mal élevé ).
Il y a deux façon de faire un pokemon journalier, tout dépends de ce que l'on veut faire Clin d'œil foireux
- Si je veux faire apparaitre un pokemon légendaire comme Cresselia uniquement le lundi (jour de la lune et oui ^_^), la méthode n'est pas bien compliqué. En effet, le pokemon n'étant capturable qu'une seul foi en théorie vous n'aurez qu'a faire une rencontre de pokemon unique (=> manuel de PSP) dans une condition

 
Code:



 Condition : si Script : 'CalDay == Lundi'



ça ne change pas d'un event normal ^_^
- Mais si je veux faire apparaître un pokemon sauvage "commun", c'est une autre paire de manche :D
En effet, nous avons vu dans la partie A que seul set_encounter(...) (voir Annexe 1) peut nous permettre de paramètrer des rencontres en fonction d'une condition. Mais cette fonction est longue à rediger et si les conditions s'accumulent un event sur une map devient vite incompréhensible :shock:
Pour réaliser vous simplifier je vous invite à visiter l'annexe 2

Annexe 1 : Gestion des pokémons sauvages en script
La partie la plus intéressante mais aussi la plus compliquée
En effet ici il y a deux solutions pour vous dans cette partie du cour :
- Vous n'essayez pas de comprendre et faites juste du recopiage
- Essayez de comprendre et vous comprenez tout (dans ce cas 80% du tuto est inutile pour vous  :mrgreen: )

Commençons  Imbécile heureux
Comme dirait si bien Yoda " Tu dois désapprendre ce tout que tu as appris "
En effet, vous ne pourez plus passez par la BDD pour configurer les pokémons d'une zone mais il y a tellement d'avantage que l'on ne va pas s'en priver Petit saligaud mal élevé
Nous allons donc utiliser une autre fonction très importante qui cette fois-ci ne vient pas du ruby mais est une création de Krosk : set_encounter(...) Clin d'œil foireux
Si vous voulez une explication de cette fonction la voici (je n'ai pas pu faire mieux que Krosk ^^) :

 
Code:



 set_encounter(rate, listx)
   #   Définition de liste de rencontre des Pokémons
   #   rate: de 1 à 50 de préférence
   #   listx: (x = tag du terrain) [[id, level, rareté], [id, level], ...]




voici un exemple pour expliquer cette définition :
Si je veux faire en sorte que dans ma grotte il y ait des fantominus et des racailloux, je mes ce scripts dans un event en processus parallèle :
 
Code:



 set_encounter(15, [1, [41, 3, 4] , [74, 3, 4] ])



15 est la fréquence de rencontres dans les zones de capture
1 est le tag du terrain
41, ID de Nosferapti
3, son niveau
4, sa rareté


Annexe 2 : Gestion améliorée des pokemon en script
:!: Vous ne pouvez pas comprendre cette annexe si vous n'avez pas lu l'annexe 1 :!:
Vous venez d'apprendre comment gérer les pokémons en script Imbécile heureux
Cette commande est indispensable pour faire des conditions dans les rencontres sauvages Clin d'œil foireux
:?: Tout ceci est bien joli mais si je veux faire des pokemons qui apparaissent en fonction de l'heure, du jour, du mois, de l'année et de la saisons, je vais avoir un évent titanesque :(

Et oui ! Je me suis rendu compte de désinconvénient majeure il y a quelque temps Mollasse enragé
Mais il y a une solution Petit saligaud mal élevé !
Je vais vous expliquer mais je vais devoir avant faire un mini cour de programmation à la vitesse de la lumière :mrgreen:
[Cour programmation] set_encounter(...) est une fonction
elle est définie quelque part dans les codes de Krosk
(...) sont la liste de "paramètres", ce sont des variables que l'on envoit à la fonction pour qu'elle les utilise dans ses calculs Clin d'œil foireux [\Cour programmation]

Si vous n'avez pas compris ce n'est pas bien grave ; ça ne vous empêchera pas d'utiliser la fonction :mrgreen:

Je ne vais pas pouvoir vous expliquer l'utilisation de cette fonction de façon théorique, c'est bien trop compliqué pour les non initiés à la programmation :?
Je vais donc vous montrer un exemple et vous l'expliquer :



Nous allons commencer par la fin ^_^

 
Code:


 set_encounter(33,  $game_variables[502])


Vous reconnecterez la fonction set_encounter(...) qui a bien maigrit ^^
En effet, les paramètre de la fonction ne sont pas tapés directement à l'intérieur, mais il sont rajouté au fur et à mesure que l'évent teste les différentes conditions

 
Code:


 Condition : si Script : '$game_variables[500] == "HIVER"'
     Script : '$game_variables[502].push( [459, 6 , 10] )'
   Sinon
   Condition : si Script : '$game_variables[500] == "PRINTEMPS"'
       Script : '$game_variables[502].push( [406, 6 , 10] )'



 Ici, j'ai fais une suite de conditions qui ajoutent un pokemon à la liste en fonction de la saison Clin d'œil foireux
Ne prenez pas compte du script de condition, il sera modifié plus tard ^_^"
Zoomons sur une petite partie du code Petit saligaud mal élevé

 
Code:

 $game_variables[502].push( [406, 6 , 10] )

Je vais décompose cette ligne pour que vous compreniez mieux comment l'utiliser dans vos évents Clin d'œil foireux :
$game_variables[502]... => cette variable contient toutes les données sur les pokémons que l'on veut placer dans les hautes herbes
....push( [406, 6 , 10] ) => cette fonction rajoute un pokemon dans la liste suivant cette syntaxe : .push([ID, niveau, rareté])

Code:


 $game_variables[502].delete([459, 6, 10])
 ...
 $game_variables[502].delete([357, 6, 10])


A chaque changement de saison, l'évent efface l'ancien pokemon pour le remplacer par le nouveau Clin d'œil foireux

Voilà j'ai expliqué ce sujet le mieux que je le pouvais, si vous avez des questions posées les sur le topic Petit saligaud mal élevé



Le tuto n'est pas terminé merci d'être patient Clin d'œil foireux

Posté par Opal le 14 Jan - 19:09 (2009)
Merci :D   

Posté par Empire1601 le 15 Jan - 18:46 (2009)
Maj du 15/01/09  Clin d'œil foireux

Posté par Angi-MK le 15 Jan - 18:55 (2009)
pascient = patient
Sinon ce tuto est pas mal (première partie surtout lol)

Posté par Pαlвσlѕку le 15 Jan - 18:56 (2009)
:shock:
Très bon boulot Bouche extensiblek:

Posté par Empire1601 le 15 Jan - 19:06 (2009)
:mrgreen: désolé pour les fautes  :mrgreen:
je tacherais de m'améliorer ^^" (saleté de correcteur orthographique :evil: )

Posté par Denis Bros le 21 Jan - 03:10 (2009)
ouai encore un qui essaye de me copier

c'est pas plus simple de utilise mon scripte du temps que j'avais publier?

jour et nuit avec les valeur des jour de la semaine
voici le scripte et dans celui la il y a pas l'horloge mais il y a les effet de jour et nuit.

est il aura les valeur des jour de la semaine en meme temps que jour et nuit

remplacer les "id" par le numero de la variable au quel il doit controler

Code:
class Jour_heure < Window_Base
  def initialize
    $exterieur = true
    refresh
  end
  def refresh
    @horloge = Time.new
    @minute = @horloge.min * Graphics.frame_rate
    case @horloge.strftime("%A")
    when "Monday"
      jour = "Lun"
      $game_variables[id] = 1
    when "Tuesday"
      jour = "Mar"
      $game_variables[id] = 2
    when "Wednesday"
      jour = "Mer"
      $game_variables[id] = 3
    when "Thursday"
      jour = "Jeu"
      $game_variables[id] = 4
    when "Friday"
      jour = "Ven"
      $game_variables[id] = 5
    when "Saturday"
      jour = "Sam"
      $game_variables[id] = 6
    when "Sunday"
      jour = "Dim"
      $game_variables[id] = 0
    end
    def update
      refresh
    end
    def update
      refresh
    end
  if $exterieur
      @horloge = Time.new
      case @horloge.hour
      when 0
        @tone = Tone.new(-100, -100, -100, 0)
        $game_screen.start_tone_change(@tone,10)
      when 1
        @tone = Tone.new(-100, -100, -100, 0)
        $game_screen.start_tone_change(@tone,10)
      when 2
        @tone = Tone.new(-100, -100, -100, 0)
        $game_screen.start_tone_change(@tone,10)
      when 3
        @tone = Tone.new(-90, -90, -90, 0)
        $game_screen.start_tone_change(@tone,10)
      when 4
        @tone = Tone.new(-80, -80, -80, 0)
        $game_screen.start_tone_change(@tone,10)
      when 5
        @tone = Tone.new(-60, -60, -60, 0)
        $game_screen.start_tone_change(@tone,10)
      when 6
        @tone = Tone.new(-30, -30, -30, 0)
        $game_screen.start_tone_change(@tone,10)
      when 7
        @tone = Tone.new(0, 0, 0, 0)
        $game_screen.start_tone_change(@tone,10)
      when 8
        @tone = Tone.new(0, 0, 0, 0)
        $game_screen.start_tone_change(@tone,10)
      when 9
        @tone = Tone.new(0, 0, 0, 0)
        $game_screen.start_tone_change(@tone,10)
      when 10
        @tone = Tone.new(0, 0, 0, 0)
        $game_screen.start_tone_change(@tone,10)
      when 11
        @tone = Tone.new(10, 10, 10, 0)
        $game_screen.start_tone_change(@tone,10)
      when 12
        @tone = Tone.new(10, 10, 10, 0)
        $game_screen.start_tone_change(@tone,10)
      when 13
        @tone = Tone.new(10, 10, 10, 0)
        $game_screen.start_tone_change(@tone,10)
      when 14
        @tone = Tone.new(10, 10, 10, 0)
        $game_screen.start_tone_change(@tone,10)
      when 15
        @tone = Tone.new(10, 10, 10, 0)
        $game_screen.start_tone_change(@tone,10)
      when 16
        @tone = Tone.new(50, 20, 10, 0)
        $game_screen.start_tone_change(@tone,10)
      when 17
        @tone = Tone.new(50, 30, 10, 0)
        $game_screen.start_tone_change(@tone,10)
      when 18
        @tone = Tone.new(-5, -5, -5, -5)
        $game_screen.start_tone_change(@tone,10)
      when 19
        @tone = Tone.new(-20, -20, -20, 0)
        $game_screen.start_tone_change(@tone,10)
      when 20
        @tone = Tone.new(-40, -40, -40, 0)
        $game_screen.start_tone_change(@tone,10)
      when 21
        @tone = Tone.new(-60, -60, -60, 0)
        $game_screen.start_tone_change(@tone,10)
      when 22
        @tone = Tone.new(-80, -80, -80, 0)
        $game_screen.start_tone_change(@tone,10)
      when 23
        @tone = Tone.new(-100, -100, -100, 0)
        $game_screen.start_tone_change(@tone,10)
      end
    else
      @tone = Tone.new(0, 0, 0, 0)
      $game_screen.start_tone_change(@tone,10)
    end
  end
  def update
    refresh
  end
end
class Scene_Save
 
    alias old_write_save_data write_save_data
   
    def write_save_data(file)
     
      old_write_save_data(file)
      Marshal.dump($exterieur, file)
    end
   
  end

class Scene_Load
 
  alias old_read_save_data read_save_data

  def read_save_data(file)
    old_read_save_data(file)
    $exterieur = Marshal.load(file)
  end
 
end
class Scene_Map
 
  alias old_main main
  def main
    @jh = Jour_heure.new
    old_main
    @jh.dispose
  end
 
  alias old_update update
  def update
    @jh.update
    old_update
  end
 
end




voici aussi celui qui control les valeur des heure/minute/seconde/date/mois/année


celui la inserer le dans scene map de pokemon a la ligne 50 et de remplacer les "id" par les variable qu'ils doivent controler dans des numero differante

Code:
      hour = Time.new.hour     
      $game_variables[id] = hour
      minute = Time.new.min
      $game_variables[id] = minute
      second = Time.new.sec
      $game_variables[id] = second
      date = Time.new.day
      $game_variables[id] = date
      month = Time.new.month
      $game_variables[id] = month
      year = Time.new.year
      $game_variables[id] = year


en suite vous regler les event pour qui reagis au temps et jour que vous souhaiter en utilise les gestion de varaible

Posté par Empire1601 le 21 Jan - 13:44 (2009)
Denis je n'ai pas fait ce topic pour que tu te fasses de la pub -_-"
[edit]Maj du 21/01
De plus mon système est placé sur le temps réel alors que le tient ne semble pas marcher ^^"

Posté par Miatshan le 30 Juil - 19:49 (2009)
pas mal!

Posté par Alex le 31 Juil - 01:45 (2009)
Evite le nécropost, surtout pour simplement dire ça Clin d'œil foireux.

Posté par Peter le 31 Juil - 12:53 (2009)
Bon,he bien vu qu'il y a nécropost et que j'ai un problème je vais en profiter,alors voila,jai essayer la commende des heure(1er script) mais il me dit syntax error.
Log:
---------- Erreur de script : Interpreter Bis ----------
----- Type
SyntaxError

----- Message
(eval):1:in `command_111'compile error
(eval):1: syntax error
if calHour == 10
^

----- Position dans Interpreter Bis
Ligne 268

----- Backtrace
Script : Interpreter Bis | Ligne : 268 | Méthode : in `command_111'
Script : Interpreter 2 | Ligne : 41 | Méthode : in `eval'
Script : Interpreter Bis | Ligne : 268 | Méthode : in `command_111'
Script : Interpreter 2 | Ligne : 41 | Méthode : in `execute_command'
Script : Interpreter 1 | Ligne : 199 | Méthode : in `update'
Script : Interpreter 1 | Ligne : 113 | Méthode : in `loop'
Script : Interpreter 1 | Ligne : 204 | Méthode : in `update'
Script : Scene_Map | Ligne : 48 | Méthode : in `alias_update'
Script : Scene_Map | Ligne : 46 | Méthode : in `loop'
Script : Scene_Map | Ligne : 59 | Méthode : in `alias_update'
Script : MAPPANEL | Ligne : 90 | Méthode : in `old_update'
Script : TempsJourNuit | Ligne : 248 | Méthode : in `update_passminimap'
Script : Minimap | Ligne : 44 | Méthode : in `update'
Script : Scene_Map | Ligne : 24 | Méthode : in `old_main'
Script : Scene_Map | Ligne : 19 | Méthode : in `loop'
Script : Scene_Map | Ligne : 29 | Méthode : in `old_main'
Script : TempsJourNuit | Ligne : 237 | Méthode : in `main_passminimap'
Script : Minimap | Ligne : 31 | Méthode : in `main'
Script : Main | Ligne : 49

Posté par Sphinx le 31 Juil - 13:20 (2009)
pas de 'if' dans une condition d'évents. C'est en scripts que tu auras le 'if'

Posté par Peter le 31 Juil - 14:01 (2009)
A ouais,merci,j'avait pas vu,j'ai fait un copier coller trop long. :gloups: