Page 1 sur 2
Partie Demonstration d'un Jeu
Publié : mer. 20/oct./2004 8:00
par Thyphoon
Salut les enfants
J'aurais besoin de vos lumière ! Vous savez dans Jeu d'Arcade souvant on a une demo on le personage se deplace tout seul ! Je voudrais faire la même chose! au depart je suis partit dans l'idée d'enregistrer les touches appuyer a chaque cycle dans un fichier! le problème c'est que certaine chose evolue non pas par rapport au nombre de cycle mais par rapport a un temps et si on change de pc ou si on a une tache qui derrière le jeu ralenti un peu pour X raison on est totalement décalé !
Comment a votre avis faudrait il procedé ?
Merci d'avance
Thyphoon
ça fait 3 mois que j'ai commencé mon jeu, 3 mois que j'ai commencé le purebasic...et je suis de plus en plus satisfait de mon jeu ...Peut-être une nouvelle version demo prochainement !

)
Publié : mer. 20/oct./2004 8:30
par Crystal Noir
si je comprend bien tu voudrais faire une démo pré enregistrée de ton jeu qui n'est pas jouable où ton perso se déplace automatiquement suivant le niveau c'est ca ?
Publié : mer. 20/oct./2004 9:06
par Thyphoon
L'idée c'est si la personne reste trop longtemps sur la page de presentation alors le jeu se lance et se joue tout seul , en vérité ça rejourais une partie pré-enregistrer !
Souvant on vois ça sur les bornes d'arcade ! tant que tu n'as pas mis de piece tu vois une partie enregistré se deroulé ! ça permet de voir les niveaux et le type de jeu !
L'idée c'est ça !
Dans un premier temps enregistré une partie et dans un deuxième temps qu'elle se rejoue tout seul !
Au depart mon idée était a chaque cycle de la boucle enregistré des données dans un fichier
genre
Code : Tout sélectionner
if Demo=1
WriteLong(KeyboardPushed(Key_right))
WriteLong(KeyboardPushed(Key_Left))
WriteLong(KeyboardPushed(Key_Up))
WriteLong(KeyboardPushed(Key_Down))
WriteLong(KeyboardPushed(Key_Action))
Endif
puis ensuite de les récupérer
Code : Tout sélectionner
if Demo=2
Demo_Right=ReadLong()
Demo_Left=ReadLong()
Demo_Up=ReadLong()
Demo_Down=ReadLong()
Demo_Action=ReadLong()
Endif
et ensuite dans la syntax il suffisait d'un
Et comme je le disais le pb c'est que beaucoup de choses réagisse en fonction du temps et pas en fonction des cycles.chose qui varie d'un pc a un autre...
J'utilise tres souvants pour les animations du perso des
Code : Tout sélectionner
If ElapsedMilliseconds() > waitstate
waitstate=ElapsedMilliseconds()+20
; je change d'image pour l'animation
endif
Je sais pas si je suis tres claire !!
Publié : mer. 20/oct./2004 9:41
par Crystal Noir
oui c clair.
mmmmmh pas évident. A la rigueur tu peux essayer de le faire en différé, mais j'ai peur que ca bouffe trop de ressources.
C'est à dire que par ex tu crées une liste chainée des évènements clavier (comme si ct un fichier) donc en fait lui au lieu d'écrire sur le disque il écrira dans ta liste chaînée (une liste de commande en somme) sachant que chaque objet de ta liste pourra avoir des paramètres propres (longueur d'appui sur la touche etc....) .
Donc en clair là on écrit dans la mémoire. C'est là que j'ai peur que ca bouffe des ressources mais on peut essayer.
Une fois que tout est enregistré dans la liste chaînée (ou un tableau mais bon faudrait un énorme tableau donc la liste me parait mieux), une fois que tout est enregistré là tu fais patienter un peu et tu recopies tout ce qu'il a dans la liste dans un fichier sur disque dur.
Donc en clair en différé, c'est à dire que l'écriture sur disque se ferait une fois la démo enregistré dans une liste.
De ce fait, il n'y aura pas d'écriture physique sur le disque ce qui peut peut être te faire gagner en vitesse sans qu'il y ait des contretemps par ex (du à l'écriture).
Ca peut être une idée, mais je sais pas si ca peut marcher, j'ai peur que ca bouffe gros en ressources, bien que les liste chainées soit pas mal optimisée pour faire justement des listes (mdr) que ce soit des listes de commandes, des listes d'ennemis etc...
Publié : mer. 20/oct./2004 9:44
par Thyphoon
Merci ! c'est peut être une idée a creusé !
je vais étudier ça... si je trouve une solution je la posterais là ! ça peut toujours servir a d'autre !
mais si quelqu'un d'autre a une idée qu'il n'hesite pas
Publié : mer. 20/oct./2004 9:57
par Crystal Noir
tiens nous au courant

