Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





opengl con NEHE y visual studio 6

Iniciado por luisdomarco, 23 de Mayo de 2009, 02:11:21 PM

« anterior - próximo »

luisdomarco


Hola a todos, soy nuevo en el foro, buscando informacion sobre programacion grafica he llegado hasta aqui, a ver si podeis ayudarme.

Estoy empezando con opengl con los tutoriales de NEHE y aunque mis conocimeintos de C son básicos no tengo problemas para entender las lecciones de nehe.

El problema es que el codigo empieza a ser damasiado largo para un solo fichero.

Empiezo a buscar informacion sobre clases y una vez que creo tenerlo todo mas o menos claro empiezo a crear una clase con las funciones que gestionan la ventana de opengl.

He creado el fichero "nehewiondow.h" que queda asi.

#ifndef _NEHEWINDOW_H_
#define _NEHEWINDOW_H_

class nehewindow
{
private:
   HDC         hDC;      // Private GDI Device Context
   HGLRC      hRC;      // Permanent Rendering Context
   HWND      hWnd;      // Holds Our Window Handle
   HINSTANCE   hInstance;      // Holds The Instance Of The Application

   bool   keys[256];         // Array Used For The Keyboard Routine
   bool   active;      // Window Active Flag Set To TRUE By Default
   bool   fullscreen;   // Fullscreen Flag Set To Fullscreen Mode By Default

   GLfloat LightAmbient[4];
   GLfloat LightDiffuse[4];
   GLfloat LightPosition[4];

public:
   //contructor
   nehewiondow(void);
   // SetThings
   void sethDC(HDC a);
   void sethRC(HGLRC a);
   void sethWnd(HWND a);
   void sethInstance(HINSTANCE a);

   void setkeys(unsigned int i, bool a);
   void setactive(bool a);
   void setfullscreen(bool a);

   // GetThings
   HDC gethDC(void);
   HGLRC gethRC(void);
   HWND gethWnd(void);
   HINSTANCE gethInstance(void);

   bool getkeys(unsigned int a);
   bool getactive(void);
   bool getfullscreen(void);
   //
   LRESULT   CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);   // Declaration For WndProc
   GLvoid ReSizeGLScene(GLsizei width, GLsizei height);
   int InitGL(GLvoid);
   GLvoid KillGLWindow(GLvoid)   ;
   BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag);

};

#endif

y despues he ido copiando las funciones al fichero "nehewindow.cpp".
Todo iba bien hasta que llegue a (copio solo a cabecera y el lugar del error para no hacer demasiado largo esto)

BOOL nehewindow::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
      .
      .
      .
   wc.lpfnWndProc      = (WNDPROC) WndProc;               // WndProc Handles Messages
         .
      .
      .
   
}
aqui me da el error

error C2440: 'type cast' : cannot convert from '' to 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)'
        None of the functions with this name in scope match the target type

Esa misma linea en la funcion que esta en el fichero del main no da errores  :-X.

He partido de la leccion 8 de nehe ( http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08 ) ahí esta todo el código, he copiado las funciones tal cual, si es necesario el resto del fichero "nehewindow.cpp" me lo decis aunque es un poco largo y como he dicho las funciones estan copiadas tal cual de la lecion 8 de nehe por lo que se supone que estan bien.

Gracias de antemano.




Pogacha

#1
Tu problema es que la funcion WndProc es una funcion miembro y tu tienes que pasarle una funcion pura (estatica).
Windows nos permite attachar informacion del usuario a la ventana:
SetWindowLong(hWnd,GWL_USERDATA,(LONG)this);
(pon eso luego de creada la ventana en CreateGLWindow)
y luego agrega esta funcion a la clase:

En el h:
static LRESULT CALLBACK StdMsgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);


En el cpp:
LRESULT CALLBACK nehewindow::StdMsgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
nehewindow *w = (nehewindow*)GetWindowLong(hwnd,GWL_USERDATA);
if(w) return w->WndProc( hwnd, Message, wParam, lParam);
return DefWindowProc(hwnd,Message,wParam,lParam);
}


Lo que estas haciendo ahi es una funcion by-pass, o bien un adaptador de una interface a lo que vos queres.

Suerte

PD: y obviamente  usa:   wc.lpfnWndProc      = (WNDPROC) StdMsgProc;           

luisdomarco

 Yuuuuupi  :) soy feliz.

Muchas gracias, llevo varios dias intentando de diferentes formas apartar las funciones de gestion de ventana a un fichero independiente y entre que no tengo mucha idea de c++ y que no entiendo muy bien como funciona el visual studio me estaba empezando a desesperar con los errores.

La verdad no entiendo  bien lo que me has dicho ni las funciones de gestion de ventana pero funciona, y lo mas importante he conseguido crear mi primera clase, aunque sea copiada me vale pare entender como funcionan, y ahora puedo centrarme en opengl y en ordenar mejor mis proyectos que es lo que quería.

Un saludo y gracias de nuevo.




Buffon

Te aconsejo que te pases a usar los tutoriales de nehe pero con el código que usa

GLUT + OPENGL

así y de primeras, tienes un código portable entre windows y linux.

o liarte con SDL ?=)

luisdomarco

Cita de: Buffon en 25 de Mayo de 2009, 12:44:52 PM
Te aconsejo que te pases a usar los tutoriales de nehe pero con el código que usa

GLUT + OPENGL

así y de primeras, tienes un código portable entre windows y linux.

o liarte con SDL ?=)

Aparte de la portabilidad ¿Cual es la diferencia? Es que tampoco tengo intención de programar bajo linux.

tamat

que es mucho más facil, legible y cómodo
Por un stratos menos tenso

luisdomarco

No se, supongo que tenéis razón pero además también es mas pesado, es que mi intención es hacer una intro de 64k con música y para eso hay que eliminar todo lo que no sea imprescindible. Más adelante quizás, aunque tampoco tengo muchas aspiraciones, simplemente me entro la curiosidad por saber como iba esto de opengl.

Un saludo.

Buffon

Está claro que cuando hablamos de demoscene hay que utilizar el mínimo de librerías extras posible, y a ser posible, utilizar sólo las dinámicas del sistema.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.