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 :

Faire bouger une image.


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Faire bouger une image.
    Hello world,
    je vous sollicite pour un problème que je rencontre en utilisant la SDL2 pour bouger une image. (avec les flèches.)

    L'image doit pouvoir bouger dans 4 directions, haut bas gauche droite.

    En vérité, l'image va toujours vers le bas et produit une sorte de trainée lorsqu'elle bouge. J'admets ne pas comprendre pourquoi. (j'ai du mal à passé de la 1.2 à la version 2 de la SDL...)

    Voici le main.

    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
    #include <iostream>
    #include <SDL2/SDL.h>
    #include <SDL2/SDL_image.h>
    #include "header.hpp"
     
    using namespace std;
     
    int main(){
     
    	Player_control player;
     
    	SDL_Window *window = NULL;
    	SDL_Renderer *renderer = NULL;
    	SDL_Surface *screenSurface = NULL, *helloWorld = NULL;
     
    	if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ) < 0 ){
     
            cout << "SDL could not be initialize ! SDL_Error: " << SDL_GetError() << endl;
            return EXIT_FAILURE;
     
    	}
     
     
        SDL_CreateWindowAndRenderer( 640, 480, SDL_WINDOW_RESIZABLE, &window, &renderer );
     
    	if ( window /* && renderer */ == NULL ){
            cout << "A window could not be created ! SDL_Error: " << SDL_GetError() << endl;
            return EXIT_FAILURE;
        }
     
        helloWorld = SDL_LoadBMP( "random picture.bmp" );
     
        if ( helloWorld == NULL ){
            cout << "The picture cannot be used ! SDL_Error: " << SDL_GetError() << endl;
            return EXIT_FAILURE;
        }
     
        screenSurface = SDL_GetWindowSurface( window );
        //SDL_BlitSurface( helloWorld, NULL, screenSurface, NULL );
     
     
            /*	if ( SDL_UpdateWindowSurface( window ) < 0 ){
                	cout << "The window could not be update ! SDL_Error: " << SDL_GetError() << endl;
                	return EXIT_FAILURE;
            	} */
     
            	player.SDL_GetControl( window, screenSurface, helloWorld );
     
     
        SDL_Close(window, screenSurface);
     
        return EXIT_SUCCESS;
     
    }
     
    void SDL_Close( SDL_Window *ptrWindow, SDL_Surface *ptrSurface ){
     
        //Dealocate the surface
        SDL_FreeSurface( ptrSurface );
     
        //Destroy the window
        SDL_DestroyWindow( ptrWindow );
     
        //Quit SDL subsystems
        SDL_Quit();
     
    }
    Voici le fichier input (gère les contrôles)
    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
    #include <SDL2/SDL.h>
    #include <iostream>
    #include "header.hpp"
     
     
    void Player_control::SDL_GetControl( SDL_Window *ptrWindow, SDL_Surface *ptrWindowSurface, SDL_Surface *ptrSurface ){
     
    	bool foo = true;
    	SDL_Event event;
     
    	SDL_FillRect( ptrWindowSurface ,NULL,SDL_MapRGB(ptrWindowSurface->format,255,255,255));
     
    	SDL_Rect position;
    	position.x = 300;
    	position.y = 300;
     
    	SDL_BlitSurface( ptrSurface, NULL, ptrWindowSurface,&position);
    	//SDL_EnableKeyRepeat(10,10);
    	SDL_UpdateWindowSurface( ptrWindow );
     
    	while (foo){
            	SDL_WaitEvent(&event);
            	switch(event.type)
            	{
                	case SDL_QUIT:
                	foo = false;
                	break;
                	case SDL_KEYDOWN:
                    	switch (event.key.keysym.sym) {
                        	case SDLK_ESCAPE:
                        	foo = false;
                        	break;
                    	}
                    	case SDLK_UP:
                    	position.y++;
                    	break;
                    	case SDLK_DOWN:
                    	position.y--;
                    	break;
                    	case SDLK_RIGHT:
                    	position.x++;
                    	break;
                    	case SDLK_LEFT:
                    	position.x--;
                    	break;
            	}
     
            SDL_BlitSurface( ptrSurface, NULL, ptrWindowSurface, &position );
    		SDL_UpdateWindowSurface( ptrWindow );
     
        	}
    }
    et Voici le header.
    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
    #ifndef header_hpp
    #define header_hpp
     
    void SDL_Close( SDL_Window *ptrWindow, SDL_Surface *ptrSurface );
     
     
    class	Player_control {
     
    	public:
    		void SDL_GetControl( SDL_Window *ptrWindow, SDL_Surface *ptrWindowSurface, SDL_Surface *ptrSurface );
     
    	private:
     
    };
     
    #endif
    Voici ce que j'obtiens:
    Nom : Capture d’écran_2015-12-30_20-28-17.png
