Editeur de map

Messages postés
6
Date d'inscription
mercredi 29 octobre 2014
Statut
Membre
Dernière intervention
29 novembre 2014
- - Dernière réponse : cptpingu
Messages postés
3798
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
13 novembre 2019
- 21 nov. 2014 à 16:09
Bonjour, alors voila je vous explique mon soucis , je souhaite amélioré l'éditeur de map de mario sokoban en faisant des cartes plus grandes et en rechargeant seulement une partie de la carte mais je ne sais pas du tout comment m'y prendre ...



 

void editeur(SDL_Surface* ecran)
{
SDL_Surface *mur = NULL, *caisse = NULL, *objectif = NULL, *mario = NULL;
SDL_Rect position;
SDL_Event event;

int continuer = 1, clicGaucheEnCours = 0, clicDroitEnCours = 0;
int objetActuel = MUR, i = 0, j = 0;
int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};

// Chargement des objets et du niveau
mur = SDL_LoadBMP("mur.bmp");
caisse = SDL_LoadBMP("caisse.bmp");
objectif = SDL_LoadBMP("objectif.bmp");
mario = SDL_LoadBMP("mario_bas.bmp0");

if (!chargerNiveau(carte))
exit(EXIT_FAILURE);

// Boucle infinie de l'éditeur
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT)
{
// On met l'objet actuellement choisi (mur, caisse...) à l'endroit du clic
carte[event.button.x / TAILLE_BLOC][event.button.y / TAILLE_BLOC] = objetActuel;
clicGaucheEnCours = 1; // On active un booléen pour retenir qu'un bouton est enfoncé
}
else if (event.button.button == SDL_BUTTON_RIGHT) // Le clic droit sert à effacer
{
carte[event.button.x / TAILLE_BLOC][event.button.y /TAILLE_BLOC] = VIDE;
clicDroitEnCours = 1;
}
break;
case SDL_MOUSEBUTTONUP: // On désactive le booléen qui disait qu'un bouton était enfoncé
if (event.button.button == SDL_BUTTON_LEFT)
clicGaucheEnCours = 0;
else if (event.button.button == SDL_BUTTON_RIGHT)
clicDroitEnCours = 0;
break;
case SDL_MOUSEMOTION:
if (clicGaucheEnCours) // Si on déplace la souris et que le bouton gauche de la souris est enfoncé
{
carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = objetActuel;
}
else if (clicDroitEnCours) // Pareil pour le bouton droit de la souris
{
carte[event.motion.x / TAILLE_BLOC][event.motion.y / TAILLE_BLOC] = VIDE;
}
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
continuer = 0;
break;
case SDLK_s:
sauvegarderNiveau(carte);
break;
case SDLK_c:
chargerNiveau(carte);
break;
case SDLK_KP1:
objetActuel = MUR;
break;
case SDLK_KP2:
objetActuel = CAISSE;
break;
case SDLK_KP3:
objetActuel = OBJECTIF;
break;
case SDLK_KP4:
objetActuel = MARIO;
break;
}
break;
}

// Effacement de l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

// Placement des objets à l'écran
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
position.x = i * TAILLE_BLOC;
position.y = j * TAILLE_BLOC;

switch(carte[i][j])
{
case MUR:
SDL_BlitSurface(mur, NULL, ecran, &position);
break;
case CAISSE:
SDL_BlitSurface(caisse, NULL, ecran, &position);
break;
case OBJECTIF:
SDL_BlitSurface(objectif, NULL, ecran, &position);
break;
case MARIO:
SDL_BlitSurface(mario, NULL, ecran, &position);
break;
}
}
}

// Mise à jour de l'écran
SDL_Flip(ecran);
}

SDL_FreeSurface(mur);
SDL_FreeSurface(caisse);
SDL_FreeSurface(objectif);
SDL_FreeSurface(mario);
}




 int chargerNiveau(int niveau[][NB_BLOCS_HAUTEUR])
{
FILE* fichier = NULL;
char ligneFichier[NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1] = {0};
int i = 0, j = 0;

fichier = fopen("niveaux.lvl", "r");
if (fichier == NULL)
return 0;

fgets(ligneFichier, NB_BLOCS_LARGEUR * NB_BLOCS_HAUTEUR + 1, fichier);

for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
{
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;
}
}
}

fclose(fichier);
return 1;
}

int sauvegarderNiveau(int niveau[][NB_BLOCS_HAUTEUR])
{
FILE* fichier = NULL;
int i = 0, j = 0;

fichier = fopen("niveaux.lvl", "w");
if (fichier == NULL)
return 0;

for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
fprintf(fichier, "%d", niveau[j][i]);
}
}

fclose(fichier);
return 1;
}


Merci de votre futur aide
Afficher la suite 

2 réponses

Messages postés
13963
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 novembre 2019
319
0
Merci
Bonjour, il est demandé de ne pas faire de doublon. En général, la modération supprime le deuxième message.
Dans ton cas celui qui a une chance de trouver réponse est celui-ci, je vais donc supprimer le premier.
Commenter la réponse de Whismeril
Messages postés
3798
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
13 novembre 2019
90
0
Merci
Bonjour.

Un peu plus de détails est nécessaire. Que cherches-tu à réaliser (au final) ?

Une carte plus grande n'est pas bien compliquée, puisque tu n'as qu'à changer les constantes NB_BLOCS_LARGEUR et NB_BLOCS_HAUTEUR. Tu pourrais aussi stocker la taille dans le fichier , et la charger dynamiquement. Ça demande un peu de boulot, vu que ça ne serait plus des constantes (=> pas mal de modifications de code).
Charger une partie de la carte consiste, lors du chargement à modifier les bornes de départs et d'arrivées de tes boucles "for" imbriquées de lecture.

J'ai surtout l'impression que tu ne comprends pas vraiment ce code (je reconnais le tutorial du site du zéro, qui semble copié tel quel). N'y voit pas là une insulte, mais simplement un constat. As-tu déjà réalisé des projets plus simples ? Car de ce que je "vois", tu sembles comprendre la finalité du code, comprendre ce que fait à peu près chaques méthodes, mais tu ne pourrais pas le faire de toi même (c'est-à-dire que si je te colle une feuille blanche, tu ne pourrais pas le réécrire).

En d'autre termes, tu as une compréhension générale, mais tu souffres d'un manque d'expérience. Tu me dis si je me trompe, mais je pense que tu t'es précipité sur ce tutoriel parce qu'il était ludique, et intéressant. Ce qui fait, que tu as sauté (ou tout du moins passé trop peu de temps) sur les bases. On a tous été débutant, et je peux comprendre l'envie de réaliser quelque chose de concret rapidement, mais si tu ne passes pas (beaucoup !) plus du temps sur les bases, tu bloqueras rapidement sur des petits soucis très basiques comme celui-ci.

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu