Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > API graphiques > SDL
SDL Forum d'entraide sur l'API SDL. Avant de poster -> FAQ SDL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/08/2012, 14h05   #1
Celes_Vongola
Invité régulier
 
Homme
Inscription : avril 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 37
Points : 8
Points : 8
Par défaut Comportement étrange SDL_PollEvent - Multithread

Bonjour, je pensais enfin pouvoir commencer mon projet pour de vrai, mais je suis tombé sur une erreur que je n'arrive même pas à comprendre pourquoi elle est là Oo

Voici le code concerné:

Events.h:
Code :
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
 
#pragma once
#include "..\Header.h"
 
class Events
{
protected:
	char key[SDLK_LAST];
	int mousex,mousey;
	int mousexrel,mouseyrel;
	char mousebuttons[8];
	char quit;
 
	Events();
	~Events(){}
 
public:
	void updateEvents();
	inline char& Key(int i){return key[i];}
	inline int MouseX(){return mousex;}
	inline int MouseY(){return mousey;}
	inline int MouseXrel(){return mousexrel;}
	inline int MouseYrel(){return mouseyrel;}
	inline int MouseButton(int i){return mousebuttons[i];}
	inline int Quit(){return quit;}
};
Events.cpp:
Code :
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
 
#include "Events.h"
 
Events::Events(void)
{
	memset(this,0,sizeof(*this));
}
 
void Events::updateEvents(){
 
	SDL_Event event;
        mousebuttons[SDL_BUTTON_WHEELUP] = 0;
        mousebuttons[SDL_BUTTON_WHEELDOWN] = 0;
	while(SDL_PollEvent(&event))
	{
		fprintf(stderr,"1");
		switch (event.type)
		{
		case SDL_KEYDOWN:
			fprintf(stderr,"2");
			key[event.key.keysym.sym]=1;
			break;
		case SDL_KEYUP:
			key[event.key.keysym.sym]=0;
			break;
		case SDL_MOUSEMOTION:
			mousex=event.motion.x;
			mousey=event.motion.y;
			mousexrel=event.motion.xrel;
			mouseyrel=event.motion.yrel;
			break;
		case SDL_MOUSEBUTTONDOWN:
			mousebuttons[event.button.button]=1;
			break;
		case SDL_MOUSEBUTTONUP:
            if (event.button.button!=SDL_BUTTON_WHEELUP && event.button.button!=SDL_BUTTON_WHEELDOWN)
  			mousebuttons[event.button.button]=0;
			break;
		case SDL_QUIT:
			quit = 1;
			break;
		default:
			break;
		}
	}
}
Game.h:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
#pragma once
#include "..\Header.h"
#include "Events.h"
 
class View :
	public Events
{
 
	#define WIDTH_TILE		   51
	#define HEIGHT_TILE		   51
    #define WINDOWS_WIDTH      1000
    #define WINDOWS_HEIGHT	   800
	#define WINDOWS_BPP		   32
 
protected:
	SDL_Surface *m_screen;
 
	View();
	~View();
};
MenuGame.h:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#include "..\Base\Modules\Observer_Observable\Observer.h"
#include "Game.h"
#include "..\Base\Modules\Thread\Thread.h"
 
class ControlMenu;
class Observable;
 
class MenuGame
	: public View, public Observer, public Thread
{
private:
	ControlMenu *m_control;
 
public:
	MenuGame(ControlMenu *control);
	void Setup();
    void Execute(void*);
	void update(Observable*);
};
MenuGame.cpp:
Code :
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
 
#include "MenuGame.h"
#include "..\Model\MenuModel.h"
#include "..\Control\ControlMenu.h"
 
MenuGame::MenuGame(ControlMenu *control) : m_control(control)
{
}
 
