
/**************************************************************************
DECOR TILEMAP: 3 décors successifs construit avec des tuiles
à partir d'un tableau de matrices 2D décrivant chaque terrain
Appuyer sur une touche pour passer au niveau suivant
**************************************************************************/
#include <allegro.h>
// Pour plus de simplicité : constantes des tuiles utilisées en globale
// ( pour gérer plusieurs ensembles de tuiles il faudrait
// mettre ces informations dans une structure ... )
#define NTUILE 6 // Nombre de tuiles graphiques utilisées
#define TXTUILE 100 // Largeur des tuiles
#define TYTUILE 100 // Hauteur des tuiles
#define NCOLTUILE 3 // Nombre de colonnes de tuiles dans le fichier image
#define NXMAP 8 // Nombre de tuiles en largeur sur le terrain
#define NYMAP 6 // Nombre de tuiles en hauteur sur le terrain
#define NTERRAIN 3 // Nombre de niveaux (= écrans de jeu)
// Sur cet exemple on a un seul ensemble de tuiles
// ( on s'autorise une globale, là encore pour simplifier )
BITMAP *tableTuiles;
// 3 terrains de jeu
int tabTerrains[NTERRAIN][NYMAP][NXMAP] = {
{
{ 1, 2, 1, 2, 1, 2, 1, 2},
{ 2, 0, 3, 3, 3, 3, 0, 1},
{ 1, 3, 4, 5, 4, 5, 3, 2},
{ 2, 3, 5, 4, 5, 4, 3, 1},
{ 1, 0, 3, 3, 3, 3, 0, 2},
{ 2, 1, 2, 1, 2, 1, 2, 1},
},
{
{ 4, 5, 4, 5, 4, 5, 4, 5},
{ 5, 3, 0, 0, 0, 0, 3, 4},
{ 4, 0, 1, 2, 1, 2, 0, 5},
{ 5, 0, 2, 1, 2, 1, 0, 4},
{ 4, 3, 0, 0, 0, 0, 3, 5},
{ 5, 4, 5, 4, 5, 4, 5, 4},
},
{
{ 3, 4, 4, 4, 4, 4, 4, 3},
{ 4, 3, 3, 3, 3, 3, 3, 4},
{ 4, 3, 5, 5, 5, 5, 3, 4},
{ 4, 3, 5, 5, 5, 5, 3, 4},
{ 4, 3, 3, 3, 3, 3, 3, 4},
{ 3, 4, 4, 4, 4, 4, 4, 3},
}
};
/******************************************/
/* SOUS-PROGRAMMES */
/******************************************/
// Dessine la tuile numéro ituile sur la bitmap bmp au coordonnées xmap ymap
// (unité en nombre de tuiles, pas en pixels)
void dessineTuile(BITMAP *bmp, int ituile, int xmap, int ymap){
int lig, col; // ligne et colonne de la tuile source dans tableTuiles
// Le numéro de ligne et de colonne dans un tableau 2D
// à partir de l'indice du ième élément (en comptant de gauche à droite
// et de haut en bas) s'obtiennent avec le quotient et le reste
// dans la division de l'indice par le nombre de colonnes du tableau
lig = ituile / NCOLTUILE;
col = ituile % NCOLTUILE;
// on copie juste le morceau concerné
blit(tableTuiles, bmp, col*TXTUILE, lig*TYTUILE,
xmap*TXTUILE, ymap*TYTUILE, TXTUILE, TYTUILE);
}
// Dessine un terrain complet sur une bitmap
// (en général on dessinera sur le buffer, ici on utilise directement screen)
void dessineTerrain(BITMAP *bmp, int terrain[NYMAP][NXMAP]){
int xmap,ymap;
for (ymap=0;ymap<NYMAP;ymap++)
for (xmap=0;xmap<NXMAP;xmap++)
dessineTuile(bmp,terrain[ymap][xmap],xmap,ymap);
}
// Chargement "sécurisé" d'une image :
// interrompt le programme avec un message si problème...
BITMAP * load_bitmap_check(char *nomImage){
BITMAP *bmp;
bmp=load_bitmap(nomImage,NULL);
if (!bmp)
{
allegro_message("pas pu trouver %s",nomImage);
exit(EXIT_FAILURE);
}
return bmp;
}
/******************************************/
/* PROGRAMME PRINCIPAL */
/* initialisation puis boucle de jeu */
/******************************************/
int main()
{
int niveau=0;
// Lancer allegro et le mode graphique
allegro_init();
install_keyboard();
set_color_depth(desktop_color_depth());
if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0)!=0)
{
allegro_message("prb gfx mode");
allegro_exit();
exit(EXIT_FAILURE);
}
// Charger le fichier avec les tuiles
tableTuiles=load_bitmap_check("images/tilemapLaby/tableTuiles.bmp");
// Boucle de jeu
while (!key[KEY_ESC])
{
// Dessiner le terrain d'exemple
dessineTerrain(screen, tabTerrains[niveau]);
textprintf_ex(screen,font,10,10,makecol(255,40,40),0,"NIVEAU : %d",niveau);
// Attendre une touche
readkey();
// Passer au niveau suivant (ou repartir à 0)
niveau++;
if (niveau>=NTERRAIN)
niveau=0;
}
return 0;
}
END_OF_MAIN();