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
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
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.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
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(); };
et enfin ceci marche
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
par marche j'entends m'affiche les bonnes coordonnées dans le printf
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()); }
tandis que ceci :
fini par me fermer le programme avec une segmentfault.
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();
et mes ennemis sont crée de la sorte
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
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); }
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 !
Partager