void MenuGame::update(Observable *model){
	MenuModel *menu = dynamic_cast<MenuModel*>(model);
 
	SDL_BlitSurface(menu->getBackground(),NULL,View::m_screen,NULL);
	SDL_BlitSurface(menu->getCursor(),NULL,View::m_screen,&menu->getPositionCursor());
}
 
void MenuGame::Setup(){
	m_control->assitSetup();
}
 
void MenuGame::Execute(void*){
 
 
	bool continuer= true;
 
	while(continuer){
 
		this->updateEvents();
 
 
		if (Key(SDL_QUIT)){
 
			continuer=false;
		}
 
	}
}
Le programme ce lance ainsi : MenuGame est un Thread, sa fonction principale est composé de Setup qui s'occupe d'envoyer les premier paramètre pour l'affichage, suivit de la fonction Run que vous avez sous les yeux, si vous voulez je peut rajouter le module Thread.

Et quand j’exécute mon programme le fichier stderr contient 1111, ce qui signifie qu'il est entré 4 fois dans la boucle de PolEvent ce qui devrai être possible uniquement si il y a un évènement en attente, hors ce résultat est le même que je martel les touches ou que je ne touche à rien oO
Quelqu'un aurait une idée de mon problème?
Merci d'avance
Celes_Vongola est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 09h04   #2
3DArchi
Rédacteur/Modérateur
 
Avatar de 3DArchi
 
Inscription : juin 2008
Messages : 7 631
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 7 631
Points : 12 159
Points : 12 159
Salut,
En général, les gens qui écrivent ça en C++ :
Code :
1
2
3
4
Events::Events(void)
{
	memset(this,0,sizeof(*this));
}
sont interdits de développement. A vie, si la classe est utilisée dans le cadre d'un héritage.

Blague à part, contrairement au C, en C++ tu as peu de garantie sur le layout mémoire d'une classe. Et cela devient carrément hasardeux dès que tu rajoutes de l'héritage. Utilises directement les listes d'initialisations
Code :
1
2
3
4
Events::Events(void)
:key(),mousex(0),mousey(0),mousexrel(0),mouseyrel(0),mousebuttons(),quit(0)
{
}

Ensuite, préfères des std::array ou std::vector aux tableau en dur.
__________________
Ressources proposées par 3DArchi.
Les fonctions virtuelles en C++.
3DArchi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/08/2012, 22h13   #3
Celes_Vongola
Invité régulier
 
Homme
Inscription : avril 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 37
Points : 8
Points : 8
ah tiens c'est la première version que j'avais faîte ^^

en faîte je ne connais pas vraiment la fonction memset, mais vu ce que tu dis je suppose quelle n'est pas compatible avec tous les objets ^^
Et bien merci je prend note et je modifie ça pour voir
Celes_Vongola est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2012, 22h34   #4
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 476
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

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

Informations forums :
Inscription : mai 2008
Messages : 10 476
Points : 40 555
Points : 40 555
Bonjour,

Dans la documentation de SDL_PollEvent() :
Citation:
As this function implicitly calls SDL_PumpEvents, you can only call this function in the thread that set the video mode.
Si je traduis bien, ça donne :
Citation:
Comme cette fonction appelle implicitement SDL_PumpEvents, vous pouvez appeler cette fonction uniquement dans le thread qui définit le mode vidéo
Le thread qui définit le mode vidéo c'est celui qui appelle SDL_SetVideoMode().

Je pense que cela explique votre problème.
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/08/2012, 23h04   #5
Celes_Vongola
Invité régulier
 
Homme
Inscription : avril 2011
Messages : 37
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 37
Points : 8
Points : 8
aie aie aie, merci beaucoup
je crois que les tutoriels ne sont plus vraiment suffisant, la documentation officielle va mettre plus que utile ^^"
Désolé de ne pas avoir pensé allé voir, pas le réflexe et cette erreur me faisait bizarre =/

fin bon merci à tous ^^
Celes_Vongola est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h12.


 
 
 
 
Partenaires

Hébergement Web