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 :

SDL_Rect avec image d'arrière plan


Sujet :

SDL

  1. #1
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut SDL_Rect avec image d'arrière plan
    Bonjour,

    J'ai un projet en cours dans lequel des balles sont en collisions. J'utilise des SDL_Rect pour stocker chaque balle (portion d'une SDL_Texture via un SDL_RenderCopy), et l'affichage se fait dans un SDL_renderer.
    Je débute en SDL2, alors si je me suis mal exprimé voici dans les grandes lignes en gros le code qui permet de faire le rendu (il n'y a que l'essentiel):

    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
    SDL_Window* gWindow = NULL;
            SDL_Renderer* gRenderer = NULL;
            SDL_Rect gSpriteClips[Ball::s_num_balls];
            LTexture gSpriteSheetTexture;
     
            gWindow = SDL_CreateWindow( "Colliding Balls", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    	gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
            SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
            gSpriteSheetTexture.loadFromFile( "dots.png", gRenderer)
     
            SDL_Texture* newTexture = NULL;
    	SDL_Surface* loadedSurface = IMG_Load("mon fichier image");
    	SDL_SetColorKey( loadedSurface, SDL_TRUE, SDL_MapRGB( loadedSurface->format, 0, 0xFF, 0xFF ) );
            newTexture = SDL_CreateTextureFromSurface( g_Renderer, loadedSurface );
    	SDL_FreeSurface( loadedSurface );
     
    	mTexture = newTexture;
     
    	SDL_Rect renderQuad = { x, y, mWidth, mHeight };
     
    	renderQuad.w = clip->w;
            renderQuad.h = clip->h;
     
    	SDL_RenderCopy( g_Renderer, mTexture, clip, &renderQuad );
            SDL_RenderPresent( gRenderer );
    Tout fonctionne très bien, mais au lieu d'avoir un arrière plan blanc dans le renderer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
    J'aimerai avoir un arrière plan jpeg, est-ce possible ?

    Merci

    PS :à terme je souhaite aussi avoir sur les cotés de la fenêtre des menus qui s'intègrent dans l'arrière plan (les billes en collision sont dans une zône rectangulaire centrale), avec des boutons du genre ("créer une balle", "supprimer une balle", "modifier rayon", "modifier vitesse", etc ...) Un SDL renderer convient-il à ce genre d'interface ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 578
    Points
    218 578
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Oui, c'est possible. Pour charger du JPEG, il faut utiliser SDL_Image. Ensuite, il suffit d'afficher l'image de fond juste après le clear.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Bonjour Littlewhite et merci

    J'ai essayé ce que tu me conseilles, mais le problème cest que l'image d'arrière plan n'est pas fixe, elle se dessine régulièrement lors de l'animation.
    Alors j'ai l'impression que cette SDL_surface n'est pas blited dans le backbuffer.

    Voici mon main.cpp dans les grandes lignes


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    ...
    SDL_Window* gWindow = NULL;
     
    SDL_Surface* gScreenSurface = NULL;
    SDL_Surface *Background = NULL;
     
    SDL_Renderer* gRenderer = NULL;
     
    //Scene sprites
    SDL_Rect gSpriteClips[Ball::s_num_balls];
    LTexture gSpriteSheetTexture; // classe perso
     
    bool init()
    {
    	//Initialization flag
    	bool success = true;
     
    	//Initialize SDL
    	if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    	{
    		printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() ); success = false;
    	}
    	else
    	{
    		//Set texture filtering to linear
    		SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" );
     
    		gWindow = SDL_CreateWindow( "Colliding Balls", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    		if( gWindow == NULL )
    		{
    			printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
    			success = false;
    		}
    		else
    		{
    			gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
     
    				SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
     
    				gScreenSurface = SDL_GetWindowSurface( gWindow );
     
    			}
    		}
    	}
     
    	return success;
    }
     
    bool loadMedia()
    {
     
    ...
     
     
           Background=IMG_Load("background.png");
     
    ...
     
    }
     
    void close()
    {
        ...
    }
     
    int main( int argc, char* args[] )
    {
     
    	if( !init() )
    	{
    		printf( "Failed to initialize!\n" );
    	}
    	else
    	{
    		//Load media
    		if( !loadMedia() )
    		{
    			printf( "Failed to load media!\n" );
    		}
    		else
    		{
    			//Main loop flag
    			bool quit = false;
     
    			//Event handler
    			SDL_Event e;
     
                SDL_BlitSurface(Background, NULL, gScreenSurface, NULL );
     
               ...
     
    			//While application is running
    			while( !quit )
    			{
    				//Handle events on queue
    				while( SDL_PollEvent( &e ) != 0 )
    				{
    					//User requests quit
    					if( e.type == SDL_QUIT )
    					{
    						quit = true;
    					}
    				}
     
                         //Clear screen
                    SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
                    SDL_RenderClear( gRenderer );
     
                    SDL_UpdateWindowSurface(gWindow);
     
     
                    for(int i=0; i<Ball::s_num_balls; i++){
                        balls[i]->move_(0, 0, SCREEN_WIDTH - 100, SCREEN_HEIGHT - 100);
                        balls[i]->collision(balls);
     
                        gSpriteSheetTexture.render( balls[i]->m_x, balls[i]->m_y, gRenderer, &gSpriteClips[i] );
                    }
     
    				//Update screen
    				SDL_RenderPresent( gRenderer );
    			}
    		}
    	}
     
    	//Free resources and close SDL
    	close();
     
    	return 0;
    }
    Qu'en penses-tu ?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 578
    Points
    218 578
    Billets dans le blog
    120
    Par défaut
    Vous dessinez le background avant les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Clear screen
                    SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
                    SDL_RenderClear( gRenderer );
    Cela vous parait normal ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Ca ne me parait ni normal ni anormal vu que je débute en SDL2, donc c'est normal qu'il me manque des bases.

    J'ai interverti les 2 lignes et j'ai toujours le même soucis.

    Je vais essayer avec une SDL_Texture Background ainsi qu'un SDL_RenderCopy( g_Renderer, ...) (j'utilise cela pour le rendu des balles).

    Je vous tiens au courant

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 578
    Points
    218 578
    Billets dans le blog
    120
    Par défaut
    Ce n'est pas une histoire de débuter, mais de logique.

    Je récapitule :
    Votre code, de façon algorithmique, il fait :
    Affichage d'un fond (sur l'écran)
    Nettoyage de l'écran (avec une couleur unie)
    Si vous pensez avoir résolu le problème est que cela ne marche toujours pas, pouvez vous recopier votre code à nouveau.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre éclairé Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 717
    Points : 741
    Points
    741
    Par défaut
    Bonsoir,

    Alors j'ai également utilisé une SDL_texture, et je dessine une portion de celle ci dans le renderer avec SDL_RenderCopy()

    Et ça marche nickel.

    Pour gérer la profondeur (depth) il faut tout simplement dessiner du plus lointain au plus proche.

    Merci et bonne soirée

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

Discussions similaires

  1. impression pdf avec image d'arriére plan
    Par rochdi123 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/04/2011, 18h33
  2. probleme de mettre une image en arriére-plan avec le JFrame
    Par fateh_mansori dans le forum NetBeans
    Réponses: 4
    Dernier message: 21/03/2010, 20h12
  3. Image en arrière-plan avec graphe en couleur
    Par neogamaes dans le forum MATLAB
    Réponses: 10
    Dernier message: 18/02/2010, 13h59
  4. Réponses: 1
    Dernier message: 24/01/2010, 09h22
  5. Réponses: 1
    Dernier message: 15/06/2008, 12h32

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