|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 11 ![]() |
Bonjour,
Alors voilà, je travaille, avec la SFML, sur un petit projet du genre Space Invaders (en un peu plus moderne visuellement). Pour l'instant j'ai donc un vaisseau qui se déplace sur un fond. J'aimerai bien sûr qu'il puisse tirer des projectiles. Je problème c'est que je ne sais pas du tout comment faire. Tout ce que j'ai pu faire, c'est impléménter un classe Projectile comme un personnage (CAD un sprite qui se déplace d'un point à un autre). Mais je pense qu'il y a mieux, surtout que ça pose problème dès que je veux tirer plus d'un coup. J'ai vaguement lu sur le net qu'il faudrait une classe hériter de sf:: Drawable, pour dessiner une trajectoire mais je n'ai aucune idée de comment m'y prendre. Donc si quelqu'un avait une idée, son aide serai la bienvenue (parce que c'est nul un jeu de shoot qui shoot pas Merci d'avance pour votre aide |
|
|
00
|
|
|
#2 | ||||||||||
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 11 ![]() |
Rebonsoir ! J'ai donc fait une classe Projectile, et implémenté une méthode Attaquer dans ma classe Vaisseau. Dans cette méthode, j'appelle le constructeur de Projectile avec comme paramètre le filePath, le SubRect, la position de départ (le plus compliqué pour moi) et la vitesse. De manière à appeler la méthode Tirer du Vaisseau depuis le main dans les evennements. Le problème c'est que je ne sais pas comment dessiner le sprite Projectile, vu que je n'ai pas d'objet projectile dans le main.
J'ai essayé de faire une méthode pour récuperer le sprite dans le Vaisseau mais je m'embrouille. Mon code sera peut être plus parlant : Projectile.hpp Code :
Code :
Code :
Code :
Code :
Merci d'avance pour votre aide! |
||||||||||
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() Quentin HenrietÉtudiant Inscription : mars 2011 Messages : 78 ![]() |
Tu t'es lancé un peu vite dans l'écriture du code et tu as zappé un peu vite la conception ^^
Il y a plusieurs problèmes dans ton code : → La classe Projectile ne devrait pas contenir sa sf::Image, car d'après ce que j'ai compris, un nouveau Projectile est créé à chaque tir ; et donc, l'image est rechargée à chaque fois, c'est extrêmement lent, et tu as donc plusieurs copies de la même image en mémoire si tu as plusieurs projectiles en même temps (ce qui est très probable). Tu devrais entièrement externaliser ta gestion des images pour ne charger et ne décharger qu'une seule fois les images nécessaires. (y compris pour les vaisseaux) → Ta fonction Sprite Vaisseau::GetProjSprite() ne devrait pas exister, évite de faire ce genre de truc bizarre qui de toute façon ne marche pas bien… → Tu disais que tu avais un problème au niveau du main() étant donné que tu n'a pas l'objet Projectile ; une solution serait par exemple (c'est ce que je fais pour mon jeu mais c'est peut-être pas ce qu'il y a de mieux…) de faire une classe de base pour tout élément sur l'écran, puis en faire des classes dérivées pour chaque type d'élément (vaisseau, projectile, etc…). Ainsi les fonctions communes comme l'affichage par exemple sont dans la classe de base, et les fonctions plus spécifiques dans les classes dérivées. Tu peux ensuite créer un conteneur (list par exemple) de type «pointeur sur la classe de base», au niveau global, dans lequel tu pourrais placer tes vaisseaux qui a leur tour pourraient placer des projectiles. Ainsi une fois le projectile créé, il est indépendant et dissocié du vaisseau qui l'a créé et tu n'as plus besoin de fonctions bizarre comme celle au-dessus, et tu peux en créer autant que tu veux avec le même vaisseau. Le main gère ainsi cette liste d'éléments de manière basique, sans savoir quel est leur type précis, et sans se soucier de leur nombre. C'est loin d'être simple ce que je raconte, ce n'est qu'une méthode parmi d'autres, mais c'est celle que j'utilise personnellement ^^ Et surtout, un jeu vidéo ça commence sur papier et non dans un éditeur de code, retravaille bien ta conception avant de te lancer dans le codage.
__________________
Mon projet : Devilsai |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 11 ![]() |
Oui je sais je tatonne carrément. mais ça me fait pratiquer et me force à reflechir sur mes erreurs. Pour l'organisation papier, c'est juste qu'à la base, je ne sais pas vraiment comment m'y prendre, alors je me confronte au code, je m'aide avec des codes d'autres programmes, pour reprendre leurs fonctionnalités en les adaptant. Je voulais réussir à faire tirer mon vaisseau, pour ensuite réfléchir à l'organisation globale du projet. C'est pour ça que c'est un peu fouillis. Mais je commence maintenant à penser plus "global".
Sinon je suis en train de suivre tes conseils mais j'ai un peu de mal à manipuler les vector<Objet*>. Un de mes plus gros soucis de ces dernières heures, c'est réussir à transmettre la position actualisée de mon vaisseau au projectile (vu que je ne peux pas le faire dans le constructeur <Projectile*>, c'est bien ça?). En gros, comment puis je appeler mes fonction membres avec un vecteur dynamique? Parce qu'au moment ou je crée un new <Projectile>, la classe projectile ne "sait" pas d'où partir. merci |
|
|
00
|
|
|
#5 | ||
|
Membre habitué
![]() Quentin HenrietÉtudiant Inscription : mars 2011 Messages : 78 ![]() |
Le type vector ne doit pas être le plus approprié. À mon avis, une list ou une map serait plus approprié. L'avantage d'une map serait de pouvoir donner un identificateur unique à chaque élément, ce qui peut être pratique si par exemple un élément doit être «connecté» à un autre.
Voici une idée avec une map : Code :
__________________
Mon projet : Devilsai |
||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : novembre 2012 Messages : 11 ![]() |
Désolé du retard, j'ai vraiment des problèmes de connexion (ahhh la belgique
D'abord, merci pour ton aide. Ceci dit, ça va devoir attendre avant d'être fonctionnel car mon savoir et mon expérience ont leurs limites. En effet, je n'ai pas encore vu les itérateurs (ou très vageument), c'est pourquoi je pansais à un vector. Ensuite, il me semble que le type "struct" appartient plus au langage C non? Ca non plus je ne suis pas vraiment au point ; je ne connais que le C++, et encore dans une certaine mesure. Mais je vais de ce pas me mettre au point ![]() Sinon, j'ai trouvé une ressource sur un autre site. Ils n'expliquent pas toute la marche à suivre, mais ils utilisent bien de vector. Je vais donc essayer de faire ça de plusieurs manière de façon à déterminer la plus appropriée. Merci beaucoup |
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Quentin HenrietÉtudiant Inscription : mars 2011 Messages : 78 ![]() |
Le "struct" en C++ est équivalent au "class", à la différence près que les champs sont par défaut de type "public" dans un struct, et de type "private" dans une class. C'est toujours mieux de privilégier les champs private, ça évite de faire des erreurs, mais pour le petit bout de code que j'ai posté ça n'a pas vraiment d'importance. Des class fonctionneraient tout aussi bien.
L'intérêt d'utiliser des vector serait, d'après l'article que tu cites, d'améliorer les performances du programme. Personnellement, je ne suis pas convaincu du réel intérêt des vector, d'abord parce qu'il y a des structures de données plus simples à utiliser, et ensuite parce qu'il y a aussi mieux à faire en termes de performances. À mon avis, le plus important c'est que tu comprennes bien comment fonctionne le code, et donc fais au plus simple. T'auras le temps de t'occuper des questions de performances plus tard ^^ Mais si c'est bien expliqué et que tu y arrives c'est le principal !
__________________
Mon projet : Devilsai |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com