DIROP
Messages postés4Date d'inscriptionmercredi 29 octobre 2014StatutMembreDernière intervention29 novembre 2014
-
21 nov. 2014 à 10:50
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 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 ...
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; } } }
Whismeril
Messages postés18988Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention23 mars 2024654 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.
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.