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 :

Problème surprenant: un calcul -> deux résultats différents


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Problème surprenant: un calcul -> deux résultats différents
    Bonjour,

    J'ai un problème vraiment bizarre, je suis en train de faire un petit jeu, lors du déplacement d'un personnage, j'ai une fonction qui arrête son déplacement lorsque sa position en x est: (SCREEN_W/10/2 + 9*SCREEN_W/10), sa position vaut alors 969.
    Puis lorsque je place dès le début du jeu un autre personnage à la position (SCREEN_W/10/2 + 9*SCREEN_W/10), sa position vaut 972 !

    Quelqu'un aurait une vague idée d'où ça peut venir ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Quelqu'un aurait une vague idée d'où ça peut venir ?
    Eh non... Aucune vague idée avec une question aussi vague...

    Il faut nous montrer ton code. On ne sait pas comment est codé ton programme, comment sont calculées tes positions, etc...

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Je pense que ça vient de ce que tu ne nous dis pas.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pour être plus précis, j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i=0; i<10; i++){
       if((positionsPersos[choixPerso][0]) == (SCREEN_W/10/2 + i*SCREEN_W/10)) *enCours = 0;
    }
    Ce qui nous concerne ici c'est quand i vaut 9 (je suis tout à droite de mon écran).

    et à un autre endroit du code j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    positionsEnnemis[2][0] = (SCREEN_W/10/2 + 9*SCREEN_W/10);
    Puis lorsque je fais un affichage j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    positionsPersos[choixPerso][0] = 969
    positionsEnnemis[2][0] = 972
    Alors qu'ils devrait évidemment être égaux.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Points : 128
    Points
    128
    Par défaut
    Quelle est la valeur de SCREEN_W ? 1020 ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    1024 (par construction lors de l'initialisation de mon écran)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Alors qu'ils devrait évidemment être égaux.
    Avec le code que tu nous as donné, on ne peut pas le certifier.
    Dans ta boucle for, tu fais 10 tests et le seul objet modifié (si cela arrive) sera celui pointé par enCours. Mais on ne sait pas comment est affectée la valeur à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    positionsPersos[choixPerso][0]
    . Ici, rien ne nous dit que les valeurs doivent être équivalentes...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Voici la partie où j'assigne positionsPersos[choixPerso][0]:


    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
    while(*enCours && (positionsPersos[choixPerso][0])!=SCREEN_W/10/2+SCREEN_W/10*9){
                                afficheBase(buffer, icone, sol, barre, perso_base, positionsPersos, pointsActions, fleche, attaques, ennemis_base, positionsEnnemis);
     
                                draw_sprite(*buffer, imagesPersos[choixPerso][0][img_compt_perso[choixPerso][0]], (int)(positionsPersos[choixPerso][0]) - (imagesPersos[choixPerso][0][img_compt_perso[choixPerso][0]])->w/2, (int)(positionsPersos[choixPerso][1]) - (imagesPersos[choixPerso][0][img_compt_perso[choixPerso][0]])->h/2 );
                                blit(*buffer, screen, 0, 0, 0, 0, (*buffer)->w, (*buffer)->h);
                                *fin = clock();
                                if((double)(*fin - *debut) / CLOCKS_PER_SEC > 0.05){
                                    img_compt_perso[choixPerso][0] = (++img_compt_perso[choixPerso][0])%8;
                                    perso_base[choixPerso] = imagesPersos[choixPerso][0][img_compt_perso[choixPerso][0]];
                                    *debut = clock();
                                }
                                (positionsPersos[choixPerso][0])++;
                                rest(10);
     
                                for(i=0; i<10; i++){
                                    if((positionsPersos[choixPerso][0]) == (SCREEN_W/10/2 + i*SCREEN_W/10)) *enCours = 0;
                                }
                            }

  9. #9
    Invité
    Invité(e)
    Par défaut
    Le problème est résolu, il venait de la priorité des opérations lorsqu'elles utilisent des constantes ou non !

    Merci à tous !

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je n'ai pas tout compris à ton code. Je pense qu'il y a moyen d'optimiser.

    Toutefois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SCREEN_W/10/2+SCREEN_W/10*9
    c'est pas pareil que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SCREEN_W/10/2+9*SCREEN_W/10
    Dans le premier cas, tu divises avant, puis le résultat est réduit à l'entier, avant de multiplier par 9.

    -->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(*enCours && (positionsPersos[choixPerso][0])!=SCREEN_W/10/2+SCREEN_W/10*9)
    {
    .....
    
    for(i=0; i<10; i++){
        if((positionsPersos[choixPerso][0]) == (SCREEN_W/10/2 + i*SCREEN_W/10)) *enCours = 0;
                                }
    Pourquoi ne pas remplacer cette boucle for tout simplement par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (positionsPersos[choixPerso][0] >= SCREEN_W/10/2 && positionsPersos[choixPerso][0] <= SCREEN_W/10/2 + 9*SCREEN_W/10) *enCours = 0;
    ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    C'était ça le problème oui

    Je ne peux pas simplifier la boucle fort parceque je teste cela pour chaque déplacement n'importe où sur ma carte, pas seulement lorsque je suis tout à droite (case 9).

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 670
    Points
    23 670
    Par défaut
    Citation Envoyé par p-477 Voir le message
    C'était ça le problème oui

    Je ne peux pas simplifier la boucle fort parceque je teste cela pour chaque déplacement n'importe où sur ma carte, pas seulement lorsque je suis tout à droite (case 9).
    Bien sûr que si.

    Apparemment, ta boucle sert à tester si ton personnage rencontre un mur vertical de dix pixels de haut au milieu de l'écran. Il te suffit de retrancher la position du premier pixel à celle de ton personnage, de diviser le résultat par SCREEN_W et de vérifier si ce quotient est compris entre 0 et 10 (EDIT: et de tester le modulo !)

  13. #13
    Invité
    Invité(e)
    Par défaut
    Non en fait ma carte est composée de 10*10 cases, je teste donc à chaque fois si le personnage est bien au milieu d'une case et si c'est le cas il arrête son déplacement (déplacement case par case).

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 670
    Points
    23 670
    Par défaut
    Citation Envoyé par p-477 Voir le message
    Non en fait ma carte est composée de 10*10 cases, je teste donc à chaque fois si le personnage est bien au milieu d'une case et si c'est le cas il arrête son déplacement (déplacement case par case).
    Qu'entends-tu par « au milieu d'une case » ?

    Si c'est juste pour savoir s'il est dedans ou non, et que tu veux l'arrêter s'il se trouve dans une colonne donnée, tu fais :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((positionsPersos[choixPerso][0] % SCREEN_W)/(SCREEN_W/10)==PositionAttendue) *enCours = 0;

    Ça t'évite avantageusement une boucle et ça a le mérite d'être constant avec l'augmentation du nombre de cases. Si tu ne gères plus 10×10 cases mais 100×100, le gain en performances va être palpable.

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

Discussions similaires

  1. [XL-MAC 2011] calcul entre deux fichiers différents
    Par tim343 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/07/2013, 09h09
  2. Problème avec un projet sur deux machines différentes
    Par dz_robotix dans le forum Visual C++
    Réponses: 3
    Dernier message: 20/02/2012, 18h00
  3. Calcul avec deux tables différentes
    Par challe dans le forum SAS Base
    Réponses: 3
    Dernier message: 11/07/2011, 15h30
  4. Calcul entre deux cellules différentes à chaque fois
    Par thomasisajerk dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/08/2010, 08h05
  5. Réponses: 6
    Dernier message: 24/05/2007, 13h40

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