Publié : mer. 20/oct./2004 11:19
par comtois
dans Sokoban3D , j'avais fait un truc de ce genre .
Pendant que tu joues j'enregistre les mouvements du robot .
je ne sais plus comment , faudrait que je me replonge dans le code .
et si tu gagnes la partie avec un score meilleur , alors j'enregistre ta partie comme solution pour le niveau .
en clair , quand tu demandes à jouer une solution pour un niveau ,c'est une partie qui a été enregistrée qui se joue .
donc ça pourrait correspondre à ce que tu recherches.
et j'avais effectivement utilisé une liste chainée .
Publié : mer. 20/oct./2004 11:24
par Crystal Noir
je suis moins bête que je ne le pensais alors lol
Publié : mer. 20/oct./2004 11:27
par Thyphoon
@comtois Tu as tout compris ! si jamais tu remet la main sur ton code (ou sur le principe du code...je suis grandement interessé
@Crystal Noir héhé je pense effectivement que les listes chainés sont sans doute la solution
Publié : mer. 20/oct./2004 11:38
par comtois
le code est disponible sur mon site , tu peux déjà fouiller un peu dedans
Publié : mer. 20/oct./2004 11:46
par Thyphoon
super je vais voir de ce pas !! :p
Re: Partie Demonstration d'un Jeu
Publié : mer. 20/oct./2004 12:18
par ZapMan
Thyphoon a écrit :le problème c'est que certaine chose evolue non pas par rapport au nombre de cycle mais par rapport a un temps et si on change de pc ou si on a une tache qui derrière le jeu ralenti un peu pour X raison on est totalement décalé !
Si les taches que effectue pendant un cycle ne sont pas trop lourdes, et si tu as une instruction delay() dans ta boucle, le timing devrait rester constant quelles que soient les applis qui tournent derrière :
-> pendant les delay(), ton programme rend la main aux autres applis qui profitent du delay() pour s'exécuter. Si elles sont polies (et bien écrites !) elles ont aussi des delay() dans leurs boucles qui rendent la main à ton programme. Tant que le CPU n'est pas utilisé à 100%, tout se passe bien.
Tu peux aussi enregistrer GetTickCount_() en début de boucle et regarder le temps qui s'est écoulé depuis le début de boucle de cette façon :
Code : Tout sélectionner
TempsDepart = GetTickCount_()
While TantQueCaDure
Tempsactuel = GetTickCount_() - TempsDepart
.
.
.
delay(10)
Wend
Publié : mer. 20/oct./2004 17:47
par comtois
il y a une partie du code ici
Code : Tout sélectionner
Procedure AddUndo()
If Niveau\SolutionEnCours = #False And Joueur\Bouge = 0 And Joueur\Pas
Joueur\Bouge = 1
AddElement(Solution())
Solution()\JoueurX = Joueur\PosX
Solution()\JoueurZ = Joueur\PosZ
Solution()\JoueurAngle = Joueur\AngleX
;/une caisse est en cours de déplacement ?
If Joueur\BougeCaisse > 0
ac = EntityX(Joueur\BougeCaisse) / #TailleEntity : bc = EntityZ(Joueur\BougeCaisse) / #TailleEntity
Solution()\Caisse = Joueur\BougeCaisse
Solution()\CaisseX = ac
Solution()\CaisseZ = bc
EndIf
EndIf
EndProcedure
une autre dans la procédure TestPosition
Code : Tout sélectionner
;/Le robot est en place
Joueur\Pas = 0
;utilisé pour enregistrer chaque déplacement du robot ( pour la fonction Undo )
Joueur\Bouge = 0
le principe c'est que j'enregistre des positions sur la map ( et l'angle du robot ) , je ne m'occupe pas des touches .
Joueur\Pas = le robot bouge
Joueur\Bouge = 0 => le robot était à l'arrêt , on peut enregistrer ce point
Publié : mer. 20/oct./2004 17:52
par Thyphoon
Merci comtois je vais analyser ça !
Je sais pas si ça peu marcher dans mon cas ! car beaucoup de chose réagisse en fonction du temps et du perso. Deplus ce dernier a énormement de mouvement ... Donc pour moi la seul solution si je veux pas sauvegarder trop de paramètre ce sont les touches et leur durée...
Mais je vous tient au courant ! En tout cas merci pour l'aide

Publié : mer. 20/oct./2004 17:55
par comtois
oui il faut adapter selon la situation
J'avais commencé avec les touches, mais si je m'endormais dessus , j'enregistrais inutilement des données , avec une gestion du temps , ça va limiter la taille des données
et puis , c'est une présentation , quelques secondes de jeu peuvent suffire , à différents niveaux de la partie , ça peut rendre assez bien .