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 :

Programmation en C++ et SDL


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut Programmation en C++ et SDL
    Bonjour,
    je suis actuellement sur un projet en SDL.J'ai un probleme, j'essaye de faire bouger un carré sur l'ecran.Mais le probleme c que le carré precedant est toujours present.Comment dois-je faire pour le supprimer ?
    Voici mon programme:

    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
    include "stdafx.h"
    #include "sdl.h"
    #include "stdio.h"
    #include <ctime>
     
    SDL_Surface *ecran;
     
     
    void move(int x,int y,SDL_Rect *d ,SDL_Surface * image,char *path="P.bmp")
    {
     
     
    	d->x=x;
    	d->y=y;
    	d->w=10;
    	d->h=10;
     
    	SDL_BlitSurface(image, NULL, ecran, d);
    	SDL_BlitSurface( image, NULL, ecran, NULL );
    	SDL_UpdateRects(ecran, 1, d);
     
     
     
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	SDL_Event even;
    	SDL_Rect d;
    	SDL_Init( SDL_INIT_EVERYTHING );
    	ecran = SDL_SetVideoMode( 150, 150, 32, SDL_SWSURFACE );
     
    	srand( time(NULL) );
    	SDL_Surface *image = SDL_LoadBMP( "Fond.bmp" );
     
    	SDL_BlitSurface( image, NULL, ecran, NULL );
    	SDL_UpdateRect( ecran, 0, 0, 0, 0 );
     
    	d.x=0;
    	d.y=0;
    	d.w=10;
    	d.h=10;
    	image = SDL_LoadBMP( "P.bmp" );
    	SDL_BlitSurface(image, NULL, ecran, &d);
    	SDL_BlitSurface( image, NULL, ecran, NULL );
    	SDL_UpdateRects(ecran, 1, &d);
    	int i=0;
    	while(1)
    	{
     
    		SDL_WaitEvent(&even);
    		switch(even.type)
    		{
    			case SDL_KEYDOWN: 
    					move(i,i,&d,image,"P.bmp");
    				break;
     
    		}
    		i++;
    	}
     
    	return 0;
    }
    Si quelqu'un pouvait m'aider.
    D'avance merci.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 151
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Très simple , il faut réinitialisé l'écran.
    Je veux dire, pour être plus précis, qu'à chaque fois que vous voulez afficher un truc, vous avez souvent l'envie de repartir d'un ecran tout noir, pour effacer ce qu'il y avait avant.
    Dans votre code ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while(1)
    	{
    		SDL_FillRect(Fenetre,NULL,SDL_MapRGB(Fenetre->format,0,0,0));
    		SDL_WaitEvent(&even);
    		switch(even.type)
    		{
    			case SDL_KEYDOWN: 
    					move(i,i,&d,image,"P.bmp");
    				break;
    		
    		}
    		i++;
    	}
    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 émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    La réponse de LittleWhite n'est pas totalement correcte :p
    Si tu utilises ça tu ne vas voir qu'un écran blanc et rien d'autre (bah oui tu fillrect avant ton attente d'event )

    Le mieux serait de le mettre dans ta fonction move :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void move(int x,int y,SDL_Rect *d ,SDL_Surface * image,char *path="P.bmp")
    {
    	d->x=x;
    	d->y=y;
    	d->w=10;
    	d->h=10;
     
    	SDL_FillRect(Fenetre, NULL, 0); 
    	SDL_BlitSurface(image, NULL, ecran, d);
    	SDL_BlitSurface( image, NULL, ecran, NULL );
    	SDL_UpdateRects(ecran, 1, d); 
    }
    Tu peux éviter la variable globale 'ecran' en utilisant SDL_GetVideoSurface(). Je te laisse aller voir dans la doc pour l'utilisation

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Quoi que non en fait je dis une bêtise
    Tu ne flip pas ton écran donc c'est bon

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Il s'agit ici d'être organiser. Effectivement, les solutions de LitteWhite et Pouet_forever marche sans aucun probleme, mais il faut être logique.

    Il faut regrouper tout ce qui concerne l'affichage "quelque part".
    Je préfére, pour ce point la, la solution de pouet_forever a celle de LittleWhite.

  6. #6
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Le mieux serait de le mettre dans ta fonction move :
    Tu peux éviter la variable globale 'ecran' en utilisant SDL_GetVideoSurface(). Je te laisse aller voir dans la doc pour l'utilisation
    Un jeu ne se programme pas comme cela...
    en général dans un proje-t de jeu il y a une fonction Render() qui est appelée à intervalle régulier ou bien constamment dans la boucle principale du programme et qui rafraichit l'écran en permanence.

    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
     
    #include "sdl.h"
    #include "stdio.h"
    #include <ctime>
     
    SDL_Surface *ecran;
     
     
    void move(int x,int y,SDL_Rect *d ,SDL_Surface * image,char *path="P.bmp")
    {
    	d->x=x;
    	d->y=y;
    	d->w=10;
    	d->h=10;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	SDL_Event even;
    	SDL_Rect d;
    	SDL_Init( SDL_INIT_EVERYTHING );
    	ecran = SDL_SetVideoMode( 150, 150, 32, SDL_SWSURFACE );
     
    	srand( time(NULL) );
    	SDL_Surface *image = SDL_LoadBMP( "Fond.bmp" );
     
    	SDL_BlitSurface( image, NULL, ecran, NULL );
    	SDL_UpdateRect( ecran, 0, 0, 0, 0 );
     
    	d.x=0;
    	d.y=0;
    	d.w=10;
    	d.h=10;
    	image = SDL_LoadBMP( "P.bmp" );
    	int i=0;
    	while(1)
    	{
     
    		SDL_WaitEvent(&even);
    		//////////////////////////////////////////////////////////////
    		//////////// Le rendu est ici sinon faire une fonction de rendu
    		SDL_BlitSurface(image, NULL, ecran, &d);
    		SDL_BlitSurface( image, NULL, ecran, NULL );
    		SDL_UpdateRects(ecran, 1, &d);
    		switch(even.type)
    		{
    			case SDL_KEYDOWN: 
    					move(i,i,&d,image,"P.bmp");
    				break;
     
    		}
    		i++;
    	}
     
    	return 0;
    }
    Bird12538 je te conseille de consulter les tutos de Loka.
    Et d'implémenter:
    1-une classe pour les cartes
    2-un système de gestion du temps

Discussions similaires

  1. avec quoi on programme une bibliotheque comme SDL ?
    Par nyergk dans le forum Windows
    Réponses: 2
    Dernier message: 11/01/2013, 18h53
  2. programmer avec la librairie SDL
    Par verazano dans le forum Développement OS X
    Réponses: 6
    Dernier message: 29/10/2007, 23h30
  3. [Programme] Jeu 2D sous SDL
    Par stilobique dans le forum Projets
    Réponses: 20
    Dernier message: 20/05/2007, 00h46
  4. Problème execution programme SDL
    Par youp_db dans le forum SDL
    Réponses: 2
    Dernier message: 11/02/2006, 18h06
  5. Programmation graphique ... SDL ??
    Par Franck.H dans le forum C
    Réponses: 9
    Dernier message: 29/04/2004, 20h51

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