Julien Durieux Rémi Duhautoy |
1 ère année groupe C I .U.T. Amiens |
|
Compte-Rendu
LANGAGE C
Super Hyper Mega Extra Version
Gold Deluxe |
|
|
Année
2001 – 2002 |
Pour M. FOFI |
..:: SommairE ::.. |
|
I |
Fiche
Technique |
Page |
1 |
Fichiers |
Les noms des fichiers utilisés. |
3 |
2 |
Compilation |
Toutes les explications pour réussir à compiler
le fichier source. |
3 |
3 |
Description |
Qu’est-ce que Pacman ? |
4 |
4 |
Auteurs |
Le nom des auteurs et comment les contacter. |
4 |
|
II |
Interface |
Page |
1 |
Menu |
Quelques infos sur le fonctionnement du menu. |
5 |
2 |
Jouer |
Comment avoir et saisir un code. |
5 |
3 |
Options |
Quelles sont les options paramétrables ? |
6 |
4 |
Touches |
Les touches à utiliser pendant le jeu. |
6 |
5 |
H.U.D. |
Les infos données à l’écran. |
6 |
|
III |
Code
& Algo |
Page |
1 |
Main.cpp |
Explications du code de main.cpp, le fichier
principal. |
7 |
2 |
Affiche.h |
Explications du code du header affiche.h, qui
affiche les scores. |
9 |
3 |
Draw.h |
Explications du code du header draw.h, qui
affiche les dessins. |
10 |
4 |
Menu.h |
Explications du code du header menu.h, qui gère
le menu. |
11 |
5 |
Extra.h |
Toutes les autres fonctions non classables. |
12 |
A |
Déplacer |
Comment se déplace-t-on et comment fonctionne
l’I.A. ? |
13 |
B |
Dessiner |
Comment dessine-t-on Pacman et le monstre ? |
15 |
|
IV |
Modifications |
Page |
1 |
Carte |
Comment faire sa propre carte de jeu. |
16 |
2 |
Niveaux |
Comment changer l’ordre et le nombre de cartes
dans une partie. |
17 |
3 |
Options |
Comment fonctionne le fichier options. |
17 |
4 |
Tricher |
Comment tricher. |
17 |
I] FichE TechniquE |
1 |
Fichiers |
|
Les fichiers contenant le code source du jeu : main.cpp : fichier
source principal. affiche.h : header avec
fonctions d'affichage des scores. draw.h : header
avec fonctions de dessin. extra.h : header
avec les autres fonctions non classables. menu.h : header
avec les fonctions permettant de gérer le menu. |
|
Les fichiers externes permettant de jouer : nivo.map : tous les
niveaux à lancer durant le jeu. nivoXX.map : niveau n°XX du
jeu. options.map : options du jeu. readme.txt : fichier d'aide
et d'information. score.map : high scores du
jeu, avec nom et score. |
|
Les fichiers externes au programme : bold.chr : fichier de
police de caractère DOS. litt.chr : fichier
de police de caractère DOS. egavga.bgi : extension
graphique EGA/VGA. |
2 |
Compilation |
|
Le compilateur utilisé est Borland ® Turbo C++ 3.0. Le programme est fait en langage C. Les librairies graphiques du compilateur sont utilisées. |
|
Plusieurs options doivent être modifiée pour permettre
la compilation du jeu : Mémoire Large : options/compiler/code
generation/model->large Graphics.h ON : options/linker/librairies->Graphics
Librairy ON Tas 256
ko : options/debugger/program
heap size->256 ko Chemin
: file/change dir… |
|
Les bugs connus qui arrivent aléatoirement mais relativement peu
souvent : Touches :
Pour faire avancer Pacman, il suffit d’une simple pression sur la touche pour
donner la direction du Pacman. Si on reste trop souvent appuyé sur la touche,
le jeu peut se bloquer, certainement à cause du buffer du clavier trop
remplit. La fonction fflush(stdin) a été utilisée et le problème
semble réglé. Mémoire :
le jeu peut provoquer certaines erreurs de mémoire, même avec les options du
compilateur à fond. Le problème semble réglé avec des allocations de mémoire
plus strictes et des passage par adresse dans les procédures. |
3 |
Description |
|
Pacman est un grand classique, d’ailleurs ce fut le
premier héros du jeu vidéo, longtemps avant Mario, en 1980. Développé par NAMCO ®, il fut l'un des plus grand succès
en arcade de tous les temps. |
|
Le but du joueur est de récolter toutes les petites
boules blanches du niveau sans se faire dévorer par les vilains monstres pas
beaux. Celui qui en dévore le plus entre dans le high scores ! Le tout
se déroule dans de nombreux niveaux variés. |
|
Notre but (celui des programmeurs) est avant tout de
créer un jeu évolutif, non répétitif, modulable, simple d’accès et beau
graphiquement (avec les faibles possibilités offertes par l’environnement
DOS). Evolutif et modulable dans le sens où le jeu est très
personnalisable. On peut tricher, on peut créer ses propres cartes pour
jouer, on peut personnaliser le jeu sans rien reprogrammer ou recompiler. Non répétitif car les décors sont sans cesse
changé et que les maps sont toutes très différentes, allant du simple niveau
carré au labyrinthe complexe. Simple d’accès puisque le menu est clair, les
touches et les mouvements sont simples et que les objectifs sont
compréhensibles par tous. Surtout qu’un PC puissant n’est pas forcément
requis. Beau graphiquement car une bonne partie de la
programmation s’est résumée à tester différents aspects pour Pacman,
différentes sortes de textures pour les murs, différentes formes monstrueuses
… pour les monstres. D’ailleurs le son n’est pas en reste et l’introduction
du jeu en est la preuve. |
4 |
Auteurs |
|
Les deux programmeurs/designers du projet : Julien "BeLZeL" DURIEUX (belzel@free.fr) Rémi
"The SetFillStyle" DUHAUTOY (re-mail@9online.fr) |
|
Remerciements particulier : A Samuel "Sergio Wesh Wesh" MONTEIRO pour la
création de nombreux niveaux originaux. |
II] InterfacE |
1 |
Menu |
|
Le menu est constitué de quatre boutons
principaux : Jouer Ce menu est expliquer plus en détail après. Il permet
tout simplement de commencer une partie. Options Vous pouvez personnaliser le jeu via le menu des options. Aide Vous pouvez lire la petite aide du jeu. Vous trouverez
néanmoins plus d’infos dans le fichier texte readme.txt (ou ici). Quitter Ce bouton permet de quitter
le jeu. Pour quitter le jeu durant une partie, appuyez sur Entrée. Dans chaque sous menu présenté
plus haut, vous avez le choix de confirmer (Ok) ou d’annuler (Annuler) vos
modifications en cliquant sur le bouton correspondant. A noter aussi que
lorsque vous placez le curseur de la souris sur un bouton, son contour change
de couleur. |
2 |
Jouer |
|
Le menu Jouer permet
au joueur de choisir entre deux possibilités pour commencer une partie : Jouer
seul Une nouvelle partie se lance
automatiquement. C’est le choix qu’il faut faire si vous lancez le jeu pour
la première fois. Entrez un code Le joueur peut entrer un code de
8 caractères, lui permettant de retourner à n’importe quel niveau déjà fini. |
3 |
Options |
|
Vous choisissez votre sous
menu avec les flèches haut/bas et vous changez les valeurs avec les flèches
gauche/droit. Son [
ON / OFF ] Vous pouvez choisir de
laisser le son ou de le couper pour ne gêner personne. Couleur
Pacman Vous pouvez choisir la
couleur de votre Pacman. La couleur par défaut reste le jaune, mais tout
autre couleur peut être utilisée, à part la couleur de BackGround. Couleur
Background Vous pouvez choisir la
couleur de l’arrière plan des cartes. Par défaut, la couleur est le rouge
clair. Là, toutes les couleurs sont possibles, sauf le blanc. |
4 |
Touches |
|
Les touches utilisées pendant
le jeu sont simples. Dans
le menu, vous devez utiliser la souris pour faire votre
choix. Pour faire des changements ou changer de sous menu, vous devez
utiliser les touches fléchées. Durant
le jeu, il faut utiliser les touches fléchées pour les
directions (haut, bas, gauche, droite). La touche Entrée sert à
quitter. |
5 |
H.U.D. |
|
Le
High Scores affiche les meilleurs scores réalisés avec le
jeu. Il y a, à gauche, le nom du joueur, suivi de son score. Le tout est
classé par ordre du plus gros score. Les Points sont comptabilisés par rapport
au nombre de boules blanches mangées. A chaque fois, le nombre de points
augmente d’une unité. Les Vies sont allouées au départ du jeu.
Elles sont au nombre de cinq par défaut. Dès que vous vous faites manger par
un monstre, vous perdez une vie. Si vous n’avez plus de vie et que vous
mourrez, le jeu est terminé. Les Bonus ne sont pas implémentés dans
cette version. Le Temps n’est pas un facteur important.
Il n’y a pas de limite de temps pour finir un niveau. Il est juste là à titre
indicatif. Le Niveau est le nom actuel du niveau. |
III] CodE & AlgO |
1 |
Main.cpp |
|
Les headers du compilateur utilisés : #include
<graphics.h> // Header graphique #include
<conio.h> // Header pour la console #include
<stdio.h> // Header d'entrée/sortie #include
<dos.h> // Header pour les fonctions dos #include
<stdlib.h> // Header pour les lib. standard #include
<math.h> // Header pour les maths #include
<string.h> // Header pour les chaines #include <bios.h> //
Header pour les touches |
|
Les constantes utilisées : #define
EXIT { fclose(fichier); exit(0); } //
permet de quitter plus rapidement un fichier #define
T_CASE 20 //
taille d'une case (en pixel) #define
T_CASE_2 10 // taille d'une demi-case Les constantes utilisées pour les maps
: #define
M_SOL 0 //
sol sans boule #define
M_SOLB 1 //
sol avec boule #define
M_PACMAN 2 //
point de départ du pacman #define
M_MONSTRE 3 // point de départ des monstres #define
M_BONUS 4 //
emplacement des bonus #define
M_CLE 5 //
emplacement d'une clé #define M_PORTE
6 // emplacement d'une porte #define M_MUR
7 // emplacement des murs |
|
Les structures utilisées : La structure du jeu : struct struct_jeu { int nivo; //
niveau en cours int score; //
score du joueur int sec; //
secondes et ... int min; //
minutes de jeu char nom[10]; //
nom du joueur int son;
// son (1:activé) int nb_nivo; //
nombre de niveaux int bkground; //
couleur de background int min_score; //
score mini au highscore struct struct_nivo { char nom_map[15]; // nom d'une map } path[50]; //
nombre de maps chargées struct struct_score // chargement des maps { char nom[15]; //
nom du joueur au highscore int points; //
avec ses points } hscore[5]; //
chargement des high scores } jeu; // structure de la partie La structure des boutons du menu : typedef
struct { int x1, x2; //
coin hg du bouton int y1, y2; //
coin bd du bouton int etat; // etat
(mouseover, clic) char text[25]; //
nom du bouton } struct_boutons; La structure des maps : typedef struct { int val[20][20]; //
matrice de la carte (x et y) int width; //
largeur (en case) int height; //
hauteur (en case) int coinx; //
haut gauche (x) int coiny; //
haut gauche (y) char nom[20]; //
nom de la map long int
code; // code barre de la map int boules; //
compte le nombre de boules int load; //
map chargée (0:non / 1:oui) int nb_monstres; //
nombre de monstres } struct_map; //
nom de la structure La structure du pacman : typedef struct { int touch1; //
première touche appuyée int touch2; //
seconde touche appuyée float startx; //
position de départ (x) float starty; //
position de départ (y) float x; //
position réel de Pacman (x) float y; //
position réel de Pacman (y) float oldx; //
position précédente (x) float oldy; //
position précédente (y) int bouge; //
0 : no move / 1 : bouge long int
score; // score effectué int angle; //
angle formé par la bouche int ouvre; //
ouvre (ou non) la bouche int vie; //
le nombre de vie de Pacman int color; //
couleur du pacman int mort; //
pacman mangé } struct_pacman; //
nom de la structure La structure du monstre : typedef struct { int touch1; //
déplacement principal int touch2; //
déplacement secondaire float startx; //
position de départ (x) float starty; //
position de départ (y) float x; //
position réel du monstre (x) float y; //
position réel du monstre (y) float oldx; //
position précédente (x) float oldy; //
position précédente (y) int bouge; //
0 : no move / 1 : bouge } struct_monstre; //
nom de la structure |
|
Le fichier main.cpp ne contient que la fonction main().
Cette fonction fait tourner à elle seule tout le programme. Pour plus de
simplicité, de visibilité et de clarté, la fonction principale rappelle
plusieurs fonctions secondaires. Le déroulement du programme : è Déclaration de toutes
les variables locales. è Lancement de l’intro. è Lancement du menu
(avec la souris). è Lancement de la
partie. o
Tant que la touche est différente de 13 (touche entrée) o
Déplacement du monstre. o
Déplacement du pacman. o
Gestion des scores et de l’affichage, avec nombreux
tests. |
2 |
Affiche.h |
|
Ce header sert essentiellement à afficher du texte, sous forme graphique. Le contenu du header : #include
"affiche.h" // void affiche_score(long int
score, int refresh) // void affiche_vie(int
vie, int refresh) // void affiche_bonus(int
bonus, int refresh) // void affiche_temps(struct time &t,
struct time &told, struct time &deb, struct_jeu &jeu) // void
affiche_nivo(char *msg, int refresh) // void affiche_HighScore(int
pos) affiche_score(long
int score, int refresh) Cette procédure affiche le score sur 8 chiffres (%08d)
et ne l’affiche que lorsque refresh est à 1, pour éviter tout effet de
scintillement. Si refresh est à 0, on efface le texte en le mettant en noir. affiche_vie(int
vie, int refresh) Dans le même principe que la procédure précédente, elle
affiche le nombre de vie restante. affiche_bonus(int
bonus, int refresh) Dans le même principe, cette procédure affiche le bonus
utilisé. Le problème, c’est qu’aucun bonus n’a pu être ajouté. affiche_temps(struct time *t, struct
time *told, struct time *deb, struct_jeu *jeu) Cette procédure affiche le temps qui s’écoule. T
est le temps actuel, Told est le temps de la dernière modification, Deb
est le temps qu’il était au début de la partie. On affiche les secondes que
si les secondes de T et Told sont identiques, sinon on affiche
un texte noir. Idem pour les minutes. On met le temps écoulé dans la
structure jeu. affiche_nivo(char
*msg, int refresh) Cette procédure affiche le nom du niveau pointé par
char, seulement si refresh vaut 1. affiche_HighScore(int
pos) Cette
procédure affiche le High Score. La position d’affichage de celui différera
grâce à la variable pos. Pour le mettre à gauche (pendant la partie), pos
vaut 0. Pour l’afficher au milieu (à la fin de la partie), pos vaut 270. |
3 |
Draw.h |
||||
|
Ce header sert principalement à dessiner des formes, que ce soit les murs, le
Pacman, les monstres ou les boules. Le contenu du header : #include "draw.h" //
void draw_mur(int
x, int y, struct_map *map) //
void draw_boule(int
x, int y, struct_map *map) //
void draw_megaboule(int
x, int y, struct_map *map) //
void draw_pacman(struct_pacman &pacman,
struct_map &map) //
void draw_monstre(struct_monstre &monstre,
struct_map &map) //
void draw_map(struct_pacman &pacman,
struct_monstre &monstre, struct_map &map) //
int LoadMAP(char
*map_name, struct_map *map, long int code) //
int LoadMAPS(char
*map_name) draw_mur(int x, int y, struct_map
*map) Cette procédure affiche un mur carré selon sa position
(X, Y). Le type du mur dépend du numéro du niveau. Il existe 4 types de murs
différents.
draw_boule(int
x, int y, struct_map *map) Cette procédure affiche une petite boule blanche à la
position (X, Y) passée en paramètre. draw_megaboule(int
x, int y, struct_map *map) Cette procédure affiche une boule rouge qui aurait du
servir à donner l’invincibilité au Pacman, pour qu’il puisse manger les
monstres. draw_pacman(struct_pacman &pacman,
struct_map &map) Cette procédure affiche tout simplement le Pacman, dans
les quatres directions possibles. Si aucune direction n’est choisie, Pacman
se met en boule. draw_monstre(struct_monstre
&monstre, struct_map &map) Cette procédure affiche un monstre tout rouge. Tous les
monstres sont de la même couleur et ne change pas de tête selon la direction. draw_map(struct_pacman &pacman,
struct_monstre &monstre, struct_map &map) Cette
procédure est la procédure principale de dessin et qui va lancer toutes les
procédures secondaires précédentes. C’est ici que la structure map va
être testée. Selon le résultat trouvé, on demandera l’affichage d’un mur,
d’un Pacman, d’un monstre, d’une boule. LoadMAP(char *map_name, struct_map
*map, long int code) Cette procédure charge un niveau. Elle va lire le
fichier passé en argument, caractère par caractère et selon le caractère
trouvé, on affichera un chiffre dans la structure map. Le code, par
manque de temps, aurait du être crypté, mais faute de mieux, il sert tout de
même à éviter certaines tricheries. LoadMAPS(char
*map_name) Cette
procédure charge tous les codes de toutes les maps qui seront jouées durant
le jeu. Il permet principalement de vérifier l’authenticité des maps mais
aussi de rendre possible le fait de pouvoir entrer un code pour arriver à un
niveau spécifique qu’on a déjà terminé. |
4 |
Menu.h |
|
Ce header affiche et gère le menu qui se lance au début du jeu.
Ici, rien de bien compliqué à part l’utilisation de la souris (avec
l’interruption 33h en assembleur Intel) et l’affichage d’un cube tremblant. Le contenu du header : #include "menu.h" //
void init_cadre() //
void cube(float
*c, float *s) // int
menu_principal() // int menu_jouer() // int menu_options(struct_pacman &pacman) // int menu_aide() init_cadre() Cette procédure dessine un rectangle bleu dans le menu,
point par point. cube(float *c, float *s) Cette procédure dessine et fait pivoter un cube en 3D
grace à une équation mathématique. Les angles sont passées en argument. Ce
n’est pas une équation que j’ai inventé mais une conversion d’un programme en
Qbasic. L’implémenté dans le menu, avec sa propre fonction, ne fut pas une
partie de plaisir. J’ai du utiliser deux Static
Int pour garder les angles en mémoire sans les passer par
argument. Les
autres fonctions du header n’ont pas besoin d’être décrites, elles sont
trivialement compréhensibles. |
5 |
Extra.h |
|
Ce header est un mixage de toutes les fonctions non
classables. Le
plus dur et l’un des premiers défis du projet, fut de créer l’intro du
jeu. Après quelques problèmes de mémoire, l’intro est une réussite. Le contenu du header : #include
"extra.h" // void WriteScore(char
*nivo_name, char j_nom[10], int &points) // int LoadScore(char
*nivo_name) // int getkey() // void random_touch(int &touch1, int
&touch2) // void
joue_son(int Hertz, int
Dispo, int Delais) //
void intro() //
void init_graph() WriteScore(char
*nivo_name, char j_nom[10], int &points) Cette procédure enregistre le high scores dans un
fichier. En réalité, il recopie le high scores chargé en début de partie et
insère le nom et les points du nouveau joueur. LoadScore(char
*nivo_name) Cette procédure charge le fichier des high scores. getkey() Cette procédure permet d’utiliser toutes les touches du
clavier sans avoir de conflits. Elle est la seule à ne pas avoir été créée de
toute pièce. random_touch(int &touch1, int
&touch2) Cette procédure permet de déplacer le monstre de façon
aléatoire. joue_son(int
Hertz, int Dispo, int Delais) Cette procédure joue un son unique, seulement si
l’option est activée. Ensuite, on réalise un délais qui attend la note
suivante. intro() Cette
procédure lance l’intro du jeu, avec la fusée et le texte « La Team
Rockets presents ». init_graph() Cette
procédure initialise l’affichage du jeu et des pilotes graphiques MS-DOS. |
A |
Déplacer |
|
Le Pacman se devait d’avoir un
déplacement fluide et pratique. Après quelques
tatonnements, les premiers problèmes sont arrivés. Si on déplace Pacman de
case en case, on perd l’effet de fluidité (même si on gagne considérablement
en facilité de programmation). Il a alors fallu modifier une partie du code
pour permettre au Pacman de se déplacer d’un quart de case à la fois. Ensuite, les collisions du Pacman
avec les murs, les monstres et les boules blanches ont été difficile à faire
mais finalement, en multipliant les tests, on arrive à un excellent résultat. Pour le côté pratique, deux touches de
directions, une principale et une secondaire, sont attribuées au joueur
pour déplacer le Pacman. |
|
fflush(stdin); //
on vide le buffer du clavier // si on appuie sur une
touche et que Pacman ne bouge pas if ((kbhit()) &&
(pacman.touch1==0)) { pacman.bouge=1; // on fait bouger Pacman pacman.touch1=getkey(); // on lit la touche } // on dessine Pacman sans le
déplacer draw_pacman(pacman, 0, &map); // s’il bouge if ((pacman.bouge == 1)
&& (pacman.touch1 != 13)) { // s’il rappuie sur une touche, on fait une mise à
jour if
(kbhit()) { if (pacman.touch2==0) pacman.touch2=pacman.touch1; pacman.touch1=getkey(); } // on déplace Pacman avec sa direction principale draw_pacman(pacman, 1, &map); // s’il bouge, on met le
secondaire à 0 if ((pacman.bouge == 1)&&(pacman.touch2 != 0)) pacman.touch2=0; // sinon, on le déplace avec
sa direction secondaire if
((pacman.bouge == 0) && (pacman.touch2 != 0)) { pacman.bouge=1; draw_pacman(pacman,
2, &map); } // s’il est définitivement bloqué if (pacman.bouge==0)
pacman.touch1=0; } |
|
L’intelligence du monstre est très artificielle.
Le plus dur est aussi de gérer plusieurs monstres à la fois sans trop de
problème de mémoire ou de temps. Le déplacement d’un monstre est à l’image
de celui du Pacman, c’est-à-dire que le monstre possède une
direction principale et une direction secondaire. Cela lui permet de pouvoir
se balader correctement dans un labyrinthe sans rester coller contre les
bords. Voulant faire une IA pas trop basique, le
monstre se déplace vers le Pacman si celui-ci est assez éloigné. Parce
que si on garde cet algo quelque soit la position du monstre et du Pacman, le
jeu est beaucoup trop dur. Si le monstre se rapproche du Pacman, ces
déplacements deviennent aléatoires. |
|
// boucle pour déplacer tous
les monstres de la maps for (int nb_m=0;
nb_m<map.nb_monstres; nb_m++) { // si la distance est
supérieure à 12 cases (c’est assez loin) if
(sqrt(pow(pacman.x-monstre[nb_m].x,2) +
pow(pacman.y-monstre[nb_m].y,2))>12) { // on regarde la
position du monstre et du pacman if
(monstre[nb_m].x<pacman.x) monstre[nb_m].touch1=3; if
(monstre[nb_m].x>pacman.x)
monstre[nb_m].touch1=2; if
(monstre[nb_m].y<pacman.y) monstre[nb_m].touch2=4; if
(monstre[nb_m].y>pacman.y)
monstre[nb_m].touch2=1; } // sinon, si le Pacman est
proche du monstre else { // s’il ne bouge plus,
on fait un random des touches if (monstre[nb_m].bouge == 0) { monstre[nb_m].touch1=0; random_touch(monstre[nb_m].touch1,
monstre[nb_m].touch2); } } // s’il ne bouge plus, on
l’affiche tout de même if
(monstre[nb_m].bouge == 0) { monstre[nb_m].bouge=1; draw_monstre(&monstre[nb_m], 0, &map); } // s’il bouge toujours else { // le monstre utilise son déplacement secondaire draw_monstre(&monstre[nb_m], 2, &map); // s’il ne bouge
plus, on utilise le principal if (monstre[nb_m].bouge==0) { monstre[nb_m].bouge=1; draw_monstre(&monstre[nb_m], 1, &map); } // sinon le
déplacement secondaire devient principal else { monstre[nb_m].touch1=monstre[nb_m].touch2; random_touch(monstre[nb_m].touch1,
monstre[nb_m].touch2); } } } |
B |
Dessiner |
|
Le Pacman devait ressembler à l’original,
c’est-à-dire qu’il devait être une grosse boule jaune. Après avoir commencer
avec un vulgaire carré, la forme ronde du Pacman est arrivée (merci la
fonction Circle). Mais c’est là que les problèmes
commencent, parce que Pacman doit changer de tête en fonction de ses
déplacements. Plusieurs options étaient envisagées. On pouvait utiliser la
fonction circle, la fonction arc et la fonction pieslice.
On pouvait aussi tracer le Pacman uniquement avec des lignes, qui formeraient
une boule au final. On a opté pour celle qui utilisait le minimum de fois la
fonction floodfill car parfois on obtient des bugs graphiques
spectaculaires. La fonction pieslice fut choisie puisque qu’elle
n’utilise pas du tout la fonction floodfill, même si ce choix fait
scintiller légèrement le Pacman. On avait aussi le choix de mettre l’image
de Pacman dans une matrice au lieu de le redessiner à chaque fois. Cette
option fut envisagée mais vu qu’on voulait que Pacman ouvre sa bouche et
qu’on avait des problèmes permanent de mémoire, on a opté pour le redessiner
à chaque fois. Pour faire encore plus fun, nous
avons fait le détail qui tue, l’œil du Pacman. |
|
Le monstre doit ressembler à quelque
chose de méchant. C’est pourquoi nous avons décider
d’utiliser la fonction fillpoly qui permet de faire son dessin point
par point puis de la colorier par la suite. Mettre les points au bon endroit
fut la principale difficulté. Cette technique est utiliser pour faire le bas
du monstre. Le haut est un cercle. |
IV] ModificationS |
1 |
Carte |
||
|
Voici toutes les étapes pour réaliser votre propre carte
Pacman. Commencez tout d’abord par créer
un fichier texte dans le même répertoire que le fichier pacman.exe. Ensuite,
vous renommerez ce fichier en mettant un nom de 8 lettres maximum, et ne
mettant l’extension .map. Ouvrez votre fichier avec le bloc-notes
de Windows et structurez votre fichier comme suit : 1 ère
ligne indiquez le nom de votre carte
(8 caractères sans espace). 2 ème
ligne code de 8 chiffres. 3 ème
ligne largeur de votre carte. 4 ème
ligne hauteur de votre carte. Ensuite, créez votre niveau en
utilisant les caractères suivants : * murs (étoile) · boule (Alt + 0183) O point de départ monstres X point de départ Pacman x bonus Attention : respectez la hauteur et la
largeur de votre carte lorsque vous la dessinez avec les caractères. Faites
attention aux éventuels espaces en fin de ligne. Pour jouer sur votre carte : éditez le fichier nivo.map
avec le bloc-notes de Windows. Ajoutez ensuite le nom de votre fichier avec
l’extension .map, à l’endroit désiré. Exemple de la première
carte (nivo01.map) avec le résultat à l’écran :
|
2 |
Niveau |
|
Comment personnaliser sa partie de Pacman, voici les
explications : Editez votre fichier nivo.map.
Vous pouvez tout faire sur ce fichier. Le programme lit le fichier et lance
les map une par une, jusqu’à ce qu’il arrive au point final du fichier. Pour créer votre propre partie
de Pacman, vous pouvez inverser des noms dans le fichier, vous pouvez en
supprimer, vous pouvez en rajouter (s’ils existent). Une seule chose, laisser
le point final. Exemple d’un fichier de
niveau (nivo.map) : nivo01.map nivo02.map nivo03.map nivo04.map nivo05.map . |
3 |
Options |
|
Les options peuvent être modifiées sans passer par le
menu : Pacman : couleur du pacman [0 –
15]. Vie : nombre
de vie au départ du jeu. Son : Activé (1) ou désactivé
(0). Nom : nom du joueur. Background : couleur de
l’arrière-plan [0 – 15]. Exemple d’un fichier d’option (options.map) : pacman
= 14 vie = 3 son = 1 nom = BeLZeL background
= 4 |
4 |
Tricher |
|
Quelques possibilités de tricherie existent : Vous pouvez modifier le fichier nivo.map. Vous pouvez modifier le fichier score.map. Vous pouvez regarder les codes
secrets (de 8 chiffres) des maps en les ouvrant sous le bloc-notes.. Allez
ensuite dans le menu Jouer/Entrer un code et retapez le code trouvé. Vous pouvez vous rajouter un max
de vie en modifiant le fichier options.map. |