Hallo,
ich habs jetzt endlich mal wieder geschafft, ein bisschen was zu machen. Ich hab jetzt SDL mit Irrlicht kombiniert, der Teil sieht auch gut aus (denke ich). Ich möchte mit SDL einen eigenen Thread machen, in dem später die Physik mit ODE laufen soll, in dem Thread würde ich auch die Abfragen von Tastatur und Maus und so machen. In meinem ersten Irrlicht SDL Testprogramm hab ich zwei Threads gemacht, einer läuft einfach und einer wartet auf Events. Dieser zweite Thread kriegt aber keine Events mit (bzw. nur sehr wenige, auf jedenfall keine Keyboard Events). Ich hab den Code unten mal angehängt, vielleicht hat von euch jemand eine Idee, was das Problem sein könnte. Danke schon mal,
Brainsaw
Code:
#include <windows.h>
#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#include <SDL/SDL_getenv.h>
#include <SDL/SDL.h>
#include <SDL/SDL_syswm.h>
#include <irrlicht.h>
bool g_bThreadRunning=true;
int keyboardThread(void *nothing)
{
SDL_Event event;
SDL_EnableKeyRepeat(0,0);
SDL_EnableUNICODE(1);
printf("kbThread...\n");
while (g_bThreadRunning)
{
if (SDL_WaitEvent(&event))
{
printf("\tEvent ... %i\n",event.type);
switch (event.type)
{
case SDL_QUIT: g_bThreadRunning=false; break;
case SDL_KEYDOWN: { printf("\t\tkeyDown\n"); if (event.key.keysym.sym == SDLK_ESCAPE) g_bThreadRunning=false; break; }
}
}
}
printf("kbThread end\n");
return 0;
}
int threadFunktion(void *nichtVerwendet)
{
int found,i;
printf("Thread\n");
while (g_bThreadRunning) { printf("--> Thread\n"); SDL_Delay(100); }
printf("Thread end.\n");
return 0;
}
int main ( int argc, char** argv )
{
SDL_Thread *thread,*kbThread;
int i;
HWND sdl_hWnd;
if (SDL_Init(SDL_INIT_EVERYTHING)<0) { printf( "Unable to init SDL: %s\n", SDL_GetError() ); return 1; }
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,SDL_HWSURFACE|SDL_DOUBLEBUF);
static SDL_SysWMinfo pInfo;
SDL_VERSION(&pInfo.version);
SDL_GetWMInfo(&pInfo);
sdl_hWnd = pInfo.window;
irr::SIrrlichtCreationParameters params;
params.AntiAlias=false;
params.Bits=16;
params.DriverType=irr::video::EDT_OPENGL;
params.Fullscreen=false;
params.Stencilbuffer=false;
params.Vsync=false;
params.WindowSize=irr::core::dimension2d<irr::s32>(640,480);
params.WindowId = (void *)sdl_hWnd;
irr::IrrlichtDevice *device = createDeviceEx(params);
irr::video::IVideoDriver* driver = device->getVideoDriver();
irr::scene::ISceneManager* smgr = device->getSceneManager();
atexit(SDL_Quit);
if (!screen) { printf("Unable to set 640x480 video: %s\n", SDL_GetError()); return 1; }
thread = SDL_CreateThread(threadFunktion, NULL);
kbThread=SDL_CreateThread(keyboardThread, NULL);
if (thread==NULL) { fprintf(stderr, "Unable to start thread: %s\n", SDL_GetError()); return 1; }
if (kbThread==NULL) { fprintf(stderr,"Unable to start keyboard therd: %s\n",SDL_GetError()); return 1; }
while (g_bThreadRunning) { printf("."); driver->beginScene(true, true, irr::video::SColor(255,0,20,40)); smgr->drawAll(); driver->endScene(); }
SDL_WaitThread(thread ,NULL);
SDL_WaitThread(kbThread,NULL);
printf("Exited cleanly\n");
return 0;
}