Forum de la communauté SFML

Bindings - autres langages => C => Discussion démarrée par: Tyr le Mars 11, 2013, 11:12:58 am

Titre: Tiles et plantage total...
Posté par: Tyr 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 :

(http://i71.servimg.com/u/f71/14/63/41/37/sans_t15.png)

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 ? =(
Titre: Re : Tiles et plantage total...
Posté par: Chaore 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.
Titre: Re : Tiles et plantage total...
Posté par: Laurent 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.