Affichages : 1788
Taille : 37,0 Ko

    Bref, je suis ouvert à la critique.
    Merci de bien vouloir éclairer ma lanterne, cordialement.

  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 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Le problème n'est pas du tout le passage de la SDL 1.2 à la SDL 2, je pense.
    Je vous conseille la lecture de cet article : la boucle de jeu.
    Pour éviter la trainée, il faut donc effacer l'écran à chaque tour de boucle.

    Pour le reste, je ne sais pas pourquoi cela irait que vers le bas. Mais c'est peut être lié au fait que vous n'effacez pas l'écran donc vous ne savez pas où va votre image.

    foo est un très mauvais nom de variable
    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 habitué
    Homme Profil pro
    rien
    Inscrit en
    Décembre 2015
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Décembre 2015
    Messages : 282
    Points : 144
    Points
    144
    Par défaut
    Salut c'est vrai le foo c'est très mauvais comme idée.

    et ton code est mal indenté et pas trop clair à partir de là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                            case SDLK_UP:
                    	position.y++;
                    	break;
                    	case SDLK_DOWN:
                    	position.y--;
                    	break;
                    	case SDLK_RIGHT:
                    	position.x++;
                    	break;
                    	case SDLK_LEFT:
                    	position.x--;
                    	break;
    Mais peut-être que l'affichage dans la balise [code] de développez.com qui fait ça...
    Il faudrait décaler vers la gauche.
    Quand on lit mieux le code on peut mieux chercher une erreur.

    Moi je vois pas de trainée, mais LittleWhite doit sûrement parler du déplacement car l'écran semble bien effacé lors du mouvement.

    L'image devrait aller dans les 4 sens selon la touche et non comme ce qu'elle fait actuellement d'aller toujours en diagonale bas/droite (donc right++ et down++).

    A mon avis l'erreur vient de ton imbrication de switch, j'en vois pas l'intéret déjà en plus, normalement tu devrais avoir qu'un switch pour gérer les touches.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses

    Je vais revoir l'indentation ainsi que la boucle du jeu.

    En fait, il me faudrait une fonction qui fait l'acquisition des touches, une autre qui gère l'affichage et une autre qui raffraichis la fenêtre, le tout dans une boucle qui vérifie que l'utilisateur n'a pas appuyé sur une touche genre echap.

    Selon le tuto -> http://alexandre-laurent.developpez....boucle-de-jeu/

Discussions similaires

  1. Faire bouger une image dans un cadre
    Par georges34 dans le forum Flash
    Réponses: 0
    Dernier message: 07/05/2011, 15h27
  2. Problème pour charger correctement une image.
    Par dodidam dans le forum Java ME
    Réponses: 0
    Dernier message: 25/11/2008, 22h46
  3. Problème pour faire bouger deux objets simultanement
    Par LinuxUser dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 22/04/2007, 23h19
  4. [MouseEntered] pb de localisation souris pour faire apparaitre une image
    Par sebpsi dans le forum Interfaces Graphiques en Java
    Réponses: 12
    Dernier message: 23/06/2006, 11h03
  5. Réponses: 2
    Dernier message: 05/06/2006, 13h39

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