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 :

Problème d'événements sortis de nul part


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut Problème d'événements sortis de nul part
    Bonjour,
    Voilà, j'ai un projet relativement gros (une quinzaine de classes) et je sais pas pourquoi, au bout d'un temps qui change à chaque fois que je lance le programme, mon programme se ferme sans message d'erreur. J'ai regardé d'ou ça venait, il quitte comme si j'avais fermé la fenetre normalement avec le type SDL_QUIT.
    Il m'a fait un autre truc bizarre, je reçois aléatoirement aussi des événement SDL_KEYDOWN non repertoriés dans SDLKey.
    Je sais pas du tout d'ou ça vient et je touche pas à la pile d'événements autre part.
    Donc si quelqu'un a une idée elle serait la bienvenue
    Si ça peut aider voilà le fichier moteur.cpp qui gère tout les autres et notamment la pile d'événement :
    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
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
     
    #include "moteur.h"
     
    using namespace std;
     
    Moteur::Moteur() {
    	m_screen = NULL;
    	m_menu = NULL;
    	m_game = NULL;
    	m_frame = NULL;
    	m_done = false;
    	m_delay = DELAYMIN;
    	m_actualTime = m_previousTime = 0;
    }
     
    Moteur::~Moteur() {
    	map< string, SDL_Surface* >::iterator image;
    	for (image = APPImages.begin(); image != APPImages.end(); image++) {
    		if (image->second) SDL_FreeSurface(image->second);
    	}
    	delete m_menu;
    	delete m_game;
    	SDL_FreeSurface(m_screen);
    	TTF_Quit();
    	SDL_Quit();
    }
     
    bool Moteur::init() {	
    	//Initialisation de la librairie SDL
    	if(SDL_Init(SDL_INIT_VIDEO) != 0) {
    		cerr << "Erreur lors de l'initialisation de la librairie SDL : " << SDL_GetError() << endl;
    		return false;
    	}
     
    	// Initialisation de la librairie SDL_ttf
    	if(TTF_Init() == -1) {
    		cerr << "Erreur lors de l'initialisation de la librairie SDL_ttf : " << TTF_GetError() << endl;
    		return false;
    	}
     
    	// Ouverture de la fenetre
    	m_screen = SDL_SetVideoMode(WIDTH, HEIGHT, FORMAT, SDL_DOUBLEBUF | SDL_HWSURFACE);
    	if(m_screen==NULL) {
    		cerr << "Probleme pour la fenêtre: " << SDL_GetError() << endl;
    		return false;
    	}
     
    	// Titre de la fenêtre
    	SDL_WM_SetCaption("Starved Version 1.0", NULL);
     
    	// APPImage : variable globale déclarée dans global.cpp
    	// Chargement des images
    	APPImages["snakebody"] = IMG_Load("../../data/images/game/redbody.png");
    	APPImages["wall"] = IMG_Load("../../data/images/game/wall.png");
    	APPImages["apple"] = IMG_Load("../../data/images/game/apple.png");
    	APPImages["backgroundmenu"] = IMG_Load("../../data/images/menu/background2.png");
     
    	// Verification du chargement des images
    	map< string, SDL_Surface* >::iterator image;
    	for (image = APPImages.begin(); image != APPImages.end(); image++) {
    		if (!image->second) {
    			cout << "Probleme de chargement des images du jeu." << endl;
    			return false;
    		}
    	}
     
    	// Initialisation des cadres
    	m_menu = new Menu(0, 0, m_screen->w, m_screen->h, 255, 255, 255);
    	m_menu->init();
    	m_game = new Game(0, 0, m_screen->w, m_screen->h, 255, 255, 255);
    	m_game->init();
     
    	// On se place dans le menu
    	m_frame = m_menu;
     
    	return true;
    }
     
    bool Moteur::testEvents() {
    	SDL_Event event;
    	// Si le cadre courant est le menu
    	if (m_frame == m_menu) SDL_WaitEvent(&event);
    	else SDL_PollEvent(&event);
    	switch(event.type) {
    		case SDL_QUIT :
    			// On quitte
    			quit();
    			return true;
    		case SDL_KEYDOWN :
    			// Test du clavier
    			if (event.key.keysym.sym == SDLK_ESCAPE) m_frame = m_menu;
    			if (m_frame == m_game) m_game->keydown(event.key.keysym.sym);
    			return true;
    		case SDL_MOUSEBUTTONDOWN :
    			// Test des boutons
    			return testButton(event.button.x, event.button.y);
    		case SDL_MOUSEMOTION :
    			// Boutons survolés
    			if (m_frame->mousemotion(event.motion.x, event.motion.y)) return true;
    			return false;
    		default :
    			return true;
    	}
    	return true;
    }
     
    bool Moteur::testButton(int cx, int cy) {
    	string button;
    	// Quel bouton a été cliqué
    	m_frame->mousedown(cx, cy, button);
     
    	// On quitte
    	if (button == "Quitter") {
    		quit();
    		return true;
    	}
     
    	// On charge une nouvelle partie
    	if (button == "Nouveau") {
    		cout << "ok" << endl;
    		m_game->loadLevel();
    		m_frame = m_game;
    		return true;
    	}
    	return false;
    }
     
    void Moteur::display() {
    	// Affichage du menu si on se trouve dedans
    	if (m_frame == m_menu) m_menu->display(m_screen);
     
    	// Affichage du jeu si on se trouve dedans
    	else if (m_frame == m_game) m_game->display(m_screen);
    }
     
    void Moteur::update() {
    	// Mise à jour du jeu
    	if (m_frame == m_game) m_game->update();
    }
     
    void Moteur::mainloop() {
    	m_done = false;
    	bool change;
     
    	// Boucle principale
    	while(!m_done) {
    		// Traitement des evenements
    		// change : si une action à changé l'apparence du cadre courrant
    		change = testEvents();
     
    		// Gestion du temps
    		m_actualTime = SDL_GetTicks();
    		if (m_actualTime - m_previousTime > m_delay) m_previousTime = m_actualTime;
    		else SDL_Delay(m_delay - (m_actualTime - m_previousTime));
     
    		// Mise à jour du jeu
    		update();
     
    		// Affichage
    		if (change) {
    			display();
    			SDL_Flip(m_screen);
    		}
    	}
    }
     
    void Moteur::quit() {
    	// Fin de la boucle principale
    	m_done = true;
    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut
    Ouais bon, j'ai trouvé
    En fait ça venait de SDL_PollEvent qui trouvait aucun événement dans la pile.
    Comme la fonction renvoie 0 dans ce genre de cas, j'ai mis un test pour éviter qu'il remplisse mon événement avec n'importe quoi :
    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
    bool Moteur::testEvents() {
    	SDL_Event event;
    	// Si le cadre courant est le mainmenu
    	if (m_frame == m_mainmenu) SDL_WaitEvent(&event);
    	else if (m_frame == m_gameboard && SDL_PollEvent(&event) == 0) return true;
    	switch(event.type) {
    		case SDL_QUIT :
    			// On quitte
    			quit();
    			return true;
    		case SDL_KEYDOWN :
    			// Test du clavier
    			cout << SDL_GetKeyName(event.key.keysym.sym) << endl;
    			if (event.key.keysym.sym == SDLK_ESCAPE) m_frame = m_mainmenu;
    			else if (m_frame == m_gameboard) m_gameboard->keydown(event.key.keysym.sym);
    			return true;
    		case SDL_MOUSEBUTTONDOWN :
    			// Test des boutons
    			return mouseButtonDown(event.button.x, event.button.y);
    		case SDL_MOUSEMOTION :
    			// Boutons survolés
    			return mouseMotion(event.motion.x, event.motion.y);
    		default :
    			return true;
    	}
    	return true;
    }

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

Discussions similaires

  1. segfault sorti de nul part
    Par nocta dans le forum Débuter
    Réponses: 9
    Dernier message: 13/10/2010, 09h43
  2. Problème sur évènement
    Par Azharis dans le forum Access
    Réponses: 2
    Dernier message: 12/01/2006, 16h36
  3. Problème avec évènement ..
    Par questionneuse dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2005, 18h47
  4. Réponses: 11
    Dernier message: 13/10/2004, 00h58
  5. Problèmes d'évènements sur ComboBox
    Par bakaneko dans le forum MFC
    Réponses: 3
    Dernier message: 23/02/2004, 08h46

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