Ref: Probleme mit EventReceiver & keycode unter linux
hallo,
OS: suse-linux 10.3. 64 bit mit quad 4 gb
irrlicht-version 1.5.0
da ich einige programme fuer opencv und opengl fuer 3 webcams entwickle,
bin ich vor einigen tagen auf das Package:
"CvIrrCamController-0.5." gestossen.
wurde mit irrlicht 1.5 erfolgreich compiliert,
laufen tuts auch.
da ich gezwungenermassen
meistens ohne "make" compiliere
(wegen opencv & opengl & wiimote-packages)
hab ich in den letzten tagen folgendes
compile entwickelt:
- g++ -o irrTest1 irrTest1.cpp -lIrrlicht -lGL -lGLU -lm -lXxf86vm -lpng -ljpeg
funzzt praechtig: das irrTest1.cpp entspricht dem
programm aus examples : 01.HelloWorld.cpp -> main.cpp
nun zu meinen problem:
habe auch ein eigenes kleines prog entwickelt:
irrTest.cpp
Compile OK
Run auch: ABER:
ich kann das programm nicht beenden
ich moechte gerne z.B. mit der Taste <q>
das prog beenden koennen.
habe dazu (aus dem Web) die "class InputReceiver "
benutzt
Aber immernoch der gleiche Fehler;
es erscheint das irrlicht-window mit dem mouse-cursor
der cursor hat vermutlich den focus in der mitte des windows
- keine moeglichkeit den cursor zu bewegen
- bei betaetigen von <q> kommt auf der console
- "Window key not supported linux..."
konnte diesen satz leider nicht aufschreiben
da dann mein systen unbenutz bar ist Crash, und SystemRestart.
ich waere froh wenn mir jemand helfen koennte.
gruss nomad
hier ist der code:
Code:
/*
dd. 31.05.2009
name: irrTest.cpp
compile with: (with opencv unterstuetzung)
g++ -o irrTest irrTest.cpp -lIrrlicht -lGL -lGLU -lm -lXxf86vm -lpng -ljpeg
compile OK
RUN : NOK laeuft laesst sich aber nicht abbrechen.
problme mit keystates
dd. 01.06.2009
versuche mit EventReceiver as procedure for keyboard-handling
only <q> for exit
01.06. - 1.versuch mit classEventReceiver.txt
- einbau von Class eventReceiver
- compile OK
- Compile into main with:
// new eventReceiver
InputReceiver input;
Fehler verm.wegen input
- da irrTestEventReceiver.cpp compile & run OK with Buttons
- neuer versuch (1)
- ohne new stuff input compile OK
- neuer versuch (2)
- wenn InputReceiver input
- ausserhalb von while() plaziert wird
- compile immerhin OK
- versuch keyhandler mit <q> -> exit
- keys look at irrKeycode.txt
- KEY_KEY_Q = 0x51, // Q key
- compile OK
- 1. run with q exit
- weitere Versuche NOK SYSTEM CRASH
- now neuer versuch mit
- mit original 01.HelloWorld.cpp
- as irrTest1.cpp
- irrTest1.cpp -> compile OK mit meinem compile
- ./irrTest1.cpp -> RUN OK
*/
#include </irrlicht/irrlicht.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <ctype.h>
#include <setjmp.h>
#include <termios.h>
#include <unistd.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <errno.h>
#include <ctype.h>
#include <sys/io.h>
#include <iostream>
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
// create device
IrrlichtDevice *device = 0; // createDevice(driverType, core::dimension2d<s32>(640, 480), 16, false);
class InputReceiver : public IEventReceiver
{
public:
// old: bool OnEvent(SEvent event)
virtual bool OnEvent(const SEvent& event)
{
if(event.EventType == EET_KEY_INPUT_EVENT && event.KeyInput.PressedDown) {
switch(event.KeyInput.Key)
{
case KEY_KEY_Q: // = 0x51, // Q key
device->closeDevice();
return true;
break;
case KEY_RIGHT:
// player->SetMoveVector(vector3df(0.15f, 0, 0));
break;
case KEY_LEFT:
// player->SetMoveVector(vector3df(-0.15f, 0, 0));
break;
case KEY_UP:
// player->SetMoveVector(vector3df(0, 0.15f, 0));
break;
case KEY_DOWN:
// player->SetMoveVector(vector3df(0, -0.15f, 0));
break;
default:
break;
}
}
// return true;
return false;
}
};
int main()
{
video::E_DRIVER_TYPE driverType;
printf("Please select the driver you want for this example:\n"\
" (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
" (d) Software Renderer\n (e) Burning's Software Renderer\n"\
" (f) NullDevice\n (otherKey) exit\n\n");
char i;
std::cin >> i;
switch(i)
{
case 'a': driverType = video::EDT_DIRECT3D9;break;
case 'b': driverType = video::EDT_DIRECT3D8;break;
case 'c': driverType = video::EDT_OPENGL; break;
case 'd': driverType = video::EDT_SOFTWARE; break;
case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
case 'f': driverType = video::EDT_NULL; break;
default: return 0;
}
// create device
// IrrlichtDevice *device = createDevice(driverType, core::dimension2d<s32>(640, 480), 16, false);
// new device
device = createDevice(driverType, core::dimension2d<s32>(640, 480), 16, false);
if(device == 0)
return 1; // could not create selected driver.
// is wrong ss.oben
// start up the engine
// IrrlichtDevice *device = createDevice(video::EDT_DIRECT3D8, core::dimension2d<s32>(640,480));
// video::IVideoDriver* driver = device->getVideoDriver();
// scene::ISceneManager* scenemgr = device->getSceneManager();
// guienv::IGUIEnvironmente
// new eventReceiver
InputReceiver input;
IVideoDriver* driver = device->getVideoDriver();
ISceneManager* scenemgr = device->getSceneManager();
IGUIEnvironment* guienv = device->getGUIEnvironment();
device->setWindowCaption(L"Hello World!-Irrlicht-Engine");
/*
We add a hello world label to the window, using the GUI environment.
The text is placed at the position (10,10) as top left corner and
(260,22) as lower right corner.
*/
guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!",
rect<s32>(10,10,260,22), true);
// load and show quake2 .md2 model
scene::ISceneNode* node = scenemgr ->addAnimatedMeshSceneNode( scenemgr->getMesh("sydney.md2"));
// if everything worked, add a texture and disable lighting
if(node)
{
// node->setMaterialTexture(0, driver->getTexture("texture.bmp"));
node->setMaterialFlag(video::EMF_LIGHTING, false);
}
// add a first person shooter style user controlled camera
scenemgr->addCameraSceneNodeFPS();
// draw everything
while(device->run() && driver)
{
// new eventReceiver
// InputReceiver input;
driver->beginScene(true, true, video::SColor(255,0,0,255));
scenemgr->drawAll();
driver->endScene();
}
// delete device
device->drop();
return 0;
}
/**********************************************************************/