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

Développement 2D, 3D et Jeux Discussion :

problème d'algorithme snake


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut problème d'algorithme snake
    Bonjour à tous,
    Je viens chercher conseil car je rencontre un petit problème, et à la force d'avoir le nez dedans je n'y vois plus rien.

    J'ai codé un snake (cpp + sdl). Je suis parti d'un algo que j'avais fais pour la gestion du serpent. Mais une fois codé est apparu un problème.

    Mon serpent est composé de 'case' (des bitmap de 5*5 pix). Quand le snake mange une pomme une case est alors ajouté.

    Mon algo actuel de gestion du serpent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int tab_snake[][];//variable globale
     
    méthode initialiser_serpent(position_x_de_départ, position_y_de_départ, nombre_case_serpent)
     
    début
           pour i allant de 0 a nb_case
                  tab_snake[i][0] = position_x_de_départ;
                  tab_snake[i][1] = position_y_de_départ;
                  position_x_de_départ = position_x_de_départ + 5;
          fin pour
    fin
    par exemple un tableau créé pourrait être:
    200 | 150
    205 | 150
    210 | 150
    215 | 150
    220 | 150

    Ca me donne un serpent composé de 5 bitmap au coordonnées du tableau.

    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
     
    méthode déplacer_serpent(int direction, int nb_case)
    début
        for(int i = nb_case-1; i > 0; i--)
        {
            tab_snake[i][0] = tab_snake[i-1][0];
            tab_snake[i][1] = tab_snake[i-1][1];
        }
     
        if(direction == 0)
        {
    		tab_snake[0][0] = tab_snake[0][0] - 5;
        }
        if(direction == 1)
        {
    		tab_snake[0][0] = tab_snake[0][0] + 5;
        }
        if(direction == 2)
        {
    		tab_snake[0][1] = tab_snake[0][1] - 5;
        }
        if(direction == 3)
        {
    		tab_snake[0][1] = tab_snake[0][1] + 5;
        }
    fin
    explication:
    Ma méthode déplacer_snake va dans un premier temps faire basculer une ligne n a une ligne n+1 et ensuite en fonction de la direction mettre a jour la tete du serpent (tab_snake[0][0] et tab_snake[0][1]).

    Enfin dans ma boucle de rendu j'affiche tab_snake a chaque tour de boucle.

    Tous ca fonctionne bien. Seulement je n'avais pas pensé à la vitesse.... et oui ca va tres tres tres vite. Alors j'ai tenter des baisser le fps, mais en passant a 20 fps par exemple le rendu est médiocre (pas assez fluide) et cette solution n'est pas propre.

    Ici je suis tributaire de la taille des mes bitmap pour la vitesse du snke en fait.

    j'èspère avoir été clair, comment modifié la vitesse de mon snake (autrement dit ses coordonnées) tout en gardant mon ratio de 5pix....

    merci à vous

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    La gestion de la vitesse a été maintes fois abordée; il faut à intervalles régulier rafraichir la position du sprite ; cette intervallle c'est un peu empirique ( en ms ) à toi de le fixer.
    Regarde dans les FAQ de cette section il faut utiliser SDL_GetTicks() ( je crois mais pas certain que cette méthode s'appelle ainsi )
    Sinon d'une machine à une autre qui tournent à des vitesses différentes tu ne seras pas synchro.

  3. #3
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Hé bien oui, j'ai dis que je l'utillisais puisque j'ai dis que j'avais tester en déscendant a 20 fps, et que c'était jouable mais le rendu était pas terrible.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Pour les questions de rendu, il faut distinger deux choses différentes :
    - l'affichage (le FPS), celui-ci peut-être élevé et dépendant de la vitesse de la machine (plus il est élevé mieux c'est)
    - la vitesse du jeu (du serpent) : là il faut cadencer (avec par exemple SDL_GetTicks()) pour que la vitesse soit constante et fixée.

    La vitesse du jeu doit donc être independante du FPS.

    Sinon, la gestion des coordonnées du serpent pourrait être optimisée (a priori c'est inutile de déplacer toutes les coordonnées du serpent à chaque déplacement). Cela dit dans le cadre d'un PC et d'un jeu du type serpent ce n'est pas quelque chose de critique.

  5. #5
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    En fait je crois être obligé de déplacer tous les point du snake .

    En fait je fais comme ca:
    position du snake a t:
    200 | 150
    205 | 150
    210 | 150
    215 | 150
    220 | 150

    a t+1
    195 | 150
    200 | 150
    205 | 150
    210 | 150
    215 | 150

    puis si a t+2 le joueur appui en haut (en y- donc)
    a t+2:
    195 | 145
    195 | 150
    200 | 150
    205 | 150
    210 | 150

    maintenant dans ma boucle de rendu je fais cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    const unsigned int fps = 20;
    if(SDL_GetTicks() > (checkTime + 1000 / fps) )
    {
          .....affichage du fond puis du snake.....
    }
    et pour le moment le moyen que j'ai de faire varier la vitesse du snake et de faire varier les fps.

    Je sais que c'est uniquement un problème d'algo, je devrais pouvoir faire varier la vitesse de mon serpent en ayant toujours le meme fps.

    Seulement avec mon système de tableau, qui pour moi est le moyen qui représente le serpent (chaque points prends le points suivant en respectant les 5*5pix de la bitmap), je ne peux pas 'moduler' mes coordonnées sans compromettre le ratio de 5pix.

    Voulou, si quelqu'un a une idée d'algo?

    mici beaucoup, bonne journée

  6. #6
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Salut,

    D'après ton code, pour faire varier la vitesse du serpent il faudrait juste temporiser l'accès à ta fonction deplacer_serpent() c'est bien ca ?

    Par exemple si ton serpent avance toutes les 500ms d'une case, il ne faudra y accéder à cette fonction qu'une fois toutes les 500ms.

    Donc si je me trompe pas un timer comme ça devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    temps_du_mouvement = 500; // 500ms
    if (SDL_GetTicks() > old_move_time + temps_du_mouvement)
    {
        deplacer_serpent(...);
        old_move_time = SDL_GetTicks();
    }
    // ... affichage decors + serpent

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par skysee Voir le message
    Hé bien oui, j'ai dis que je l'utillisais puisque j'ai dis que j'avais tester en déscendant a 20 fps, et que c'était jouable mais le rendu était pas terrible.
    on n'a pas assez de code ; il faut utiliser une SDL_Surface "Off" et une autre surface directe et utiliser la technique du "back buffer".
    Dessiner dans la surface "Off" d'abord...

    ( et puis SDL ça rame )

  8. #8
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Citation Envoyé par Polyfructol Voir le message
    Salut,

    D'après ton code, pour faire varier la vitesse du serpent il faudrait juste temporiser l'accès à ta fonction deplacer_serpent() c'est bien ca ?

    Par exemple si ton serpent avance toutes les 500ms d'une case, il ne faudra y accéder à cette fonction qu'une fois toutes les 500ms.

    Donc si je me trompe pas un timer comme ça devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    temps_du_mouvement = 500; // 500ms
    if (SDL_GetTicks() > old_move_time + temps_du_mouvement)
    {
        deplacer_serpent(...);
        old_move_time = SDL_GetTicks();
    }
    // ... affichage decors + serpent

    Bonsoir,
    merci à toi ca résoud mon problème.
    Désolé Mat d'avoir mal saisi ou tu voulais en venir avec SDL_GetTicks().

    Encore merci a vous bye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Implementation algorithme Snake
    Par b_reda31 dans le forum Traitement d'images
    Réponses: 29
    Dernier message: 23/02/2008, 19h34
  2. [linprog] Problème avec algorithme simplex
    Par barbylon dans le forum MATLAB
    Réponses: 4
    Dernier message: 12/11/2007, 18h29
  3. problème exo algorithme
    Par greg96 dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 17/06/2007, 15h25
  4. Réponses: 10
    Dernier message: 23/05/2007, 09h30
  5. problème d'algorithme pour trouver les circuit d'un graphe
    Par marc_dd dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 21/08/2006, 16h36

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