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)

log


 
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. Clin d'œil foireux

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. Clin d'œil foireux

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)
Clin d'œil foireux Je tiens à souligner que :
Code:
Time.new

et
Code:
Time.now

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)
Imbécile heureux 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 ? Clin d'œil foireux

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!!
log

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 compte


edit2: 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)
Imbécile heureux 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 Clin d'œil foireux

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)
Imbécile heureux

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!!