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

Moteurs 3D Discussion :

[yes::engine] Affectation de variable dans wndProc


Sujet :

Moteurs 3D

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut [yes::engine] Affectation de variable dans wndProc
    Bonsoir à tous.
    Je suis actuellement en train de suivre ces excellents tutoriaux pour apprendre à faire un moteur 3D.

    La ou j'en suis tout marche trés bien, j'ai à l'ecran ce qu'il faut qu'il s'afficher mais j'ai un probleme au niveau de la gestion des event clavier.

    En effet, on a une classe Test qui contient un membre bool isRunning qui doit dire quand le renderer est activé ou pas. quand on appuit sur echap, il doit passer de true a false mais ca ne marche pas, des que je sort de la fonction qui gere les callback, il reprend sa valeur true.

    Classe Test:
    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
     
    	class ALPHAGE_EXPORT Test : public Singleton<Test>
    	{
    		friend class Singleton<Test>;
    	public:
    		void run();
    	private:
    		Test();
    		~Test();
    		void initialize();
    		void makeWindow();
    		void render() const;
    		static LRESULT CALLBACK GlobalWindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam);
    		LRESULT CALLBACK WindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam);
     
    		struct Vertex
    		{
    			float X, Y, Z;
    			unsigned long color;
    		};
     
    		HINSTANCE handleInstance;
    		HWND handleWND;
    		bool isRunning;
    		Buffer<Vertex> vertexBuffer;
    		VertexDeclarationPointer vertexDeclaration;
    	};
    fonction avec la boucle d'execution:
    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
     
    	void Test::run()
    	{
    		initialize();
    		MSG message;
    		while (isRunning)
    		{
    			if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
    			{
    				TranslateMessage(&message);
    				DispatchMessage(&message);
    			}
    			else
    			{
    				render();
    			}
    		}
    	}
    Fonctions gerant les callback:
    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
     
    	LRESULT CALLBACK Test::GlobalWindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam)
    	{
    		return Test::getInstance().WindowProc(Hwnd, Message, WParam, LParam);
    	}
     
    	LRESULT CALLBACK Test::WindowProc(HWND Hwnd, UINT Message, WPARAM WParam, LPARAM LParam)
    	{
    		switch (Message)
    		{
    			case WM_DESTROY:
    				isRunning = false;
    				return 0;
    			case WM_KEYDOWN:
    				if (LOWORD(WParam) == VK_ESCAPE)
    				{
    					Logger::log() << "Je viens d'appuyer sur la touche Echape\n";
    					isRunning = false;
    					Logger::log() << "isRunning = " << isRunning << "\n";
    					return 0;
    				}
    		}
    		return DefWindowProc(Hwnd, Message, WParam, LParam);
    	}
    Fonction d'initialisation:
    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
     
    	void Test::makeWindow()
    	{
    		const int width = 800;
    		const int height = 600;
    		const int left = (GetDeviceCaps(GetDC(NULL), HORZRES) - width) / 2;
    		const int top = (GetDeviceCaps(GetDC(NULL), VERTRES) - height) / 2;
     
    		WNDCLASSEX WindowClass;
    		WindowClass.cbSize = sizeof(WNDCLASSEX);
    		WindowClass.style = 0;
    		WindowClass.lpfnWndProc = GlobalWindowProc;
    		WindowClass.cbClsExtra = 0;
    		WindowClass.cbWndExtra = 0;
    		WindowClass.hInstance = handleInstance;
    		WindowClass.hIcon = NULL;
    		WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    		WindowClass.hbrBackground = 0;
    		WindowClass.lpszMenuName = NULL;
    		WindowClass.lpszClassName = "AlphaGraphicEngine";
    		WindowClass.hIconSm = NULL;
    		RegisterClassEx(&WindowClass);
     
    		handleWND = CreateWindow("AlphaGraphicEngine", "Alpha Graphic Engine", WS_SYSMENU, left, top, width, height, NULL, NULL, handleInstance, NULL);
    		Assert(handleWND != NULL);
    		ShowWindow(handleWND, SW_NORMAL);
    	}
    Je ne met rien d'autre car je ne pense pas que l'erreur provienne d'un autre endroit, mais la ca fait deux jours que je seche.
    Donc si quelqu'un voit ce que j'ai fait de travers ou pourrait juste me dire ce qui peut provoquer ce genre d'erreur?

    Pour rappelle, c'est que je n'arrive pas a affecter la valeur false a la variable isRunning dans la fonction de gestion des callback. Le compilateur ne me met aucun message d'erreur, cela entrainne juste l'impossibilité d'arreter le programme avec la touche echap :s

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bon petite mise a jour bien etrange, j'ai comparé les adresses memoire et isRunning a une adresse differente que l'on soit dans la fonction run ou windowProc qui sont pourtant toute les deux des fonctions membres de Test.

    Solution provisoire: Test::getInstance().isRunning au lieu de isRunning tout seul. Mais bon a mon avis la vérité est ailleur ^^

    Au cas ou, je vais joindre a ce message le lien vers mes sources, ca compile et ca fonctionne sous visual studio 2008, malgré une petite fuite memoire dont je n'arrive pas a trouver la source, si quelqu'un a la moindre idée pour resoudre ces deux problemes, n'hesitez pas a poster ^^

    Moteur 3D - Alpha.part1.rar
    Moteur 3D - Alpha.part2.rar

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bon en continuant à suivre les tuto et en recodant certaine partie, l'erreur est partie d'elle meme, à mon avis j'ai due corriger l'erreur sans m'en rendre compte ^^

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

Discussions similaires

  1. Mauvaise affectation de variable dans une boucle
    Par Isiker dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/10/2009, 00h42
  2. [Template] Comment affecter une variable dans un include dans une boucle
    Par Daxou31 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 05/10/2008, 15h03
  3. [ANT] affectation de variables dans une boucle
    Par dino_xrc dans le forum ANT
    Réponses: 6
    Dernier message: 17/12/2007, 19h47
  4. [YES::ENGINE]Problème d'exportation dans une dll
    Par trecks dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 30/11/2007, 08h26
  5. [PL/SQL]probleme affectation de variable dans une requete
    Par <% Bastien %> dans le forum SQL
    Réponses: 9
    Dernier message: 17/04/2007, 18h40

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