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

C++ Discussion :

Objets qui se suivent en SDL


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Objets qui se suivent en SDL
    Bonjour je suis en train de coder un snake et je me confronte au problème suivant lorsque je change rapidement de direction ( voir l'image).

    Nom : probleme snake.png
Affichages : 106
Taille : 3,3 Ko

    Pourtant j'utilise une fonction qui ,pour déplacer chaque parties du corps, récupère les positions de la parties précédentes. Voici la dite fonction :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    for(int unsigned i = 1; i < coordonneePosition.size(); i++)
        {
            switch(direction)
            {
            case 0:
                if(coordonneePosition[i].y > coordonneePosition[i-1].y)
                {
                    coordonneePosition[i].y--;
                }
                if(coordonneePosition[i].y < coordonneePosition[i-1].y)
                {
                    coordonneePosition[i].y++;
                }
                 if(coordonneePosition[i].y == coordonneePosition[i-1].y)
                 {
                      coordonneePosition[i].x = coordonneePosition[i-1].x + 25;
                 }
     
                break;
            case 1:
                 if(coordonneePosition[i].y > coordonneePosition[i-1].y)
                {
                    coordonneePosition[i].y--;
                }
                if(coordonneePosition[i].y < coordonneePosition[i-1].y)
                {
                    coordonneePosition[i].y++;
                }
                 if(coordonneePosition[i].y == coordonneePosition[i-1].y)
                 {
                      coordonneePosition[i].x = coordonneePosition[i-1].x - 25;
                 }
                break;
            case 2:
                  if(coordonneePosition[i].x > coordonneePosition[i-1].x)
                {
                    coordonneePosition[i].x--;
                }
                if(coordonneePosition[i].x < coordonneePosition[i-1].x)
                {
                    coordonneePosition[i].x++;
                }
                 if(coordonneePosition[i].x == coordonneePosition[i-1].x)
                 {
                      coordonneePosition[i].y = coordonneePosition[i-1].y + 25;
                 }
                break;
            case 3:
                 if(coordonneePosition[i].x > coordonneePosition[i-1].x)
                {
                    coordonneePosition[i].x--;
                }
                if(coordonneePosition[i].x < coordonneePosition[i-1].x)
                {
                    coordonneePosition[i].x++;
                }
                 if(coordonneePosition[i].x == coordonneePosition[i-1].x)
                 {
                      coordonneePosition[i].y = coordonneePosition[i-1].y - 25;
                 }
                break;
     
            }
        }
    Pouvez vous m'indiquez l'erreur de mon idée ??

    D'avance merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu devrais plutot chercher l'erreur dans le changement de direction que le suivi des objets. Ils se suivent correctement, ton screenshot le montre bien.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Il n'y as pas de soucis avec la direction c'est juste le fait que comme la tete est en mouvement permanent le corps ne suit pas le chemin que la tête a décris, il cherche la trajectoire la plus courte !

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Pour ton switch, je suppose que tu utilise la direction de la tête, ça ne serait pas plutôt la direction de la partie précédente que tu devrais utiliser?
    sinon une solution plus élégante serait de faire une liste chainée de tes maillon, ça serait plus simple pour toi....
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    D'accord merci, je vais tout d'abord essayer de travailler avec la direction de chaque parties et si je bloque encore je me mettrais aux listes chaînées !

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    L'avantage de la liste, c'est que le "déplacement" consiste à rajouter un maillon en tête, et retirer le dernier.

    Tu as surement constaté que visuellement, les maillons intermédiaires ne se déplacent pas.

    D'ailleurs, en déplacement normal, tu n'auras pas forcément d'allocation mémoire, il suffit de procéder ainsi:
    1. défaire le lien entre l'avant dernier maillon et le dernier.
    2. modifier les coordonnées de "dernier" pour le mettre à la nouvelle position de la tête
    3. lier le premier maillon comme suivant du "dernier".
    4. considérer que la tête de la liste est "dernier".


    Et l'augmentation de taille sera encore plus simple:
    1. créer un nouveau maillon à la nouvelle position de la tête
    2. lier le premier maillon comme suivant du "nouveau".
    3. considérer que la tête de la liste est "nouveau".
    4. ne pas déplacer le vers ce tour-ci, c'est déjà fait.


    Ceci n'est pas vrai si les maillons ont chacun une texture unique, et stockée dedans.
    Mais ce serait une erreur, il vaut mieux avoir une liste de texture autonome, que tu parcours en parallèle pendant le dessin.
    En effet, les données d'affichage doivent être détachée de la logique du jeu.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Ton idée semble très intéressante pour quelqu'un qui s'intéresse au code de façon très approfondie. Cependant je ne suis qu'un codeur "casu" et ma méthode est mille fois plus simple :

    - pour chaque item "mangé", je créer une nouvelle surface et son SDL_Rec dans deux vector
    - je calcul les déplacements
    - je blit mes deux vectors.

    Je n'ai pas cette logique que vous avez tous à vouloir utiliser tel ou tel moyen de coder. Et lorsque j'essaye de m'y mettre cela devient plus que catastrophique. C'est pourquoi j'essaye de résoudre mon soucis en suivant ma logique sans dénaturer le code qui m'est venu naturellement. Je ne rejette pas votre aide je vous fais juste comprendre qu'il ne sert à rien de me dire que j'aurais dû utiliser ceci, ou cela etc.. Mais je cherche plutôt à trouver comment avancer sur le chemin que j'ai déjà emprunté

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu déplaces tous les rectangles, alors pour un faible intérêt pratique.
    C'est dommage, tu va perdre en performance graphique.

    On ne te conseille pas "notre" façon de faire, mais une façon meilleure que la tienne.

    Ce n'est pas forcément la seule façon, c'est certain. Mais compare un peu:
    Avec un vers de 20 segments, il te faut 20 switch et 40 affectations par déplacement, quand il n'en faut que 1+5 avec la liste.
    Avec 50 segments, c'est encore pire.

    Atteindre un fps suffisant pour la jouabilité signifie réduire drastiquement le temps de calcul.
    A toi de voire ce qui te plait, en effet.
    Personnellement, je pense que c'est dommage de perdre en rapidité quand le vers s'allonge, c'est à dire quand la partie avance.
    Cela diminue la difficulté en augmentant le temps accordé à l'utilisateur.
    Je reconnais que tant que tu es en dessous du seuil fps, c'est invisible.


    Le propre du bon développeur est de savoir écouter l'avis des autres, pour apprendre les bonnes solutions.
    En l'occurence, j'ai eu un professeur qui disait "la plus rapide façon d'obtenir une valeur, c'est encore de ne pas la calculer du tout".

    Autrement dit, une bonne manière de résoudre un soucis, c'est aussi de supprimer la situation délicate.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Désolé, je double poste:
    Citation Envoyé par Mahus Voir le message
    Cependant je ne suis qu'un codeur "casu" et ma méthode est mille fois plus simple :
    - pour chaque item "mangé", je créer une nouvelle surface et son SDL_Rec dans deux vector
    - je calcul les déplacements
    - je blit mes deux vectors.
    ta solution:
    à chaque itération de la boucle de temps de jeu:
        si je mange, //ajouter un rectangle au bout.
            trouver le bout
            calculer les coordonnées de son suivant
            créer le rectangle
            l'ajouter au vecteur
        pour tout rectangle du vecteur
            //déplacer le rectangle en fonction de la position du précédent
            trouver le suivant
            calculer son déplacement
            modifier current
        pour tout rectangle du vecteur
            blitter le rectangle
    ma solution:
    à chaque itération de la boucle de temps de jeu:
        soit r = si je mange ? un nouveau rectangle : liste.pop_back()
        calculer les nouvelles coordonnées de la tete
        y placer r
        ajouter r en début de liste
        pour tout rectangle de la liste
            blitter le rectangle
    Quel code est le plus simple?

    Ma solution marcherait avec un vector, mais les performances seront pourries.
    Ça marcherait aussi avec un deque, mais le mieux pourrait être la liste. (à vérifier cependant)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mahus Voir le message
    Je n'ai pas cette logique que vous avez tous à vouloir utiliser tel ou tel moyen de coder. Et lorsque j'essaye de m'y mettre cela devient plus que catastrophique. C'est pourquoi j'essaye de résoudre mon soucis en suivant ma logique sans dénaturer le code qui m'est venu naturellement. Je ne rejette pas votre aide je vous fais juste comprendre qu'il ne sert à rien de me dire que j'aurais dû utiliser ceci, ou cela etc.. Mais je cherche plutôt à trouver comment avancer sur le chemin que j'ai déjà emprunté
    En général quand on poste un problème sur un forum on écoute les avis, si on te donne un avis pour faire autrement c'est parce que justement on a testé cette solution avant et elle n'est pas viable.

    comme tu le dis, tu es un codeur "casu", donc justement tu devrais faire en sorte de t'améliorer afin de réaliser des soft meilleur. En l’occurrence on te parle de concept de base de programmation, donc une guideline à suivre lorsque l'on apprends a coder (on est tous passer par là).

    Si on voulait te planter, on t'aurais dis d'utiliser des smart ptr et autres choses de ce genre qui dépende vraiment de la philosophie du codeur. Ce qui n'est pas le cas, c'est justement pour que tu puisse comprendre certaine logique qui, en jeu vidéo ne sont pas les même que dans le reste de la programmation .

    Les conseils apportés sont souvent là pour réduire la complexité de ton code (c'est d’ailleurs le but d'un développeur, à savoir, simplifier des problème en langage machine).
    Après si tu veux absolument continué dans la voie que tu as choisis, c'est ton choix, mais si tu te heurte à des problèmes lié à ta manière de faire, l'aide que tu recevra sera beaucoup moins enthousiaste. Tu essayes de faire un snake surement pour apprendre les bases des jeux vidéo dans le but d'en faire un plus complexe après, donc le but n'est pas de faire le snake mais d'apprendre à le faire correctement, d'où l'utilité des conseils des personnes plus douées que toi dans ce domaine .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


Discussions similaires

  1. [POO] récupérer l'id d'un objet qui a le focus.
    Par chateau64 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/05/2008, 10h43
  2. Réponses: 2
    Dernier message: 21/04/2006, 14h32
  3. Récupérer l'objet qui a le focus
    Par Johnbob dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/01/2006, 14h40
  4. [AWK] récupération de lignes qui se suivent
    Par PtiNico dans le forum Linux
    Réponses: 2
    Dernier message: 12/04/2005, 19h44
  5. Réponses: 19
    Dernier message: 07/11/2003, 08h10

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