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 :

Petit Problème d'héritage?


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Petit Problème d'héritage?
    Bonsoir !
    Alors en fait, j'ai un sérieux problème, je ne peux plus accéder à mes variables depuis la classe fille. vous allez dire "comment ça tu ne peux plus, tu pouvais avant?" eh oui ! pas plus tard que cette nuit :o tout marchait à merveilles, j'éteins mon pc, je reprend cet aprem, et là c'est le drame, tout est cassé OO et pour le coup je n'ai vraiment rien bidouillé sur ces bouts de codes.. enfin bref
    donc voilà, j'ai ma classe Sprite, qui contient donc le tableau pos[] pour stocker la position actuelle de l'objet. Cette classe est l'heureuse maman de deux petites classes: Bullet et Enemy. et là où Bullet tient tout de sa mère, Enemy est carrément plus rebelle et décide de trouver sa position qu'une fois sur deux.

    Si je fais un printf enemy->getPosX/Y(), ça marche une fois sur deux. Dans ma gestion des collisions, ça me fait pouf, segment fault. Si dans une méthode d'Enemy je fais pos[x/y] pareil , il va me sortir des variables d'un autre monde. Et c'est quand même vachement embêtant ! Surtout quand le compilo peut pas vous aider D8

    Assez parlé, voilà du code ! :
    Sprite.h
    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
     
    #include <vector>
     
     
    class Mouvement;
     
    class Sprite
    {
        protected:
     
            SDL_Surface *image;
     
            std::vector<Mouvement*> mouvements;
            unsigned int mouv_act;
     
            float pos[2];
            float hit_box_center[2];
            float hit_box_radius;
     
            float delay;//spawn delay
     
            bool dead;
     
        public:
     
            Sprite();
            Sprite(SDL_Surface *sprite, float s_delay);
            ~Sprite();
     
            /*** setter ***/
     
            void addMouvement(Mouvement *mov);
            void removeMouvement(int i);
            void setDead(bool n_dead);
            void updatePos(float xx, float yy);
     
            /*** getter ***/
     
            SDL_Surface* getSprite();
            float getDelay();
            float getPosX();
            float getPosY();
            float getHitBoxCenterX();
            float getHitBoxCenterY();
            float getHitBoxRadius();
            int getImageH();
            int getImageW();
            int getMouvementSize();
            Mouvement* getMouvement(int i);
            void refresh(SDL_Surface *screen);
     
     
    };
    Enemy.h
    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
     
    #include "Sprite.h"
     
    class Spellcard;
     
    class Enemy : public Sprite
    {
        protected:
     
            int life;
            int level;//kind of enemy
     
            std::vector<Spellcard*> spellcards;
            Spellcard* kamikaze;
            std::vector<Spellcard*> to_shoot;
     
            bool hit;
            bool is_kamikaze;
     
     
        public:
     
            Enemy(SDL_Surface *sprite, int s_life, int s_level, float s_delay);
            ~Enemy();
     
            /*** setter ***/
     
            void addSpellcard(Spellcard *spell);
            void addKamikazeSpell(Spellcard *spell);
            void shoot(Spellcard *spell);
            void setLife(int n_life);
            void setHit(bool n_hit);
            void setKamikaze(bool k);
     
            /*** getter ***/
            int getLife();
            int getLevel();
            unsigned int getSpellcardSize();
            unsigned int getShootingSize();
            Spellcard* getSpellcard(unsigned int i);
            Spellcard* getShootingSpellcard(unsigned int i);
     
            bool isKamikaze();
            Spellcard* getKamikazeSpell();
     
     
            /*** autres ***/
            void drop();
            void die();
    };
    Enemy.cpp
    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
     
    #include "Enemy.h"
    #include "Spellcard.h"
    #include "Mouvement.h"
    #include "Bullet.h"
    #include "Sprite.h"
    #include "Enums.h"
     
    Enemy::Enemy(SDL_Surface *sprite, int s_life, int s_level, float s_delay) : Sprite(sprite, s_delay)
    {
     
        life = s_life;
        level = s_level;
     
        hit = false;
    }
     //le bout de code méchant qui veut pas marcher
    void Enemy::shoot(Spellcard *spell)
    {
        to_shoot.push_back(spell);
        printf("shoot : enemy %p [%f, %f]\n", this, this->getPosX(), pos[y]);
     
        for(int i = 0; i<spell->getBulletNb(); i++)
        {
            for(int j = 0; j<spell->getBullet(i)->getMouvementSize(); j++)
            {
                float xx = pos[x] + spell->getBullet(i)->getMouvement(j)->getStartX();
                float yy = pos[y] + spell->getBullet(i)->getMouvement(j)->getStartY();
               // printf("new start for %p [%f, %f], previous[%f, %f]\n", spell->getBullet(i), xx, yy, spell->getBullet(i)->getMouvement(j)->getStartX(), spell->getBullet(i)->getMouvement(j)->getStartY());
            }
        }
    } //en vrai, la fonction fait plus rien là, normalement j'updatais la position de mes boulettes en fonction de celle de l'ennemi au moment de shooter, mais... bah voilà quoi
    et enfin ceci marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i=0; i< on_screen_enemy.size(); i++)
            {
                on_screen_enemy[i]->refresh(screen);
                printf("enemy %p [%f, %f]\n", on_screen_enemy[i], on_screen_enemy[i]->getPosX(), on_screen_enemy[i]->getPosY());
            }
    par marche j'entends m'affiche les bonnes coordonnées dans le printf

    tandis que ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float dx = (b->getPosX() + b->getHitBoxCenterX()) - (e->getPosX() + e->getHitBoxCenterX());
        float dy = (b->getPosY() + b->getHitBoxCenterY()) - (e->getPosY() + e->getHitBoxCenterY());
        float r = b->getHitBoxRadius() + e->getHitBoxRadius();
    fini par me fermer le programme avec une segmentfault.

    et mes ennemis sont crée de la sorte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for(i=100; i<=800; i+=50)
        {
            Enemy *e = new Enemy(fool, 0, 0, i);
            Spellcard *s = new Spellcard(spell11());
            e->addSpellcard(s);
     
            Mouvement *m = new Mouvement(mouv01());
            e->addMouvement(m);
     
            enemy.push_back(e);
        }
    Là je vois vraiment pas, parce que je n'ai vraiment touché à aucun de ces morceaux de code, et hier, ça marchait OO la seule chose que j'ai touché, c'est la boucle de création, mais mon constructeur est okay, du moins, en adéquation avec ce qui est dans enemy.cpp
    De plus, les déplacements à l'écran sont bon, le problème du coup c'est qu'au moment de tirer mes boulettes, je veux récupérer la position du tireur, parce que bon, faire partir une boulette d'en haut à gauche alors que l'ennemi est au centre de l'écran...

    Merci par avance, en espérant que vous pourrez m'aider :o si besoin de plus d'infos je ne bouge pas de mon pc tant que ce problème n'est pas résolu, donc demandez !

  2. #2
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 248
    Points
    1 248
    Par défaut
    Ton histoire ressemble à un problème de synchro.
    Ton appli est-elle multi-thread ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    multi-thread? ._. *go google le temps*

    Edit : hum non il ne me semble pas, ou alors j'ai manipulé un outils que je ne connais pas du tout (je me sens noob d'un seul coup)

    Je n'effectue pas plusieurs tâche à la fois, à aucun moment, c'est tout séquencé. dans le main on crée d'abord tout les ennemi d'un niveau, qu'on stocke. après dans la boucle on affiche les ennemis quand ils le doivent, puis pour chaques ennemi affiché on regarde si il doit tiré ou pas, si oui on ajoute les boulettes qui doivent être tirée dans un vecteur 'on screen" (comme pour les ennemi) on déplace tout ce jolie monde de façon mathématique, ensuite en on regarde si y a des collisions x ou y, et une fois tout ces calculs fait, on rafraichit tout ce qui a besoin d'être blitté en dernier lieu !

    ici le blittage pour bullet et enemy se fait dans la classe sprite, et le déplacement pixel par pixel dans mouvement (methode Move(Sprite *object)) et dans cette méthode l'accès à pos[] ne pose aucun problème, même quand c'est un ennemi, et à cet endroit d'ailleurs le getPos() marche. par contre quand je passe directement via un enemy ça ne marche pas. genre quand dans enemy je fais pos[x], ça va me mettre 0, alors que si je check pos[x] via sprite, pour le même objet, j'aurais la bonne position (d'où le fait que mon affichage se retrouve correct, mais je ne peux placer aucun objet relativement à mon enemy, à part le joueur lui même xD par contre si je lui tire dessus au bout d'un moment ça fait BOUM)

  4. #4
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 248
    Points
    1 248
    Par défaut
    Ta déclaration semble être bonne. Tu hérite public, et tu ne surcharge pas getPosX/Y(). Ça devrait fonctionner. De toute façon, si ça marche ailleurs dans ton code, ça doit marcher ici.

    Par contre, peux tu me donner un peu plus de code autour de ce qui marche pas. Je ne sais pas trop ce qu'est b et e, mais je soupçonne qu'un de ces 2 pointers puisse être invalide au moment où tu l'appelle. Ça justifiait ton segfault.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Le morceau de code où j'ai détecté la faille exactement c'est celui là :
    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
    void Enemy::shoot(Spellcard *spell)
    {
        to_shoot.push_back(spell);
        printf("shoot : enemy %p [%f, %f]\n", this, pos[x], pos[y]);
     
        for(int i = 0; i<spell->getBulletNb(); i++)
        {
            for(int j = 0; j<spell->getBullet(i)->getMouvementSize(); j++)
            {
                float xx = pos[x] + spell->getBullet(i)->getMouvement(j)->getStartX();
                float yy = pos[y] + spell->getBullet(i)->getMouvement(j)->getStartY();
                float start[2] = {xx, yy}
     
                spell->getBullet(i)->getMouvement(j)->setStart(start);
            }
        }
    }
    après il y a des failles ici
    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
     //shoot
            for(i=0; i<on_screen_enemy.size(); i++)
            {
                for(j=0; j<on_screen_enemy.at(i)->getShootingSize(); j++)
                {
                    std::vector<Bullet*> fired(on_screen_enemy.at(i)->getShootingSpellcard(j)->fire(
                                                   (on_screen_enemy.at(i)->getShootingSpellcard(j)->getDelay() + on_screen_enemy.at(i)->getDelay()), frame));
     
                    for(k=0; k< fired.size(); k++)
                    {
                        if(!on_screen_enemy.at(i)->getShootingSpellcard(j)->getFixe())
                        {
                            float start[2] = {(on_screen_enemy[i]->getPosX() + fired.at(k)->getMouvement(0)->getStartX()),
                                              (on_screen_enemy[i]->getImageH() + (on_screen_enemy[i]->getPosY()+ fired.at(k)->getMouvement(0)->getStartY())
                                             };
                            fired.at(k)->getMouvement(0)->setStart(start);
                        }
     
                        on_screen_bullet.push_back(fired.at(k));
                    }
                }
            }
    ici
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    //move bullet
            for(i=0; i<on_screen_bullet.size(); i++)
            {
                if(on_screen_bullet.at(i)->getMouvement(0)->isFinished())
                {
                    on_screen_bullet.at(i)->removeMouvement(0);
     
                    if(on_screen_bullet.at(i)->getMouvementSize() == 0)
                    {
                        std::vector<Bullet*>::iterator it = on_screen_bullet.begin()+i;
                        on_screen_bullet.erase(it);
     
                        if(on_screen_bullet.size()<=0)
                        {
                            printf("plus de bullet à afficher\n");
                            //bullet_f = true;
                        }
                    }
                    else
                    {
                        if(on_screen_bullet[i]->isHoming())
                        {
                            if((on_screen_bullet[i]->launchBy() == joueur)&&(on_screen_enemy.size() > 0))
                            {
                                float end[2] = {on_screen_enemy[0]->getPosX(), on_screen_enemy[0]->getPosY()};
                                on_screen_bullet[i]->getMouvement(0)->setEnd(end);
                            }
                            else
                            {
                                float end[2] = {play->getPosX(), 690};
                                on_screen_bullet[i]->getMouvement(0)->setEnd(end);
                            }
     
                        }
     
                        on_screen_bullet.at(i)->getMouvement(0)->move(on_screen_bullet.at(i));
     
                        if(on_screen_bullet[i]->launchBy() == joueur)
                        {
                            for(j = 0; j < on_screen_enemy.size(); j++)
                            {
                                if(colision(on_screen_bullet[i], on_screen_enemy[j]))
                                {
                                    on_screen_enemy[j]->setLife(-1);
     
                                    if(on_screen_enemy[j]->getLife()<=0)
                                    {
                                        if(on_screen_enemy[j]->isKamikaze())
                                        {
                                            std::vector<Bullet*>fired=on_screen_enemy[j]->getKamikazeSpell()->fire(0,0);
                                            for(k=0; k<fired.size(); k++)
                                            {
                                                float start[2] = {on_screen_enemy[j]->getPosX(), on_screen_enemy[j]->getPosY()};
                                                fired[k]->getMouvement(0)->setStart(start);
                                                on_screen_bullet.push_back(fired[k]);
                                            }
                                        }
     
                                        on_screen_enemy[j]->die();
                                        std::vector<Enemy*>::iterator it = on_screen_enemy.begin()+j;
                                        on_screen_enemy.erase(it);
                                    }
                                    std::vector<Bullet*>::iterator itb = on_screen_bullet.begin()+i;
                                    on_screen_bullet.erase(itb);
     
     
                                }
                            }
                        }
                    }
                }
                else
                {
                    if(on_screen_bullet[i]->isHoming())
                    {
                        if((on_screen_bullet[i]->launchBy() == joueur)&&(on_screen_enemy.size() > 0))
                        {
                            float end[2] = {on_screen_enemy[0]->getPosX(), on_screen_enemy[0]->getPosY()};
                            on_screen_bullet[i]->getMouvement(0)->setEnd(end);
                        }
                        else
                        {
                            float end[2] = {play->getPosX(), 690};
                            on_screen_bullet[i]->getMouvement(0)->setEnd(end);
                        }
     
                    }
     
                    on_screen_bullet.at(i)->getMouvement(0)->move(on_screen_bullet.at(i));
     
                    if(on_screen_bullet[i]->launchBy() == joueur)
                    {
                        for(j = 0; j < on_screen_enemy.size(); j++)
                        {
                            if(colision(on_screen_bullet[i], on_screen_enemy[j]))
                            {
                                on_screen_enemy[j]->setLife(-1);
     
                                if(on_screen_enemy[j]->getLife()<=0)
                                {
                                    if(on_screen_enemy[j]->isKamikaze())
                                    {
                                        std::vector<Bullet*>fired=on_screen_enemy[j]->getKamikazeSpell()->fire(0,0);
                                        for(k=0; k<fired.size(); k++)
                                        {
                                            float start[2] = {on_screen_enemy[j]->getPosX(), on_screen_enemy[j]->getPosY()};
                                            fired[k]->getMouvement(0)->setStart(start);
                                            on_screen_bullet.push_back(fired[k]);
                                        }
                                    }
     
                                    on_screen_enemy[j]->die();
                                    std::vector<Enemy*>::iterator it = on_screen_enemy.begin()+j;
                                    on_screen_enemy.erase(it);
                                }
                                std::vector<Bullet*>::iterator itb = on_screen_bullet.begin()+i;
                                on_screen_bullet.erase(itb);
     
                            }
                        }
                    }
                }
            }
    (pour tout ce qui concerne la partie enemy, mais au moins y a l'entier au cas où

    et pour cette collision
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool colision(Bullet *b, Enemy *e)
    {
        float dx = (b->getPosX() + b->getHitBoxCenterX()) - (e->getPosX() + e->getHitBoxCenterX());
        float dy = (b->getPosY() + b->getHitBoxCenterY()) - (e->getPosY() + e->getHitBoxCenterY());
        float r = b->getHitBoxRadius() + e->getHitBoxRadius();
     
        if ((pow(dx, 2) + pow(dy, 2)) > pow(r, 2))
            return false;
        else
            return true;
    }
    , surtout dans le cadre d'un tir ciblé lancé du joueur (code précédent, ligne 25 et 78)

    Mais la segFault ne se fait que lors du tir, donc je pense quand le tir cherche à atteindre un des ennemi, enfin quand il doit se repositionner vis à vis de lui parce que par exemple ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool colision(Enemy *e, Player *p)
    {
        float dx = (e->getPosX() + e->getHitBoxCenterX()) - (p->getPosX() + p->getHitBoxX());
        float dy = (e->getPosY() + e->getHitBoxCenterY()) - (p->getPosY() + p->getHitBoxY());
        float r = e->getHitBoxRadius() + p->getHitBoxR();
     
        if ((pow(dx, 2) + pow(dy, 2)) > pow(r, 2))
            return false;
        else
            return true;
    }
    ne retourne aucune erreur, et marche même parfaitement !

    SInon aucune segfault, même pour tout te dire là je suis en train d'organiser mon petit ballet pour m'avancer, les ennemies se déplacent tous partout dans tout les sens c'est magnifique =')

    Edit 1h56 : Alors là LOL, je ne sais pas par quel miracle, mais j'en ai qui se place comme il faut maintenant Oo j'ai pas compris, j'ai rien touché, j'ai juste rajouté des ennemis qui bouge. mais pas toute, je teste le tir ciblé

    Edit 1h58 : non surtout qu'en fait, dans enemy je ne récupère toujours pas la position, don't know what kind of sorcery is this O_O

    Edit 2:09 : je n'ai plus de segment fault lorsque j'utilise un tir ciblé, je ne SAIS PAS ce qui se passe, pas la moindre idée xD j'ai mes premiers tir qui passe, mais pas le deuxieme (et quand je change l'apparition de la spellcard j'ai des trucs totalement ouf, genre au lieu de partir de 0.0 (pourquoi? don't know) ça part de l'est lointain et arrive 30 seconde après sur la surface affichée. Je sais que c'est un Danmaku et que c'est censé être le bordel à l'écran, mais là quand même O_O) je vais aller dormir, je verrais demain matin, si ça se trouve ça se sera envolé comme par magie, comme c'est arrivé xD

  6. #6
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 248
    Points
    1 248
    Par défaut
    Si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float end[2] = {on_screen_enemy[0]->getPosX(), on_screen_enemy[0]->getPosY()}
    Plante alors qui tu vérifie que on_screen_enemy n'est pas vide, c'est sûrement que le pointer n'est pas valide. Les suppressions que tu fais ont l'air OK.
    Avec un peu de chance c'est un pointer NULL plutôt qu'un fou.
    Ajoute dans ton code
    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
    bool colision(Bullet *b, Enemy *e)
    {
        if(!b || !e)
        {
          throw;
        }
        float dx = (b->getPosX() + b->getHitBoxCenterX()) - (e->getPosX() + e->getHitBoxCenterX());
        float dy = (b->getPosY() + b->getHitBoxCenterY()) - (e->getPosY() + e->getHitBoxCenterY());
        float r = b->getHitBoxRadius() + e->getHitBoxRadius();
     
        if ((pow(dx, 2) + pow(dy, 2)) > pow(r, 2))
            return false;
        else
            return true;
    }
    Met un breakpoint sur ton throw, et essaye de régénérer ton bug.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Je n'arrive pas à regénérer l'erreur ._.
    Mais tout mes pointeurs sont bons, vu que dans la méthode
    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
    void Enemy::shoot(Spellcard *spell)
    {
        to_shoot.push_back(spell);
        printf("shoot : enemy %p [%f, %f]\n", this, pos[x], pos[y]);
     
        for(int i = 0; i<spell->getBulletNb(); i++)
        {
            for(int j = 0; j<spell->getBullet(i)->getMouvementSize(); j++)
            {
                float xx = pos[x] + spell->getBullet(i)->getMouvement(j)->getStartX();
                float yy = pos[y] + spell->getBullet(i)->getMouvement(j)->getStartY();
                float start[2] = {xx, yy};
     
                spell->getBullet(i)->getMouvement(j)->setStart(start);
            }
        }
    }
    j'affiche mon pointeur, et je n'ai que des adresses valides !

    Par contre, je ne trouve, toujours, pas ._. c'est en train de me rendre folle T__T

  8. #8
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    je vais certainement me faire taper sur les doigts, mais halp T^T j'ai refait un log, on voit bien qu'à l'affichage et dans la fonction citée au dessus, je fais le même affichage

    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
    void Enemy::shoot(Spellcard *spell)
    {
        to_shoot.push_back(spell);
        printf("shoot : enemy %p [%f, %f]\n", this, pos[0], pos[1]);
     
        for(int i = 0; i<spell->getBulletNb(); i++)
        {
            for(int j = 0; j<spell->getBullet(i)->getMouvementSize(); j++)
            {
                float xx = pos[x] + spell->getBullet(i)->getMouvement(j)->getStartX();
                float yy = pos[y] + spell->getBullet(i)->getMouvement(j)->getStartY();
                float start[2] = {xx, yy};
     
                spell->getBullet(i)->getMouvement(j)->setStart(start);
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0; i< on_screen_enemy.size(); i++)
            {
                on_screen_enemy[i]->refresh(screen);
                printf("%p[%f, %f]\n", on_screen_enemy[i], on_screen_enemy[i]->getPosX(), on_screen_enemy[i]->getPosY());
            }
    mais je n'ai pas du tout le même résultat : http://puu.sh/1oyQH

    en fait, dans la première, il garde la valeur d'initialisation par le constructeur (si je remplace par 5, ça me mettra [5, 5]

  9. #9
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 248
    Points
    1 248
    Par défaut
    Salut,

    Désolé, j'avais un peu oublié ton post.

    As-tu résolu ton problème ?
    Si tu es toujours bloqué, où en es-tu ?

    A+

  10. #10
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Oups oui c'est résolu ! et heureusement je dois rendre le jeu demain ;D (j'ai oublié de mettre le post en résolu)

    En fait, pour la petite histoire, j'ai pris le problème à l'envers ._. j'avais mal debuggué, et il était normal que ça me mette la valeur du constructeur parce que... j'avais mis des 0 à mes positions de départ u_u fin bref j'ai du modifier un autre bout de code que ceux que j'ai montré, depuis ça marche à la perfection !
    il ne me reste plus qu'à faire mon autoscrolling pour les backgrounds sans que ça me descende à 10fps xD et j'aurais fini ! =3

    Merci en tout cas !

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

Discussions similaires

  1. Petit problème d'héritage
    Par ohichamo dans le forum C++
    Réponses: 3
    Dernier message: 04/07/2012, 10h21
  2. Petit problème d'héritage.
    Par tifil dans le forum C++
    Réponses: 19
    Dernier message: 08/03/2012, 18h04
  3. Petit problème d'héritage
    Par AF_2.8 dans le forum C++
    Réponses: 4
    Dernier message: 02/12/2010, 16h33
  4. Héritage : petit problème
    Par Fy_Hertz dans le forum C++
    Réponses: 20
    Dernier message: 31/01/2006, 08h39
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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