Editeur de map

DIROP Messages postés 4 Date d'inscription mercredi 29 octobre 2014 Statut Membre Dernière intervention 29 novembre 2014 - 21 nov. 2014 à 10:50
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 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

2 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
21 nov. 2014 à 12:16
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.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 23/11/2014 à 22:14
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
0
Rejoignez-nous