pacman en C - C - Programmation
Marsh Posté le 16-04-2012 à 22:12:50
Oui, commence et on t'aidera
Marsh Posté le 02-05-2012 à 05:34:51
Je suis également entrain de réaliser un pacman en C avec la bibliothèque SDL, plus j'avance plus je me rends compte qu'il est impératif de bien ranger et d'ordonner son code
Aujourd'hui j'hésite à tout recommencer car je ne parviens pas à placer mon code dans des fonctions...
Code :
|
Je manque clairement de repère et de méthodologie notamment pour la boucle "while" du jeu et le placement du décor ... faut-il créer une structure pour chaque entité du jeu ?
- SDL_BlitSurface
- Pacman
- Ennemi
- Sprites
...
Marsh Posté le 02-05-2012 à 12:08:34
Personnellement, je conçois pas tellement de programmer un jeu sans POO, c'est beaucoup plus simple avec des classes, mais tu peux toujours émuler ça, il te faudrait du coups une structure pour pacman qui contiendrait sa position x/y/image du sprite à afficher, idem pour les fantômes, ensuite tu fais des fonctions du style 'pacman_tick' qui prend un pointeur sur une structure pacman, qui déplacerait celui-ci selon les touches pressés. Pour la carte, une structure aussi jdirais, où y'aurait la largeur/la hauteur et un tableau en 2D pour les tiles placés dessus, et une liste chainée pour la liste des objets (ennemis/objets à ramasser). Ensuite, soit tu fais une instance en global (déclaré hors d'une fonction) soit tu fais passer sur les fonctions tick de pacman/ennemis
edit : Roh lala, la phrase super longue sans point
Marsh Posté le 03-05-2012 à 19:44:08
Pour bien comprendre le fonctionnement de la chose je souhaite procéder step by step en commençant par initialiser une structure générale dans mes constantes :
Code :
|
Maintenant si je souhaite (dans le code que j'ai posté tout en haut) utiliser ma structure en argument pour la fonction jouer()
- par quoi remplacer (SDL_Surface* ecran) ?
- par quoi remplacer "ecran" ?
Marsh Posté le 03-05-2012 à 19:56:17
Par rien, le prototype de jouer sera différent :
Code :
|
Bon, je pense que ta structure "partie" manque d'informations (une liste d'objets pour les ennemies, un pointeur pour le joueur et compagnie)
Marsh Posté le 03-05-2012 à 20:33:59
Très bien, alors pour commencer j'alloue de la mémoire à ma structure dans mon main.c :
Code :
|
Puis je change le prototype dans mon header et dans le fichier.c :
Code :
|
Miracle le jeu se lance correctement
Marsh Posté le 04-05-2012 à 02:48:33
Voui mais pas besoin de faire une allocation mémoire, tu peux faire comme ça :
Partie jeu;
jouer(ecran,&jeu);
le '&' utilisé avant un nom de variable permet de récupérer l'adresse mémoire de celle-ci
Marsh Posté le 04-05-2012 à 20:19:11
Tu veux dire que par cette méthode l'allocation sera automatique et ceci peu importe la taille et les différents paramètres de la structure ?
Marsh Posté le 04-05-2012 à 22:23:10
Terminapor a écrit : Personnellement, je conçois pas tellement de programmer un jeu sans POO |
Même pour le fun et le challenge ? Regarde en quoi est programmé Prince of Persia.
Marsh Posté le 05-05-2012 à 01:50:46
Voui mais pas pour un projet sérieux, c'pour ça que je me tue à implémenter de la pseudo POO en lua
caps lock a écrit : Tu veux dire que par cette méthode l'allocation sera automatique et ceci peu importe la taille et les différents paramètres de la structure ? |
Ben c'est juste qu'au lieu de faire une allocation mémoire via malloc() et de faire passer le pointeur (donc l'adresse vers la nouvelle variable), tu fais directement passer une variable alloué qui sera automatiquement supprimé au moment où le bloc d'instructions est fini
Marsh Posté le 05-05-2012 à 02:37:14
Oui, enfin, à partir du moment ou il a besoin de faire du malloc dans sa struct, ça n'a pas une grande importance, et à la limite, mieux vaut un 'constructeur' et un 'destructeur' uniques qui font tout le boulot.
A+,
Marsh Posté le 05-05-2012 à 22:07:58
Je ne me suis pas encore occupé de toute la partie gestion des fantômes et pourtant lorsque j'exécute le jeu je constate via le gestionnaire des tâches de windows que le jeu prend 100ko de mémoire par seconde, comment je dépanne ça ? (avant de poster mon code ici)
Marsh Posté le 05-05-2012 à 22:18:22
J'ai détecté que l'erreur provenait de la gestion des scores :
Code :
|
Marsh Posté le 07-05-2012 à 06:20:24
Code :
|
Je viens de comprendre qu'actualiser le score en permanence était inutile, j'ai coupé cette ligne et je l'ai rajouté à la suite de chaque déplacement de mon pacman. Du coup maintenant la consommation de la RAM monte "manuellement" dès que je bouge le programme prend +4Ko
EDIT : problème trouvé
- Je pensais que c'était un problème d'allocation de la mémoire avec tableauScore, même après un malloc le problème persistait
- il me manquait un SDL_FreeSurface(texte) avant de remodifier "texte" dans la boucle
Marsh Posté le 07-05-2012 à 09:50:51
Tout ça est dans la doc en ligne de SDL, hein...
google TTF_RenderText_Blended -> http://www.libsdl.org/projects/doc [...] tf_44.html ou on lit:
Code :
|
A+,
Marsh Posté le 09-05-2012 à 00:16:55
Mes amis,
J'ai voulu m'amuser un peu et j'ai dôté d'une bombe mon cher petit pacman.
Je parviens à lui faire poser une bombe et à la faire exploser.
Chaque bloc dans mon jeu fais 25x25 pixel.
La bombe casse tous les murs dans les environs comme selon l'exemple suivant :
X represente un mur
- un chemin
O la bombe
XXX
-O-
XXX
La bombe détruit donc les éléments en diagonale à la différence d'un bomberman classic.
Mon problème c'est que j'ai utilisé pour l'explosion une série d'image qui sont volontairement plus grandes que la taille d'un bloc pour faire quelque chose de réaliste, l'animation est réalisée en 75x75 sauf que vous l'aurez normalement déjà compris l'action démarre à l'emplacement de la bombe et le coin haut/gauche de l'animation vient se blitter en remplacement de l'image de la bombe. Ce qui provoque un gros et affreux décalage de l'image.
Marsh Posté le 09-05-2012 à 02:02:46
Si tu savais les horreurs du codage de certains jeux parfois... http://www.dodgycoder.net/2012/02/ [...] opers.html
Mon favori est celui la:
Citation : My favorite trick has been from "Jak and Daxter" - "trip and fall" - e.g. if the streaming falls behind, make the character trip and fall, thus giving time for the streamer to catch up. |
A+,
Marsh Posté le 09-05-2012 à 07:43:56
En ce qui concerne le déplacement des ennemis, je parviens à en faire bouger un en effectuant un random sur les 4 positions possibles (haut,bas,droite,gauche), outre le fait qu'il ne semble même pas atteindre le QI d'une mouche coincée derrière une fenêtre, je me rends rapidement compte que créer une intelligence artificielle ne sera pas une mince affaire.
- Dans un switch est-il possible de "sauter" le break pour tester une autre possibilité si l'une d'elle échoue ?
Si on prend l'exemple du code suivant, si un mur se trouve au dessus du personnage et que le random choisi la direction HAUT, le personnage n'avancera pas et on sortira du switch...
Code :
|
Deuxième question, je commence à m'intéresser à l'algorithme A* mais est-il implémentable avec le langage C ? car pour le moment je ne trouve que des tutoriels pour le C++
Marsh Posté le 09-05-2012 à 10:09:22
Citation : Dans un switch est-il possible de "sauter" le break pour tester une autre possibilité si l'une d'elle échoue ? |
Tu peux faire
flag = false;
do {
direction = random(...);
switch (direction) {
...
}
} while (!flag);
ou flag est positionné quand tu as effectivement un mouvement.
Mais dans ton cas, il faudrait que la direction soit re-calculée entre le do et le switch, et non pas comme paramètre de la fonction.
Sinon, il te faudra boucler sur l'appel de deplacerEnnemi.
A+,
Marsh Posté le 09-05-2012 à 20:24:19
Lorsque j'écris ce code le personnage ne va en plus haut et je ne parviens pas à comprendre pourquoi
Code :
|
Marsh Posté le 09-05-2012 à 22:55:59
if ((ennemi->y - 1 < 0)||(carte[ennemi->x][ennemi->y - 1] == MUR)||(carte[ennemi->x][ennemi->y - 1] == BOMBE)) {
direction=(rand() % 4); // <---------- nouvelle ligne
break;
}
images->ennemiActuel = images->ennemi[HAUT];
ennemi->y--;
break;
case BAS:
non?
Voila pourquoi certains dont je fais partie mettent presque toujours des accolades pour un if, quand bien même il ne fait qu'une ligne.
A+,
Marsh Posté le 12-05-2012 à 03:38:54
J'ai créé une fonction RandomEnnemi comme son nom l'indique qui déplace un ennemi aléatoirement. Cette fonction est placée dans la boucle while() et est "timé" pour être effectué une fois toute les 150ms.
J'essaie donc de créer un semblant d'intelligence en faisant parcourir aléatoirement la carte à mon ennemi, à chaque fois qu'il rencontrera un mur ou quelque chose qui indiquera qu'il ne peut pas passer les coordonnées seront inscrites dans le fichier "test.txt"
Code :
|
Maintenant que j'ai créé un fichier qui actualise en temps réel les mouvements impossible de l'ennemi je n'arrive pas du tout à l'exploiter... J'ai imaginé à un moment créer une sorte de boucle de la fonction ci-dessus en mettant le fichier en paramètre.
Voici ce que je veux faire et mettre dans la boucle principale :
Code :
|
Je suis bloqué là-dessus depuis un moment car :
- je ne parviens pas à exploiter les données de mon fichier
- je trouve le fichier mal conçu car les "mauvaises coordonnées" sont présentes de nombreuses fois dans le fichier, pour bien faire il faudrait empêcher la répétition des mouvements dans le switch
Marsh Posté le 14-05-2012 à 07:42:29
Nouveau problème!
Je me sers d'un éditeur de niveau pour modifier ma carte de jeu et également d'une énumération pour chaque élément du décor :
0 MUR
1 PACMAN
2 BONUS etc
10 PORTE
La liste est maintenant supérieur à 9 et donc le code suivant n'est plus compatible :
Code :
|
Pour faire simple, la valeur 10 qui doit représenter une porte est comprise comme un 1 et un 0 (PACMAN + MUR)
Si je modifie le "fprintf(fichier, "%d ", niveau[j][i])" en rajoutant un espace après le %d je ne parviens pas à inclure cet espace dans la formule de fgets().
Dans le pire des cas je pense régler cette histoire en forçant un saut de ligne après chaque valeur mais ça ne m'arrange vraiment pas!
Si quelqu'un a une idée
EDIT : en remplaçant %d par %x ça semble fonctionner
Marsh Posté le 14-05-2012 à 12:19:34
Quand tu sauvegardes valeur par valeur (ici avec un blanc entre chaque valeur et un saut de ligne après chaque ligne)
Code :
|
Tu lis valeur par valeur:
Code :
|
Bon, j'ai pas testé le code, mais tu vois l'idée.
Comme de toute façon, la lecture de ton fichier est bufferisée, c'est pas vraiment beaucoup plus coûteux qu'une lecture unique avec fgets.
A+,
Marsh Posté le 25-06-2012 à 07:28:44
gilou a écrit : |
C'est plus simple à lire je suppose.
Marsh Posté le 25-06-2012 à 10:21:23
C'est surtout plus simple à maintenir:
Pas de risque d'erreur si on rajoute des lignes, pas de pb de dangling if, etc.
Et comme j'écris aussi pas mal de perl, langage dans lequel les parenthèses sont obligatoires pour une instruction après un if (mais pas une avant il me semble ), ça évite de se poser des questions.
Et comme le compilo va générer le même code...
A+,
Marsh Posté le 10-04-2013 à 18:06:44
slt tt le monde , moi aussi, je suis entrain de faire un jeu de pacman à l'aide de SDL, mais le probleme que le deplacement de pacman ou des enemies n'est pas fluide, il fait un saut d'une case chaque deplacement , comment faire pour rendre pacman et les ennemies se bougent d'un pixel!!
Marsh Posté le 11-04-2013 à 01:06:58
En déplaçant d'un pixel ?
Marsh Posté le 15-04-2012 à 16:36:52
kelk1 peut m'aider a programmer pacman en C a l'aide de la bibliothéque SDL??