Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Tiles et plantage total...  (Lu 3675 fois)

0 Membres et 1 Invité sur ce sujet

Tyr

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
Tiles et plantage total...
« le: Mars 11, 2013, 11:12:58 am »
Hello...
Bon, après quelques semaines de recherche infructueuse, je viens demander de l'aide à propos d'un GROS problème dans mon programme.
J'ai implémenté à un projet un système de tiles de 32 * 32 px sur un écran de 544 * 416 px (soit 17 * 13 tiles à l'écran), mais ça plante totalement. Est-dû à une surconsommation de mémoire ?

Voici les portions de code concernées : ma structure Map et la fonction destinée à l'afficher (si je n'appelle pas la fonction, ça tourne normalement et pas de plantage, donc...).

typedef struct
{
    int id, scrolling;                  // ID et scrolling de la map
    int tab[MAP_WIDTH][MAP_HEIGHT];     // Matrice de la map
    sfSprite *tile;                     // Textures des tiles
    Coord coord;                        // Vecteur coordonnées d'un tile
    sfRenderWindow **app;
} Map;

void drawMap(Map* map)
{
    // Indices pour parcourir la matrice
    register int i, j;
    sfImage *img = NULL;

    // (Ré)initialisation du vecteur coordonnées de la map
    map->coord.y = 0;
    map->coord.x = map->scrolling;

    // Boucle d'affichage des tiles
    for (i = 0; i < MAP_WIDTH; i++)
        for (j = 0; j < MAP_HEIGHT; j++)
        {
            // Détermination des coordonnées
            map->coord.x = map->scrolling + TILE_SIZE * i;
            map->coord.y = TILE_SIZE * j;

            if (map->tile != NULL)
                sfSprite_SetPosition(map->tile, map->coord.x, map->coord.y);

            // Affichage du tile correspondant à tab[i][j] si à l'écran
            if (map->coord.x < COORD_MAX && map->coord.x > COORD_MIN)
                switch (map->tab[i][j])
                {
                    // Affichage du tile d'ID 1
                    case 1:
                        img = sfImage_CreateFromFile("210.jpg");
                        sfSprite_SetImage(map->tile, img);
                        sfRenderWindow_DrawSprite(*(map->app), map->tile);
                        break;

                    // Affichage du tile d'ID 2
                    case 2:
                        img = sfImage_CreateFromFile("211.jpg");
                        sfSprite_SetImage(map->tile, img);
                        sfRenderWindow_DrawSprite(*(map->app), map->tile);
                        break;

                    // A venir...
                    case 3:
                    break;

                    case 4:
                    break;

                    case 5:
                    break;

                    default:
                    break;
                }
    }

    sfImage_Destroy(img);
}
 

Et enfin le message d'erreur dans la console :



A propos du bug, sinon : j'affiche une map uniforme (tous les tiles sont les mêmes), et au bout d'un moment, ils se mettent à changer d'apparence apparemment aléatoirement plusieurs fois par seconde. Une idée ? =(

Chaore

  • Newbie
  • *
  • Messages: 41
    • Voir le profil
    • E-mail
Re : Tiles et plantage total...
« Réponse #1 le: Mars 15, 2013, 01:06:49 pm »
Personne?   Bon je me lance, je vais faire mon possible ^^.

Vu ce qui est écrit dans ta console, je prédis un dépassement en mémoire.  Assure toi que MAP_WIDTH MAP_HEIGHT ne dépasse jamais la grandeur de ton tableau.  C'est tout ce que je peux te dire :).  Utilise ton débogueur et dit ce qu'il retourne.


Est-dû à une surconsommation de mémoire ?:  Personnellement, je crois pas que ça soit assez lourd pour ça, mais si c'est le cas, essaye d'allouer le tableau dynamiquement juste pour voir.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Tiles et plantage total...
« Réponse #2 le: Mars 15, 2013, 01:40:33 pm »
Deux choses :

1. Utilise ton debugger, c'est à ça que ça sert.

2. Tu n'as pas l'impression que charger les images des tiles à chaque fois que tu les dessines, c'est un peu overkill ? ;D Surtout que si ton appel à sfImage_Destroy est bien en dehors de la double-boucle, alors que tu alloues l'image à l'intérieur, tu risques de vite saturer ta mémoire avec ces fuites... d'où probablement le std::bad_alloc.
Laurent Gomila - SFML developer

 

anything