J'ai commencé a faire un jeu du type snake en C++ avec SDL . ( j'utilise Code::blocks avenc mingw sous windows )
Pour l'instant, j'ai fait le menu du jeu et l'éditeur de niveaux.
Mon problème : le niveau n'est pas affiché à l'écran au démarrage !
J'ai utilisé une classe menu qui me permet d'afficher les options du menu, et une classe carte qui contient le niveau, et à des méthode pour, afficher la carte dans l'éditeur, ou dans le jeu, pour modifier la carte, sauver ou charger le niveau.
J'ai vérifié le fichier niveaux.lvl que j'utilise : dans l'éditeur, il sauvegarde bien les modifications dans le fichier, puis quand je demande un cout des valeur du niveau au chargement, j'ai bien les bonnes valeurs ... et il n'afficher pas la carte !
Je pense que c'est un problème d'ordre en un SDL_FillRect et les blittage ou le SDL_Flip, mais j'ai pas trouvé l'erreur.
class Carte { public :
Carte() ;
~Carte() ; int chargerCarte(std::string fichier = "niveaux.lvl") ; int sauverCarte(std::string fichier = "niveaux.lvl") ;
// méthode à utiliser pour blitter la carte dans l'éditeur int afficherJeu(SDL_Surface *ecran) ;
// méthode à utiliser pour blitter la carte dans le jeu int afficherEditeur(SDL_Surface *ecran) ; int modifierCarte(int i, int j, int valeur) ;
// méthode à utiliser pour afficher le terrain choisis dans l'éditeur sous le curseur de la souris int afficherTampon(int valeur, SDL_Rect &position,SDL_Surface *ecran) ;
Carte::Carte() { // le vide est mis en tout point de la carte for(int i = 0 ; i < NB_BLOCS_LARGEUR ; i ++) { for(int j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) {
_carte[i][j] = 0 ; } }
// création des surfaces ...
_vide = SDL_CreateRGBSurface(SDL_HWSURFACE,TAILLE_BLOC,TAILLE_BLOC,BIT_PAR_PIXEL,0,0,0,0);
_mur = SDL_CreateRGBSurface(SDL_HWSURFACE,TAILLE_BLOC,TAILLE_BLOC,BIT_PAR_PIXEL,0,0,0,0);
_tete = SDL_CreateRGBSurface(SDL_HWSURFACE,TAILLE_BLOC,TAILLE_BLOC,BIT_PAR_PIXEL,0,0,0,0);
_queue = SDL_CreateRGBSurface(SDL_HWSURFACE,TAILLE_BLOC,TAILLE_BLOC,BIT_PAR_PIXEL,0,0,0,0);
_pommePossible = SDL_CreateRGBSurface(SDL_HWSURFACE,TAILLE_BLOC,TAILLE_BLOC,BIT_PAR_PIXEL,0,0,0,0);
// ... et remplissage de ces surfaces
SDL_FillRect(_vide,NULL,SDL_MapRGB(_vide->format,128,128,64));
SDL_FillRect(_mur,NULL,SDL_MapRGB(_mur->format,192,192,192));
SDL_FillRect(_tete,NULL,SDL_MapRGB(_tete->format,0,255,0));
SDL_FillRect(_queue,NULL,SDL_MapRGB(_queue->format,128,255,128));
SDL_FillRect(_pommePossible,NULL,SDL_MapRGB(_pommePossible->format,0,0,128)); }
int Carte::afficherEditeur(SDL_Surface *ecran) {
SDL_Rect position ;
for(int j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) { for(int i = 0 ; i < NB_BLOCS_LARGEUR ; i++) { // position de la case en pixel
position.x = i * TAILLE_BLOC ;
position.y = j * TAILLE_BLOC ;
// blittage en fonction de la donnée de la carte switch(_carte[i][j]) { case VIDE :
SDL_BlitSurface(_vide,NULL,ecran,&position) ; break ;
case MUR :
SDL_BlitSurface(_mur,NULL,ecran,&position) ; break ;
case TETE :
SDL_BlitSurface(_tete,NULL,ecran,&position) ; break ;
case QUEUE :
SDL_BlitSurface(_queue,NULL,ecran,&position) ; break ;
else { cerr << "Le fichier " << fichier << " n'a pas pu etre ouvert" << endl ; returnEXIT_FAILURE ; }
niveaux.close() ; } int Carte::sauverCarte(string fichier) { // ouverture en écriture seule
ofstream niveaux(fichier.c_str(),ios::in) ;
// écriture si le fichier est bien ouvert if(niveaux.is_open()) { for(int j = 0 ; j < NB_BLOCS_HAUTEUR ; j++) { for(int i = 0 ; i < NB_BLOCS_LARGEUR ; i++) { switch(_carte[i][j]) { case VIDE :
niveaux << VIDE ; break ;
else { cerr << "Le fichier " << fichier << " n'a pas pu etre ouvert" << endl ; returnEXIT_FAILURE ; }
niveaux.close() ; }
int Carte::modifierCarte(int i, int j, int valeur) { // test pour savoir si les coordonnées sont bien dans la carte if( i >= 0 && i < NB_BLOCS_LARGEUR && j >= 0 && j < NB_BLOCS_HAUTEUR ) { // test pour savoir si on a pas une mauvaise valeur if( valeur == VIDE || valeur == MUR || valeur == TETE || valeur == QUEUE || valeur == POMMME_POSSIBLE)
_carte[i][j] = valeur ;
else { cerr << "La valeur indiquée n'est pas connue" << endl ; returnEXIT_FAILURE ; } }
else { cerr << "Les coordonnées demandées sont en dehors de la carte" << endl ; returnEXIT_FAILURE ; } returnEXIT_SUCCESS ; }
int Carte::afficherTampon(int valeur,SDL_Rect &position,SDL_Surface *ecran) { switch(valeur) { case VIDE :
SDL_BlitSurface(_vide,NULL,ecran,&position); break ;
case MUR :
SDL_BlitSurface(_mur,NULL,ecran,&position); break ;
case TETE :
SDL_BlitSurface(_tete,NULL,ecran,&position); break ;
case QUEUE :
SDL_BlitSurface(_queue,NULL,ecran,&position); break ;
case POMMME_POSSIBLE :
SDL_BlitSurface(_pommePossible,NULL,ecran,&position); break ; } }
void Menu::titre(string titre, SDL_Color couleur,int x,int y, SDL_Surface *ecran) { // création du texte voulu
TTF_Font *arial22 = TTF_OpenFont("arial.ttf",22) ;
SDL_Surface *texte = TTF_RenderText_Blended(arial22,titre.c_str(),couleur) ;
// vérification : peut - on placer le texte ? if( x < 0 || x > ecran->w - texte->w/2 || y < 0 || y > ecran->h - texte->h/2) { cerr << "La position du texte ne permet pas un affichage correct" << endl ; return ; }
// blittage du texte else {
m_position.x = x - texte->w/2 ;
m_position.y = y - texte->h/2 ;
SDL_BlitSurface(texte,NULL,ecran,&m_position); }
#include "constantes.h" #include "Menu.h" #include "niveaux.h" #include "editeur.h" // TODO (PePeDeLuXe#1#): Problème d'affichage dans l'éditeur :\
il y a bien chargement du fichier, écriture du fichier lors de la sauvegarde.\
Il reste à vérifier que lors du chargement _carte[i][j] est bien mis à jour\
\
On remarque aussi que l'affiche est réalisé lorsque l'éditeur est en marche, mais pas à l'initialisation : le fond est noir au lei d'afficher la carte ...
usingnamespace std ;
int main (int argc, char** argv ) { // variables
SDL_Color blanc = {255,255,255} ;
Menu menu ;
// initialisation SDL if( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_TIMER ) < 0) { printf("Erreur de chargement de la SDL: %s\n", SDL_GetError()); return1; }
Vérifie, a tout hasard, que ta surface texte créé dans menu::titre te donne bien quelque chose de correct : en effet, je ne sais pas ce que renvoie SDL_ttf quand il ne trouve pas ta font. Si jamais il renvoie une surface quasiment vide, alors ça expliquerai cela.
Un coup de debuggueur serait le binevenu pour analyser la surface texte apres son allocation.
× 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