Partie Demonstration d'un Jeu

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Partie Demonstration d'un Jeu

Message 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)
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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 ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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 !!
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message 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...
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

tiens nous au courant :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 .
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

je suis moins bête que je ne le pensais alors lol
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

le code est disponible sur mon site , tu peux déjà fouiller un peu dedans
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

super je vais voir de ce pas !! :p
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Re: Partie Demonstration d'un Jeu

Message 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
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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 .
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre