IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Utiliser un char[] pour mettre un nom de fichier image


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Février 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Février 2013
    Messages : 37
    Points : 32
    Points
    32
    Par défaut Utiliser un char[] pour mettre un nom de fichier image
    Bonjour

    Désireux de faire un jeu, j'ai décidé de suivre le tutoriel sur SDL présent sur le site. Sauf que je butte sur un point dès la première partie du tutoriel : le nom du fichier image (pour la charger) est mis dans une variable string. Sauf que c'est du C++ et je préfère utiliser du C. J'ai essayé de remplacer par un tableau de caractères mais malheureusement ça n'a pas marché.
    J'aimerais pouvoir charger l'image à l'aide de la variable passé en paramètre. Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    Fichier main.c
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include "SDL/SDL.h"
    #include "image.h"
     
    int main( int argc, char *argv[ ] )
    {
        const int SCREEN_WIDTH = 800; 
        const int SCREEN_HEIGHT = 600; 
        const int SCREEN_BPP = 32;   
    	SDL_Surface *screen = NULL; //Surface qui concerne l'écran
        SDL_Surface *background = NULL;//L'arrière plan
    	char fnBackground[25] = "sky.png";// Chaine pour charger l'image
     
        if( SDL_Init( SDL_INIT_VIDEO ) == -1 )//Chargement du mode vidéo. Un test vérifie si elle s'initialise
        {
            printf( "Can't init SDL:  %s\n", SDL_GetError( ) );
            return EXIT_FAILURE;// Si non, fermeture du programme avec un code d'erreur
        }
     
        atexit( SDL_Quit ); // La fonction atexit permet d'appliquer le code entre paranthèses à la fin du programme, ici SDL_Quit qui permet de fermer toutes les fonctions SDL
        screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_HWSURFACE );//Charge le mode vidéo dans l'écran
     
        if( screen == NULL )// Si cela a échoué (le pointeur retourne NULL)
        {
            printf( "Can't set video mode: %s\n", SDL_GetError( ) );
            return EXIT_FAILURE;//Fermeture du programme avec un code d'erreur
        }   
     
        SDL_WM_SetCaption( "Test Jeu", NULL );
     
    	background = load_image(fnBackground);
    	apply_surface( 0, 0, background, screen );
     
        SDL_Delay( 3000 );
     
        return EXIT_SUCCESS;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    Fichier image.c
     
    #include "SDL/SDL.h"
    #include "SDL/SDL_image.h"
     
    SDL_Surface *load_image( char filename[25] ) 
    { 
    	//Surface tampon qui nous servira pour charger l'image 
    	SDL_Surface* loadedImage = NULL; 
     
    	//L'image optimisée qu'on va utiliser 
    	SDL_Surface* optimizedImage = NULL;
     
    	//Chargement de l'image
    	loadedImage = IMG_Load( filename );
     
    	//Si le chargement se passe bien
    	if( loadedImage != NULL ) { 
    		//Création de l'image optimisée 
    		optimizedImage = SDL_DisplayFormat( loadedImage ); 
     
    		//Libération de l'ancienne image
    		SDL_FreeSurface( loadedImage ); 
    	}
     
    	//On retourne l'image optimisée 
    	return optimizedImage; 
    }
     
    void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination ) 
    { 
    	SDL_Rect offset; 
     
    	offset.x = x; 
    	offset.y = y;
     
    	//On blitte la surface 
    	SDL_BlitSurface( source, NULL, destination, &offset ); 
    }
    Je précise que je suis sous Visual Studio.

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Sauf que c'est du C++ et je préfère utiliser du C
    Fais le en C y a rien qui te l'empêche.

    J'ai remarqué que y'a pas la fonction qui affiche a ecran SDL_Flip(screen).
    Je rappelle mais SDL_BlitSurface ne fait que dessiner sur des Surfaces.
    Sinon je vois pas le souci , peut être que tu as pas mis les dll (genre une libpng.dll ou SDL_image.dll a coter de ton exe).

    J'ai jamais utilisé SDL_DisplayFormat je pense qu'on peut s'en passer =P

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonjour,

    L'argument attendu par IMG_Load() est un char* mais tu passes un tableau de char !

  4. #4
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Passer un char[25] ou un char * revient au même.

    Comme le dit Kannagi, je pense qu'il manque un SDL_Flip(...) pour que l'image de fond soit visible à l'écran.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Février 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Février 2013
    Messages : 37
    Points : 32
    Points
    32
    Par défaut
    Non, j'ai bien mis les dll à leur place. En revanche, j'ai une étrange erreur du compilateur du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fatal error LNK1000 : Internal error during IncrBuildImage
    .
    En revanche, je me demande : où dois-je mettre l'image que je souhaite utiliser ?
    Pour l'histoire de Char* et char [], ce n'est pas la même chose ?

  6. #6
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Pour l'histoire de Char* et char [], ce n'est pas la même chose ?
    Bien sur que si, voir précédemment.

    L'image que tu veux utiliser doit se trouver dans le même répertoire que l'exécutable, puisque tu ne spécifies pas de chemin.

    Pour l'erreur, ce n'est pas une erreur du compilateur, c'est le linker qui n'est pas d'accord.

    Edit: pour la place de l'image: si tu spécifies un chemin, il est calculé par rapport au répertoire de l'exécutable
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Février 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Février 2013
    Messages : 37
    Points : 32
    Points
    32
    Par défaut
    Bon j'ai ajouté le SDL_flip et mis l'image au bon endroit, ça n'a pas l'air de marcher.

    Citation Envoyé par edgarjacobs Voir le message
    Pour l'erreur, ce n'est pas une erreur du compilateur, c'est le linker qui n'est pas d'accord.
    Et à quoi cela correspond ?

    Edit : Je pense avoir trouvé. Après de l'instruction loadedImage = IMG_Load(filename);, loadedImage est NULL mais j'ignore pourquoi.
    Edit 2 : Suis-je bête ! Je n'ai pas mis l'image dans le bon répertoire. Ça marche maintenant. Merci de votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/10/2011, 08h34
  2. Utiliser le resultat d'une command pour generer un nom de fichier
    Par jfourment dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 20/08/2007, 17h53
  3. Utiliser une variable pour mettre des étiquettes visible
    Par patate5555 dans le forum VBA Access
    Réponses: 8
    Dernier message: 21/06/2007, 13h51
  4. Utiliser une variable pour stocker les noms d'objets.
    Par en_gel_ho dans le forum Access
    Réponses: 4
    Dernier message: 03/01/2007, 16h44
  5. Réponses: 7
    Dernier message: 07/09/2004, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo