J'ai commencé un projet (Mario en SDL) mais cependant, j'ai dès le début un problème : les blocs s'affichent mais n'importe comment. Je m'explique : je charge les blocs depuis mon fichier (comme avec le TP en C sur Mario Sokoban) puis je les affiche mais ça ne marche pas comme souhaité.
Je ne sais pas vraiment comment expliquer ça donc une image et le code vaudront mieux qu'un long discours :
#include "Jeu.h"
void ChargerNiveau(SDL_Surface* ecran)
{
SDL_Surface *Bloc = NULL, *BlocObjet = NULL, *Piece = NULL, *BlocUtilise = NULL;
Bloc = SDL_LoadBMP("Images/Tiles/brickred.bmp");
BlocObjet = SDL_LoadBMP("Images/Tiles/blockq_0.bmp");
Piece = SDL_LoadBMP("Images/Tiles/coin_an0.bmp");
BlocUtilise = SDL_LoadBMP("Images/Tiles/blockq_used.bmp");
int NombreBlocsMaxLongueur = 20;
int NombreBlocsMaxHauteur = 15;
char niveau[NombreBlocsMaxLongueur][NombreBlocsMaxHauteur];
ifstream fichier("C:/Users/baitot/Baitot/Projet/Super Mario Bros/Maps/1-1.lvl");
char a;
for (int i = 0 ; i < NombreBlocsMaxLongueur ; i++)
{
for (int j = 0 ; j < NombreBlocsMaxHauteur ; j++)
{
fichier.get(a);
switch (a)
{
case '0':
niveau[j][i] = 0;
break;
case '1':
niveau[j][i] = 1;
break;
case '2':
niveau[j][i] = 2;
break;
case '3':
niveau[j][i] = 3;
break;
case '4':
niveau[j][i] = 4;
break;
}
}
}
SDL_Rect position;
// Effacement de l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
for (int g = 0 ; g < NombreBlocsMaxLongueur ; g++)
{
SDL_Flip(ecran);
for (int f = 0 ; f < NombreBlocsMaxHauteur ; f++)
{
position.x = g * TAILLE_BLOC;
position.y = f * TAILLE_BLOC;
switch(niveau[g][f])
{
case BLOC:
SDL_BlitSurface(Bloc, NULL, ecran, &position);
break;
case BLOCOBJET:
SDL_BlitSurface(BlocObjet, NULL, ecran, &position);
break;
case PIECE:
SDL_BlitSurface(Piece, NULL, ecran, &position);
break;
case BLOCUTILISE:
SDL_BlitSurface(BlocUtilise, NULL, ecran, &position);
break;
}
}
}
bool done = false;
while (!done)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
done = true;
break;
case SDL_KEYDOWN:
// exit if ESCAPE is pressed
if (event.key.keysym.sym == SDLK_ESCAPE)
{
done = true;
break;
}
}
}
}
SDL_FreeSurface(Bloc);
SDL_FreeSurface(BlocObjet);
SDL_FreeSurface(BlocUtilise);
SDL_FreeSurface(Piece);
}
Et le fichier "1-1.lvl" :
2121
Donc en gros, il devrait juste avoir une "Piece", un "BlocObjet", une "Piece" et encore un "BlocObjet".
- Soit il y a un problème au niveau de la lecture ( vérifie qu'il n'y a pas de soucis de lecture / écriture).
- Soit il y a un soucis au niveau du dessin des tiles sur ta map.
En tout cas il ya un truc que je ne saisie pas :
for (int i = 0 ; i < NombreBlocsMaxLongueur ; i++)
{
for (int j = 0 ; j < NombreBlocsMaxHauteur ; j++)
{
fichier.get(a);
switch (a)
{
case '0':
niveau[j][i] = 0;
break;
case '1':
niveau[j][i] = 1;
break;
case '2':
niveau[j][i] = 2;
break;
case '3':
niveau[j][i] = 3;
break;
case '4':
niveau[j][i] = 4;
break;
}
}
}
Etant donné que ton fichier text ne contient que 4 caractères, essaie plutôt mettre ça :
for (int j = 0 ; j < 4; j++)
{
fichier.get(a);
switch (a)
{
case '0':
niveau[j][i] = 0;
break;
case '1':
niveau[j][i] = 1;
break;
case '2':
niveau[j][i] = 2;
break;
case '3':
niveau[j][i] = 3;
break;
case '4':
niveau[j][i] = 4;
break;
}
}
EDIT : A aussi, je pense qu'il peut y avoir un soucis au niveau de la lecture : par exemple si ton application lit les caractère vide est les considère comme des "0".
Cordialement,
Eyrollz.
- Edité par Plus Tony que Sosa 23 décembre 2014 à 10:24:41
En fait, c'est bon j'ai réglé le problème. Je me rappelle plus exactement comment mais ça marche.
Merci de votre aide !
[SDL] Problème d'affichage
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html