Fonction TIR pour jeu en SDL.

Fonction TIR pour jeu en SDL. - C - Programmation

Marsh Posté le 08-06-2013 à 17:46:12    

Bonjour à toutes et à tous :)  
Je viens vous demander de l'aide en C/SDL ! Je suis loin d'être un expert, et j'ai des difficultés sur une fonction précise. Je réalise un jeu C/SDL, et je souhaiterai que mon personnage puisse tirer (des balles) ainsi que les ennemis. Cependant je ne sais pas trop par où me jeter.  
J'ai lu sur ce forum des topics ressemblant où il était question de tableau dynamique avec des structures et pointeurs.  
Quel est votre avis, quelle vous semble être la manière la plus simple ?  
 
Merci d'avance pour votre aide à tous.  
Amicalement.  
SX

Reply

Marsh Posté le 08-06-2013 à 17:46:12   

Reply

Marsh Posté le 09-06-2013 à 08:16:47    

commence par la fenêtre :o


---------------
Un cycle complet sera une série de 100.
Reply

Marsh Posté le 09-06-2013 à 12:16:35    

Salut,  
 
ce que je peux te conseiller, c'est d'abord de faire ton jeu sans aucune texture / image, juste avec la console, en faisant des printf.
 
Une fois que ton algo sera fonctionnel alors tu rajouteras la SDL, qui est assez simple d'utilisation.
 
C'est ce que j'ai fait pour un projet perso, en 3 jours, j'ai reussi a faire un tetris. ;)


Message édité par Profil supprimé le 09-06-2013 à 12:16:59
Reply

Marsh Posté le 09-06-2013 à 15:36:08    

Merci Djswiti pour ta réponse :) Le problème c'est que mon projet (qui est scolaire) est déjà pas mal avancé dans d'autres domaines, et ce que j'arrive à faire en console ne fonctionne pas trop quand je l'intègre au projet. En SDL, mon perso se déplace, interagit avec le décor etc etc. Me manque la fonction TIR... Je vais suivre ton conseil et retester en console ! Si quelqu'un à d'autres solutions... :) Merci encore.  

Reply

Marsh Posté le 10-06-2013 à 01:00:51    

En même temps, pas sûr que le C soit vraiment bien choisi pour du jeu vidéo :/

 

Sinon, tu peux faire ça :

 
Code :
  1. struct Bullet
  2. {
  3.   int x,y; // Coordonnées sur l'écran
  4.   float DirX,DirY; // Vecteur normalisé pour la direction (DirX = cos(Angle), DirY = -sin(Angle))
  5.   int Vitesse;
  6.   int Rayon; // Rayon de collision
  7.   SDL_Image* Sprite; // Pour le dessin
  8. };
  9. void UpdateBullet(bullet * b)
  10. {
  11.   b->x += DirX * Vitesse;
  12.   b->y += DirY * Vitesse;
  13. }
 

Il te faudra un truc qui gère toutes les instances du jeu (voilà pourquoi perso j'ai toujours fait en C++ :D), mais en C tu peux tenter un truc comme ça :

 
Code :
  1. struct InstanceController
  2. {
  3.     Bullet **BulletList; // Tableau de pointeurs de balles
  4.     int NumBullets; // nb de balles
  5.     Objet* ObjectsList; // Tableau de tout les objets du jeu (je simplifie, mais en gros tu auras probablement un tableau d'ennemi, un joueur, etc, etc)
  6.     int NumObjet;
  7. };
  8. // Créer une nouvelle balle enregistrée dans un IC :
  9. Bullet* CreateBullet(InstanceController * IC)
  10. {
  11. // alloc mémoire
  12.   Bullet * B = new Bullet;
  13.   Bullet ** Tmp = malloc(sizeof(Bullet) * (IC->NumBullets+1));
  14.   // Réallocation du tableau (y'a peut être realloc qui existe en C)
  15.   memcpy(IC->BulletList, Tmp, sizeof(Bullet) * (IC->NumBullets));
  16.   free(IC->BulletList);
  17.   IC->BulletList = Tmp;
  18.   IC->BulletList[IC->NumBullet] = B;
  19.   ++IC->NumBullets;
  20.   return B;
  21. }
  22. void UpdateIC(InstanceController * IC)
  23. {
  24.   for (int i=0;i<IC->NumBullets;++i)
  25.     UpdateBullet(IC->BulletList[i]);
  26. for (int i=0;i<IC->NumObject;++i)
  27.    UpdateObject(IC->ObjectList[i]);
  28. // Ensuite là tu vérifie les collisions, mais j'ai la flemme de faire le code, et puis je sais pas si tu comptes faire des AABB ou des Bounding Spheres ou autre.
  29. // Lorsqu'une collision est détectée (je te laisse zieuter les codes pour les AABBs & les Bounding spheres, c'est très simple à faire), tu peux appeler une fonction de traitement, qui s'occupera de baisser la vie / tuer un perso
  30. }
 

Normalement, ton jeu doit être comme ça dans le main :

 
Code :
  1. boucle principale cassée lorsqu'on veut quitter le jeu
  2.     Tick : Mise à jour de tout les objets du jeu (balles, persos, etc,etc)
  3.     effacer l'écran
  4.     Draw : Dessin de tout les objets
  5.     Timer de pause pour limiter le framerate
  6. fin boucle


Donc, le tick serait l'appel de UpdateIC(...), le Draw DrawIC (où tu fais tes blits en fonction des coordonnées x & y et de l'image associée de tout les objets contenues dans ta structure)

 

En C++, étant donné que tu peux faire du polymorphisme, c'est nettement plus pratique pour ce système là.

 

Et je vois pas pourquoi faire des printf ça l'aiderait, que ce soit avec la SDL ou en console c'est pareil, en fait c'est carrément plus chiant en console :D

 

L'intégration d'un système comme ça en C peut être assez chiant, mais une fois mis en place, le reste est facile.

 

edit : Je suis pas programmeur C, donc y'a probablement des espèces de résidu de C++ zarb dans mon code, il me semble qu'il faut préciser le mot-clef struct à chaque fois qu'on se sert d'une variable de type structure, ou alors via un typedef mais la flemme de vérifier :o


Message édité par Terminapor le 10-06-2013 à 01:04:12

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 10-06-2013 à 18:50:09    

sx72100 a écrit :

Merci Djswiti pour ta réponse :) Le problème c'est que mon projet (qui est scolaire) est déjà pas mal avancé dans d'autres domaines, et ce que j'arrive à faire en console ne fonctionne pas trop quand je l'intègre au projet. En SDL, mon perso se déplace, interagit avec le décor etc etc. Me manque la fonction TIR... Je vais suivre ton conseil et retester en console ! Si quelqu'un à d'autres solutions... :) Merci encore.  


 
En fait, l'essayer en console te prouve que tu fais bien ce que tu penses faire.
"afficher un X a la collision", etc.
 
Apres si tu as deja une partie graphique 100% fonctionnelle tu peux tres bien le faire directement en mode graphique, et donc si ton jeu est deja tres avance, tu peux en effet le faire directement...
 
Dis toi que pour lancer un tir, il faut simplement que tu fasses comme si tu deplacais un joueur (mais un tir est une nouvelle entite), mais sans appuyer sur la touche continuellement.
Tant que tu ne touches pas d'objet (ni de personnage) alors le tir continue dans sa trajectoire.

Reply

Marsh Posté le 10-06-2013 à 21:03:58    

Merci pour vos conseils :)
Mon groupe s'est inspiré de ce que m'a proposé Terminapor !  
Merci beaucoup pour votre aide à tous !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed