IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

question sur le déplacement de sprites


Sujet :

Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut question sur le déplacement de sprites
    Salut
    Dans la partie jeux vidéo je n'ai pas su où placer ma question donc je la place ici vu qu'elle concerne un code en delphi.

    Je cherche à déplacer 3 sprites, dont deux ont une vitesse double du troisieme, et si je fais le shéma suivant :

    1 - Début de la boucle principale du jeu.
    2 - Calcul des positions des sprites
    3 - Modification de la position des sprite de : position+vitesse.
    4 - Affichage des sprites à leur nouvelle position.

    Pour le sprite rapide cela va générer un sprite faisant un pas de géant sur l'écran car déplacé d'une position x à une position x+Vitesse.
    Hors ce que je voudrais c'est que l'on voit bien les pas fait par chaque sprite et non un pas de géant.
    Comment intégrer les différents pas dans la boucle principale du jeu ? (vu que cette boucle est ultra-rapide)

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Citation Envoyé par dragonno Voir le message
    Salut
    Dans la partie jeux vidéo je n'ai pas su où placer ma question donc je la place ici vu qu'elle concerne un code en delphi.

    Je cherche à déplacer 3 sprites, dont deux ont une vitesse double du troisieme, et si je fais le shéma suivant :

    1 - Début de la boucle principale du jeu.
    2 - Calcul des positions des sprites
    3 - Modification de la position des sprite de : position+vitesse.
    4 - Affichage des sprites à leur nouvelle position.

    Pour le sprite rapide cela va générer un sprite faisant un pas de géant sur l'écran car déplacé d'une position x à une position x+Vitesse.
    Hors ce que je voudrais c'est que l'on voit bien les pas fait par chaque sprite et non un pas de géant.
    Comment intégrer les différents pas dans la boucle principale du jeu ? (vu que cette boucle est ultra-rapide)
    si tu veux une animation de qualité, tu dois calculer la distance parcourue par chaque sprite dans l’intervalle de temps qui séparer deux rendus.

    tu utilises par exemple GetTickCount à chaque OnPaint pour savoir combien de millisecondes se ont passées depuis le dernier Paint et tu déplaces tes sprites en conséquence. Reste plus qu'à rafraichir l'écran périodiquement.

    Tu peux également périodiquement calculer la position des sprites pour voir s'il est nécessaire de rafraichir l'écran...c'est selon.

    tu peux regarder ce code par exemple. Je constate d'ailleurs qu'il y a une boulette sur la création des ennemies...je donne 5% de change de création mais sans tenir compte du temps passé, du coup sur une machine rapide les ennemies arrivent par vagues

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Je te remercie de ta réponse, elle est claire et je comprend ce que tu veux dire mais je ne comprend pas comment cela permet de faire deux pas au sprite rapide dans le tour de boucle et faire aussi un seul pas pour le sprite lent.

    En fait c'est ma question que je ne sais pas poser je crois, car j'ai un TimageList dans lequel je vais piocher les 3 images représentant un seul pas d'un sprite, mais comment donner l'impression visuelle que le sprite rapide fait 3 pas au moment où le sprite lent n'en fait qu'un, c'est à dire dans le tour de boucle principale.
    En fait je me demande même si tout ça doit entrer dans la boucle principale car elle est vraiment très rapide (pour permettre la gestion clavier) et donc les pas des sprites seraient comme un eclair cela semble impossible pour moi.
    Donc ma question c'est où mettre le code d'animation des sprites voilà, sachant qu'il y a des sprites qui font plus de pas que d'autres.

    Je vais voir le code que tu m'a donné

    PS: J'ai Delphi 5 ou Lazarus aussi.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Citation Envoyé par dragonno Voir le message
    Je te remercie de ta réponse, elle est claire et je comprend ce que tu veux dire mais je ne comprend pas comment cela permet de faire deux pas au sprite rapide dans le tour de boucle et faire aussi un seul pas pour le sprite lent.

    En fait c'est ma question que je ne sais pas poser je crois, car j'ai un TimageList dans lequel je vais piocher les 3 images représentant un seul pas d'un sprite, mais comment donner l'impression visuelle que le sprite rapide fait 3 pas au moment où le sprite lent n'en fait qu'un, c'est à dire dans le tour de boucle principale.
    En fait je me demande même si tout ça doit entrer dans la boucle principale car elle est vraiment très rapide (pour permettre la gestion clavier) et donc les pas des sprites seraient comme un eclair cela semble impossible pour moi.
    Donc ma question c'est où mettre le code d'animation des sprites voilà, sachant qu'il y a des sprites qui font plus de pas que d'autres.

    Je vais voir le code que tu m'a donné

    PS: J'ai Delphi 5 ou Lazarus aussi.
    ah j'ai compris ta question je me suis posé ce genre de questions pour le défunt projet ADK.

    pour avoir une animation qui soit acceptable le déplacement en pixels doit correspondre à l'animation, sinon le personnage donne l'impression de marcher sur place ou de glisser en marchant...du coup la vitesse de déplacement et le framerate sont intimement liés.

    Si tu veux un sprite qui se déplace deux fois plus vite que l'autre, il faut que tu affiches les images deux fois plus vite

    si tu prend 2 secondes entre deux images pour le sprite lent, il faut 1 seconde entre chaque image pour le sprite rapide.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Je te remercie, mais où et à quel endroit de mon code je charge les images de l'animation ? car la boucle principale est très rapide et ça ne pourrait pas le faire, ça ferait un déplacement éclair

    Par exemple, est-ce que je dois dissocier la boucle d'animation des sprites de la boucle principale (chargée notamment de la gestion des touches) qui est très rapide, et si oui comment faire pour que les deux boucles ne se croisent pas dans le temps, il faudrait que la boucle principale (rapide) attende que la boucle d'animation (plus lente) ait terminé et cela la ralentirait.

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Citation Envoyé par dragonno Voir le message
    Je te remercie, mais où et à quel endroit de mon code je charge les images de l'animation ? car la boucle principale est très rapide et ça ne pourrait pas le faire, ça ferait un déplacement éclair
    ben peu importe

    dans un projet j'utilise Application.OnIdle, je regarde combien de Ticks sont passés depuis le dernier OnIdle et je teste si cela entraine des mises à jours

    il faut par exemple cumuler 1000ms pour que le sprite rapide change d'image, et 2000ms pour les sprites lents.

    donc chaque Sprite contient un compteur de ticks, à chaque OnIdle tu ajoutes le nombre de ticks passés depuis le dernier OnIdle à chaque Sprite, et si pour un sprite donné le nombre de ticks est suffisant hop il change d'image (et se déplace du coup).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    procedure TMainForm.OnIdle(Sender: TObject; var Done: Boolean);
    var
      t, dt: Cardinal;
    begin
      t := GetTickCount;
      if FTimer > 0 then
      begin
        dt := t - FTimer;
        DoTicks(dt);
      end;
      FTimer := t;
      Done := False;
    end;
     
    procedure TMainForm.DoTicks(Count: Cardinal);
    var
      i : Integer;
    begin
      for i := 0 to SpriteList.Count - 1 do
      begin
       SpriteList[i].AddTicks(Count);
      end;
    end;
     
    procedure TSprite.AddTicks(Count: Integer);
    begin
      Inc(FTicks, Count);
      if FTicks < FDelay then
        Exit;
      while FTicks > FDelay do
      begin
        Dec(FTicks, FDelay);
        Inc(FImage);
        if FImage > FImageCount then FImage := 0; 
        Inc(X, Dx); // Dx et Dy en fonction de l'image, la direction...
        Inc(Y, Dy);
      end;
      MainForm.Invalidate; // ou tout autre code pour faire un nouveau rendu
    end;

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Ah ok je comprend, c'est une sorte d'horloge commune sur laquelle se basent les deux sprites pour faire leur pas respectifs avec chacun le nombre de coups d'horloge dont il a besoin pour faire un pas.

    Mais je suis en Delphi 5 et je ne sais pas si ce que tu m'indique est faisable (compteur de ticks, à chaque OnIdle ), peut-être qu'il faut que je me fasse cette horloge commune d'une façon plus classique ?

    Par exemple si je fais une horloge (timer) commune et principale avec un temps T.
    A chaque temps T j'incrémente un compteur "Compte".

    Et que je mette dans cette boucle le code suivant :
    If(Compte>=sprite.vitesse)
    {
    // incrémenter la position x,y du sprite d'un pas.
    // changer l'image du sprite correspondant au pas.
    // remettre à zero le compteur "Compte".
    }

    Cela le ferait pour tous les sprites en fait mais avec chacun sa vitesse.

    Je te remercie de ton aide c'est vraiment super !!!
    J'ai l'impression d'avancer dans mon jeu là !

    PS : dans mon précédent post on s'est croisé, regarde

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    lol, j'ai modifié mon dernier post 3 fois en 2 minutes pour etre plus précis dans ma réponse/question
    Je dis ça pour ceux qui l'auraient vu avant les changements

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 451
    Points
    28 451
    Par défaut
    Application.OnIdle existe dans D5 et GetTickCount est dans l'API Windows...mais si tu es plus à l'aise avec un Timer c'est le même principe.

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Ah ok je te remercie de ces infos

    J'ai une autre question mais je vais la poser en nouveau sujet

Discussions similaires

  1. [Delphi 7] Question sur déplacement fichier sur icone..
    Par shell13010 dans le forum Langage
    Réponses: 5
    Dernier message: 14/07/2009, 17h52
  2. question sur déplacement professionnel
    Par sebinou27 dans le forum Paie
    Réponses: 0
    Dernier message: 06/11/2007, 13h23
  3. [XP Pro Sp2]Question sur Déplacement de program files
    Par AdHoc dans le forum Windows XP
    Réponses: 1
    Dernier message: 21/02/2007, 20h37
  4. Réponses: 2
    Dernier message: 26/07/2006, 00h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo