Sujet n°10289
Posté par
Legendaire45 le
26 Aoû - 09:00 (2011)Titre :
date dans une variable [Résolu]bonjour, j'ai besoin pour mon projet d'avoir l'année,le mois,le jour,l'heure et les minutes dans une même variable
ex: pour 26/08/2011 9h30 -> la variable doit contenir 201108260930
merci d'avance
Posté par
Nuri Yuri le
26 Aoû - 09:39 (2011)$game_variables[id]=Time.new
Après pour récupérer l'heur ou autre $game_variables[id].hour Mais attention, ça sauvegarde l'heure à la quel tu as fait $game_variables[id]=Time.new donc il faudra réutiliser cette commande ou ne pas sauvegarder l'heur et taire Time.now.hour
Les méthodes de time qui peuvent te servir sont :
hour => heure de 0 à 23
min => minute de 0 à 60
sec => seconde de 0 à 60
day => Jour du mois de 0 à 31
wday => Jour de la semaine de 1 à 7 (il me semble, je suis plus sur).
Après ça dépends de ce que tu veux faire, mais si tu veux sauvegarder un date genre le début de l'aventure c'est Time.new mais si tu veux la date de maintenant pour dire l'heure par exemple, ne la sauve pas et fait Time.now.
Posté par
Legendaire45 le
26 Aoû - 11:23 (2011)ca marche mais si je fait $game_variables[id]=Time.new.year, comment je fait pour récupérer le mois et le reste de manière a avoir:
annéemoisjourheureminute (201108260930 par ex)
Posté par
Pαlвσlѕку le
26 Aoû - 11:29 (2011)Voilà ce que je propose :
Code: |
$game_variables[id] = (Time.now().year.to_s + Time.now().month.to_s + Time.now().day.to_s + Time.now().hour.to_s + Time.now().min.to_s) |
Posté par
Brendan75 le
26 Aoû - 11:34 (2011)C'est mieux de faire comme ça je pense :
Code: |
$game_variables[id] = Time.now.strftime("%Y%m%d%H%M") |
Posté par
Nuri Yuri le
26 Aoû - 11:35 (2011)Tu fais : $game_variables[id]=Time.new
Et plus loin dans ces que tu veux tu fais $game_variables[id].year
ou $game_variables[id].month
Time contient déjà un nombre avec toute les méthodes qu'il faut pour sortir quelque chose de ce nombre donc utilise la, pas la peine de recréer des methodes pour ça car tu n'apporteras que plus de calcules.
@Palb' : Ce que tu viens de faire c'est la dernière chose à faire, utilise les maths et non les strings, car un string créé un objet et pèse plus de 8 octets dans ce cas donc ...
Code: |
$game_vairables[id] = Time.now.sec + Time.now.min * 100 + Time.now.hour * 10000 + Time.now.wday * 100000 + Time.now.day * 10000000 + Time.now.month * 1000000000 + Time.now.year * 10000000000000 #Saut de ligne à cause de la déformation du fofo, mais met tout sur une seul ligne. |
Edit : CODE A NE SURTOUT PAS UTILISER !, ça créé un Bignum (8 octet) et c'est vraiment pas utile, stock Time.new dans ta variable est fais tes opérations quand il faut.
Posté par
Legendaire45 le
26 Aoû - 12:14 (2011)j'ai légèrement modifier le code de brendan et tout marche merci beaucoup!!
edit:j'ai voulu ajouter 200 a cette variable(pour ajouter 2 heure) sauf que ca fait planter le jeu (par event)
Code: |
---------- Erreur de script : Interpreter Bis* ---------- ----- Version du logiciel : PSP DS v0.4 ----- Type TypeError ----- Message cannot convert Fixnum into String ----- Position dans Interpreter Bis* Ligne 394 ----- Backtrace Script : Interpreter Bis* | Ligne : 394 | Méthode : in `+' Script : Interpreter Bis* | Ligne : 394 | Méthode : in `command_122' Script : Interpreter Bis* | Ligne : 388 | Méthode : in `each' Script : Interpreter Bis* | Ligne : 388 | Méthode : in `command_122' Script : Interpreter 2 | Ligne : 63 | 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 : 89 | Méthode : in `oldUpdate' Script : Bouton_Rouge* | Ligne : 54 | Méthode : in `follow_me_update' Script : follow me | Ligne : 104 | Méthode : in `update' Script : Scene_Map | Ligne : 26 | Méthode : in `main' Script : Scene_Map | Ligne : 21 | Méthode : in `loop' Script : Scene_Map | Ligne : 34 | Méthode : in `main' Script : Main | Ligne : 58
|
Posté par
Pαlвσlѕку le
26 Aoû - 12:27 (2011) Citation: |
@Palb' : Ce que tu viens de faire c'est la dernière chose à faire, utilise les maths et non les strings, car un string créé un objet et pèse plus de 8 octets dans ce cas donc ... |
Les ordinateurs ont suffisamment de RAM pour stocker les objets qui pèse plus de 8 octets.
C'était vrai en 1998 mais maintenant en 2011 avec, pour ma part, 4 GO de RAM soit 4 294 967 296 octets, on s'en fou un peu.
legendaire45 a écrit: |
j'ai légèrement modifier le code de brendan et tout marche merci beaucoup!! edit:j'ai voulu ajouter 200 a cette variable(pour ajouter 2 heure) sauf que ca fait planter le jeu (par event) {{{log}}} |
C'est normal que ça bug.
Ce qui est enregistré dans ta variable est du type string, donc des caractères.
Or, tu essayes d'additionner 200 à des caractères ; tu peux donc comprendre pourquoi ça bug.
C'est comme si tu additionnais des chaussettes avec des lavabos, ça ne veut rien dire.
Posté par
Legendaire45 le
26 Aoû - 12:28 (2011)comment dois-je faire pour rajouter 2h
Posté par
Nuri Yuri le
26 Aoû - 12:47 (2011) Pαlвσlѕку a écrit: |
Les ordinateurs ont suffisamment de RAM pour stocker les objets qui pèse plus de 8 octets. C'était vrai en 1998 mais maintenant en 2011 avec, pour ma part, 4 GO de RAM soit 4 294 967 296 octets, on s'en fou un peu. |
Toi tu t'en fous parce que tu sait pas ce qu'il se passe après, faut savoir qu'a chaque création de strings et Bignum en ruby y'a des 4 octets pour les infos sur l'objet(object_id) plus 4 autres pour la taille (string) plus le reste pour le contenu, et à chaque fois que vous créez un String, le précédent n'est pas effacé car vous n'utilisez jamais le GC donc au bout d'un moment, ça fini par peser lourd, dois-je te rappeler combien bouffe PSP tout seul quand on arrive sur la map de départ ?
Utiliser des nombres Fixnum ne bouffe que 4 octets(object_id) car tous les Fixnums en ruby son considéré comme déjà créé il y a pas besoins de multiplier l'object id par 2 pour trouver le pointeur de l'objet, il faut soustraire 1 et divisé par deux pour trouver le Fixnum à partir de l'object_id, c'est là la grande différence. (les Fixnums vont de : -1073741823 à 1073741823 soit : -256*256*256*64+1 à 256*256*256*64-1)
Après utiliser un string pour la date si ce n'est pour ne pas l'afficher est une aberration pur et dur, voir même ça sert à rien.
Y'a deux solutions :
Utiliser deux Fixnum
Utiliser autre chose qu'un Fixnum (plus lourd)
Le première fixnum contiendrais les Heures et le jour de la semaine, l'autre la date.
Posté par
Legendaire45 le
26 Aoû - 13:11 (2011)Oula j'ai pas tout saisit, déja comment on utilise 2 fixnum, c'est complexe la!!
ou sinon peut-on convertir les string en quelque chose ou je peut ajouter une valeur??
Posté par
Sphinx le
26 Aoû - 14:02 (2011) Je tiens à souligner que :
et
sont des synonymes (seule différence : new permet de créer des dates à des instants précis (comme le 19 octobre 2032 à 7:41:07 par exemple, alors que now retourne forcément la date actuelle, comme le fait new par défaut (sans préciser d'arguments))
=> Ensuite :
Si tu veux ajouter une/plusieurs heure(s) à ta date, tu peux faire ca :
Code: |
$game_variables[id] = Time.new # équivalent à $game_variables[id] = Time.now # $game_variables[id] contient maintenant l'heure de ton ordinateur à l'instant
# Pour ajouter 4 heures à ce temps : $game_variables[id] += 4 * 3_600 # J'ajoute 4 heures, c'est à dire 4 * 60 * 60 (ou 4 * 3_600) secondes. # Le _ n'est pas indispensable mais peut être utilisé comme séparateur de milliers ;) Ca facilite la lecture
# Pour retirer 2 heures : $game_variables[id] -= 2 * 3_600 # Je retire 2 heures, c'est à dire 2 * 60 * 60 (ou 2 * 3_600) secondes.
# Enfin, voici comment récupérer les différentes valeurs : $game_variables[id].year # Retourne l'année de la date au format numérique (2011 pour le 5 juin 2011 par exemple) $game_variables[id].month # Retourne le mois de la date au format numérique (6 pour le 5 juin 2011 par exemple) $game_variables[id].day # Retourne le jour dans le mois de la date au format numérique (5 pour le 5 juin 2011 par exemple) $game_variables[id].hour # Retourne l'heure de la date au format numérique (10 pour 10h19:12) $game_variables[id].min # Retourne les minutes de la date au format numérique (19 pour 10h19:12) $game_variables[id].sec # Retourne les secondes de la date au format numérique (12 pour 10h19:12) $game_variables[id].strftime("%Y%m%d%H%M") # Retourne une chaine de caractères qui correspond à la date au format qui t'intéresse |
Pour avoir toutes les infos sur la classe Time, voici le lien vers la documentation officielle qui résume toutes les fonctions disponibles : http://www.ruby-doc.org/core/classes/Time.html ^^ Enjoy it !
Posté par
Nuri Yuri le
26 Aoû - 14:36 (2011)On peut mais les deux méthodes sont aussi chiantes.
Pour les fixnums :
Code: |
class Interpreter I_VarDate=200 I_VarHeur=201 DayMod=[31,29,31,30,31,30,31,31,30,31,30,31] def set_time $game_variables[I_VarDate]=0 $game_variables[I_VarHeur]=0 set_sec(Time.now.sec) set_min(Time.now.min) set_hour(Time.now.hour) set_wday(Time.now.wday) set_day(Time.now.day) set_month(Time.now.month) set_year(Time.now.year) end def set_sec(seconde=0,add=false) last_sec=$game_variables[I_VarHeur]%100 $game_variables[I_VarHeur]-=last_sec if add $game_variables[I_VarHeur]+=(last_sec+seconde)%60 else $game_variables[I_VarHeur]+=seconde%60 end end def set_min(minute,add=false) last_min=($game_variables[I_VarHeur]/100)%100 $game_variables[I_VarHeur]-=last_min*100 if add $game_variables[I_VarHeur]+=((last_min+minute)%60)*100 else $game_variables[I_VarHeur]+=(minute%60)*100 end def set_hour(heur,add=false) last_hour=($game_variables[I_VarHeur]/10000)%100 $game_variables[I_VarHeur]-=last_hour if add $game_variables[I_VarHeur]+=((last_hour+heur)%24)*10000 else $game_variables[I_VarHeur]+=(heur%24)*10000 end end def set_wday(jds,add=false) last_wday=($game_variables[I_VarHeur]/1000000)%10 $game_variables[I_VarHeur]-=last_wday*1000000 if add $game_variables[I_VarHeur]+=((last_wday+jds)%7)*1000000 else $game_variables[I_VarHeur]+=(jds%7)*1000000 end end def set_day(jour,add=false) last_day=($game_variables[I_VarDate])%100 $game_variables[I_VarDate]-=last_day jour-=1 modmois=DayMod[(($game_variables[I_VarDate]/100)%100)%13-1] if add $game_variables[I_VarDate]+=((last_day+jour)%modmoi+1) else $game_variables[I_VarDate]+=(jour%modmois+1) end end def set_month(mois,add=false) last_month=($game_variables[I_VarDate]/100)%100 $game_variables[I_VarDate]-=last_month mois-=1 if add $game_variables[I_VarDate]+=((last_month+mois)%12+1)*100 else $game_variables[I_VarDate]+=((mois%12)+1)*100 end end def set_year(year,add=false) last_year=($game_variables[I_VarDate]/10000)%10000 $game_variables[I_VarDate]-=last_year if add $game_variables[I_VarDate]+=((last_year+year)%10000)*10000 else $game_variables[I_VarDate]+=(year%10000)*10000 end end def get_sec $game_variables[I_VarHeur]%100 end def get_min ($game_variables[I_VarHeur]/100)%100 end def get_hour ($game_variables[I_VarHeur]/10000)%100 end def get_wday ($game_variables[I_VarHeur]/1000000)%10 end def get_day ($game_variables[I_VarDate])%100 end def get_month ($game_variables[I_VarDate]/100)%100 end def get_year ($game_variables[I_VarDate]/10000)%10000 end end |
Après dans ton évent t'initialise la Date avec set_time
Tu modifie les dates avec set_ type (set_sec par exemple) si tu met set_sec(0) ça mettra 0 si tu met set_sec(5,true) ça ajoutera 5 secondes.
Utilise le script de sphinx, avec Time, il gère tout.
Posté par
Legendaire45 le
26 Aoû - 18:32 (2011)oki mais j'explique ce que je veux faire, je veux enregistrer l'heure dans 1 variable, ensuite verifier si la variable 39 par ex est superieur ou egale a ma_variable sachant que la variable 39 a l'heure a l'heure de l'ordinateur a cet instant (time.now) et ma variable l'heure a la quel une action a effectuer et qui se termine au bout de 2h (un peut comme dnas ton intro de psp4g+ sphinx)
Posté par
Sphinx le
26 Aoû - 18:53 (2011) Si tu es sous 4G+ tu peux utiliser directement le chrono :
Code: |
creer_compteur(tps, nom, lancement) # tps = Nombre de secondes avant la fin du chronomètre # nom = Texte qui sera affiché au dessus du chronomètre ; si nom = "" ca n'affichera que le chronomètre # lancement = true si le chrono doit être lancé immédiatement, false sinon # Et si tu n'as pas lancé directement ton chrono, tu pourras le lancer avec cette commande : compteur.lancer |
Posté par
Legendaire45 le
27 Aoû - 11:49 (2011)Suite a tes conseille dans le chat, ça fonctionne, enfin presque
Pour ceux qui veule suivre, Sphinx ma proposé d'utiliser directement time.now (ex $game_variables[500] = Time.now) ensuite pour ajouter 2h de faire $game_variables[500] + 7200
Sauf que problemen au moment de comparer la variable 39(qui enregistre en permanence la date et l'heure du pc (note:j'utilise time.now) avec la variable 500 ben le jeu crash et me met cette erreur:
"comparison of Time with 99999999 failed"
Que dois-je faire??
merci d'avance!
Posté par
Nuri Yuri le
27 Aoû - 12:05 (2011)Arrête d'UP tes message, attends que quelqu'un répond.
Posté par
Sphinx le
27 Aoû - 18:49 (2011)Tu peux me montrer ton code s'il te plait ?
Posté par
Legendaire45 le
28 Aoû - 11:37 (2011)si c'est celui de l'event:
page 1
Page 2
L'event commun qui enregistre en permanence l'heure
Posté par
Sphinx le
28 Aoû - 11:58 (2011)Pour la condition "Si variable 39 > variable 500", essaies ptêtre plutôt de passer par une condition scriptée (les conditions d'évents prévues pour les variables sont concues pour gérer des valeurs numériques, pas des objets, d'où l'intérêt de passer par les conditions scriptées, où tu peux adapter tes conditions à tes valeurs) :
Code: |
$game_variables[39] > $game_variables[500] |
Posté par
Legendaire45 le
28 Aoû - 12:22 (2011)Aucun changement même bug!!
Code: |
---------- Erreur de script : Interpreter Bis* ---------- ----- Version du logiciel : PSP DS v0.4 ----- Type ArgumentError
----- Message comparison of Time with 99999999 failed
----- Position dans Interpreter Bis* Ligne 409
----- Backtrace Script : Interpreter Bis* | Ligne : 409 | Méthode : in `>' Script : Interpreter Bis* | Ligne : 409 | Méthode : in `command_122' Script : Interpreter Bis* | Ligne : 388 | Méthode : in `each' Script : Interpreter Bis* | Ligne : 388 | Méthode : in `command_122' Script : Interpreter 2 | Ligne : 63 | 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 : 89 | Méthode : in `oldUpdate' Script : Bouton_Rouge* | Ligne : 54 | Méthode : in `follow_me_update' Script : follow me | Ligne : 104 | Méthode : in `update' Script : Scene_Map | Ligne : 26 | Méthode : in `main' Script : Scene_Map | Ligne : 21 | Méthode : in `loop' Script : Scene_Map | Ligne : 34 | Méthode : in `main' Script : Main | Ligne : 58
|
contenue de la ligne 409 et 410 cité dans le log
Code: |
if $game_variables[i] > 99999999 $game_variables[i] = 99999999
|
Posté par
Nuri Yuri le
28 Aoû - 12:28 (2011)9999999999 n'est pas une date donc il ne peux pas comparer.
Posté par
Legendaire45 le
28 Aoû - 12:42 (2011)mais comment ce fait-il qu'il y a 9999999999 dans ma variable!! alors que la variable 39 vaut time now ($game_variables[39] = Time.now) et la 500 parelle mais avec 7200 en +
Code: |
$game_variables[500] = Time.now $game_variables[500] + 7200
|
Posté par
Nuri Yuri le
28 Aoû - 12:53 (2011)ça peux être 9999 ou 555 voir même -1, c'est pas une date.
Pour qu'elle soit comparable avec un nombre il faut la convertir en nombre.
Posté par
Sphinx le
28 Aoû - 13:00 (2011)Tu as essayé avec la condition scriptée, Legendaire ? (:! Les conditions d'évents n'acceptent pas les valeurs supérieures à 99_999_999 apparemment)
Posté par
Legendaire45 le
28 Aoû - 13:09 (2011)oui regarde page 2 de mon event
peut être que ca coince au niveau de l'ajout des 7200, je vais essayer!!
Edit: il n'y a plus l'erreur,maintenant faut que je verifie si le calcul et la comparaison est bien pris en compteedit2: bug surement au niveau du calcul car dès que l'on a planter la baie sa page a la page 3 de l'event qui indique que la baie a fini de poussé.Par contre si je recule l'heure (de mon pc)juste apres avoir plantée la baie (ex: 3h),alors sa passe bien a la page 2 mais ca freeze a cause surement de la boucle!!edit3:bug du calcul corrigée (il fallauit que fasse $game_variables[500] += 7200) par contre toujour le freeze au niveau de la boucle
Posté par
Sphinx le
28 Aoû - 13:28 (2011) Pourquoi une boucle d'ailleurs ?
=> Si tu veux une boucle, et ne pas freeze ton jeu, il faut que ton évent soit en processus parallèle
Posté par
Legendaire45 le
28 Aoû - 13:40 (2011)nickel, ca fonctionne super vien par contre comment faire en sorte qu'une fois la baie plantée sa passe a la page 2 automatiquement, parce que pour que sa prenne en compte le plantage de la baie il faut changer de map!!
Posté par
Sphinx le
28 Aoû - 14:17 (2011)Page 1 : Commande - Activer interrupteur local A
Page 2 : Condition de démarrage - Si interrupteur local A est activé...
Posté par
Legendaire45 le
28 Aoû - 18:53 (2011)oki tout marche merci!!