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 ! :o)

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

Code : Tout sélectionner

If KeyboardPushed(Key_right) or  Demo_Right
  ...
Endif
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 :D

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 :D

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 .