If you are a new Irrlicht Engine user, and have a newbie-question, this is the forum for you. You may also post general programming questions here.
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 2:55 pm
Hello,
if I dont call this
Code: Select all
// Kollisions-Animator hinzufuegen
irr::scene::ISceneNodeAnimator* anim = mo_smgr->createCollisionResponseAnimator(
ts_bewegung, Hauptfigur,
irr::core::vector3df(Radius,HalbeHoehe,Radius),
irr::core::vector3df(0.0,0.0,0.0),
irr::core::vector3df(0.0,0.0,0.0));
Sp_Kamera->addAnimator(anim);
//Hauptfigur->addAnimator(anim);
anim->drop();
I get an unhandled exception with this:
Code: Select all
bool MK::Eventmanager::OnEvent(const irr::SEvent& event)
{
// Maus Links Geklickt?
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT)
if (event.MouseInput.Event == irr::EMIE_LMOUSE_PRESSED_DOWN)
{
irr::core::triangle3df temp;
// Angeklickten Punkt bestimmen
mo_smgr->getSceneCollisionManager()->getCollisionPoint(
mo_smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(Bildschirm_Mitte,0), // Strahl durch Bildschirmmitte
mo_ts_klick, // anklickbare Dreiecke
AuswahlPunkt, // angeklickter Punkt
temp); // angeklicktes Dreieck (nicht benutzt)
}
// Taste Gedrueckt?
if (event.EventType == irr::EET_KEY_INPUT_EVENT)
TasteGedrueckt[event.KeyInput.Key] = event.KeyInput.PressedDown;
return false;
}
in the line getCollisionPoint (this is my eventreceiver).
Last edited by
Squarefox2 on Sat Apr 04, 2009 5:04 pm, edited 1 time in total.
hybrid
Admin
Posts: 14143 Joined: Wed Apr 19, 2006 9:20 pm
Location: Oldenburg(Oldb), Germany
Contact:
Post
by hybrid » Sat Apr 04, 2009 3:36 pm
You probably have a bad pointer there. Please show the full code with all modules involved. This is almost definitely no Irrlicht bug and is therefore moved to a better forum.
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 4:44 pm
Eventmanager.cpp
Code: Select all
// weiterer Definition des Eventmangers
#include "Eventmanager.h"
// Konstruktor
MK::Eventmanager::Eventmanager()
{
// Auswahlpunkt setzen
AuswahlPunkt = irr::core::vector3df(9999.0f, 9999.0f, 9999.0f);
// alle Tasten nicht gedrueckt
for (int i=0; i<irr::KEY_KEY_CODES_COUNT; i++)
TasteGedrueckt[i] = false;
}
// Anfangsinitialisierung
void MK::Eventmanager::WerteSetzen(irr::IrrlichtDevice* device,
Optionen * optionen)
{
mo_smgr = device->getSceneManager();
mo_cctrl = device->getCursorControl();
Bildschirm_Mitte.X = optionen->Aufloesung_Horizontal/2;
Bildschirm_Mitte.Y = optionen->Aufloesung_Vertikal/2;
}
// die Anklickbaren Objekte werden gesetzt
void MK::Eventmanager::setze_Kollisionsobjekt(irr::scene::IMetaTriangleSelector *ts_klick)
{
mo_ts_klick = ts_klick;
}
//=======================
// Eventverarbeitung
//========================
bool MK::Eventmanager::OnEvent(const irr::SEvent& event)
{
// Maus Links Geklickt?
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT)
if (event.MouseInput.Event == irr::EMIE_LMOUSE_PRESSED_DOWN)
{
irr::core::triangle3df temp;
// Angeklickten Punkt bestimmen
mo_smgr->getSceneCollisionManager()->getCollisionPoint(
mo_smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(Bildschirm_Mitte,0), // Strahl durch Bildschirmmitte
mo_ts_klick, // anklickbare Dreiecke
AuswahlPunkt, // angeklickter Punkt
temp); // angeklicktes Dreieck (nicht benutzt)
}
// Taste Gedrueckt?
if (event.EventType == irr::EET_KEY_INPUT_EVENT)
TasteGedrueckt[event.KeyInput.Key] = event.KeyInput.PressedDown;
return false;
}
//==========================
// Abfragen
//=============================
// Angeklickten Punkt zurueckliefern und loeschen
irr::core::vector3df MK::Eventmanager::bekommeAuswahlpunkt()
{
irr::core::vector3df temp = AuswahlPunkt;
AuswahlPunkt = irr::core::vector3df(9999.0f, 9999.0f, 9999.0f);
return temp;
}
// Taste gedrueckt?
bool MK::Eventmanager::IstTasteGedrueckt(irr::EKEY_CODE keyCode)
{
return TasteGedrueckt[keyCode];
}
// Mausposition abholen
irr::core::position2df MK::Eventmanager::BekommeRelativeMausPosition()
{
// Position relativ zur Fenstermmitte bestimmen
irr::core::position2df temp = mo_cctrl->getRelativePosition() - irr::core::position2df(0.5f,0.5f);
// Mauscursor wieder in Fenstermitte setzen
mo_cctrl->setPosition(0.5f, 0.5f);
// Wert zurueckgeben
return temp;
}
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 4:45 pm
Eventmanager.h
Code: Select all
// zur Verhinderung doppelter Definition
#ifndef EVENTMANAGER_H
#define EVENTMANAGER_H
#include <irrlicht.h>
#include "Optionen.h"
// Namespace MK : Moonork-Kern Objekt
namespace MK
{
class Eventmanager : public irr::IEventReceiver
{
public:
// Konstruktor
Eventmanager();
// Werte setzen
void WerteSetzen(irr::IrrlichtDevice* mo_device,
Optionen * optionen);
void setze_Kollisionsobjekt(irr::scene::IMetaTriangleSelector * ts_klick); // alles was anklickbar ist
// Bei einem Event
virtual bool OnEvent(const irr::SEvent& event);
// Angeklickten 3D-Punkt zurueckgeben
irr::core::vector3df bekommeAuswahlpunkt();
// Taste gedrueckt?
bool IstTasteGedrueckt(irr::EKEY_CODE keyCode);
// Maus Position
irr::core::position2df BekommeRelativeMausPosition();
private:
// Irrlicht Objekte
irr::scene::ISceneManager * mo_smgr;
irr::gui::ICursorControl * mo_cctrl;
irr::core::position2d<irr::s32> Bildschirm_Mitte;
// fuer das Anklicken von Schaltern
irr::scene::IMetaTriangleSelector * mo_ts_klick; // enthaelte alle klickbaren Dreiecke
irr::core::vector3df AuswahlPunkt;
// fuer Tastendruecke
bool TasteGedrueckt[irr::KEY_KEY_CODES_COUNT];
};
}
#endif
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 4:46 pm
main.cpp
Code: Select all
#include <irrlicht.h>
#include <irrKlang.h>
#include <iostream>
#include "Eventmanager.h"
#include "Optionen.h"
#include "Level.h"
//using namespace irr;
// Einbindung der Bibliotheken
#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif
#pragma comment(lib, "irrKlang.lib")
int main()
{
// Einstellungen
MK::Optionen * Mo_Optionen = new MK::Optionen();
// Eventmanager
MK::Eventmanager * mo_emgr = new MK::Eventmanager();
// Sound-Device
irrklang::ISoundEngine* mo_soundengine = irrklang::createIrrKlangDevice();
// Parameteruebergabe vorbereiten
irr::SIrrlichtCreationParameters IrrlichtParameter;
IrrlichtParameter.AntiAlias = Mo_Optionen->AntiAliasing;
IrrlichtParameter.Bits = 16;
IrrlichtParameter.DriverType = irr::video::E_DRIVER_TYPE::EDT_DIRECT3D9;
IrrlichtParameter.EventReceiver = mo_emgr;
IrrlichtParameter.Fullscreen = Mo_Optionen->Vollbild;
IrrlichtParameter.Stencilbuffer = Mo_Optionen->Schatten;
IrrlichtParameter.Vsync = Mo_Optionen->Vsync;
IrrlichtParameter.WindowSize = irr::core::dimension2di(Mo_Optionen->Aufloesung_Horizontal,
Mo_Optionen->Aufloesung_Vertikal);
// Irrlicht-Device mit Parametern erstellen
irr::IrrlichtDevice* mo_device = irr::createDeviceEx(IrrlichtParameter);
if (mo_device == 0)
return 1; // konnte die Irrlicht-Device nicht erstellen
irr::video::IVideoDriver* mo_driver = mo_device->getVideoDriver();
irr::scene::ISceneManager* mo_smgr = mo_device->getSceneManager();
irr::gui::IGUIEnvironment * mo_guienv = mo_device->getGUIEnvironment();
mo_emgr->WerteSetzen(mo_device, Mo_Optionen);
//=========================================================
// Level laden
//=====================
MO::Level * Mo_Level = new MO::Level("Tempel.irr",
mo_device,
mo_emgr,
Mo_Optionen);
// Spielmusik in einer Schleife abspielen
mo_soundengine->play2D("Musik/InGame.wav", true);
//========================================================
int lastFPS = -1;
while(mo_device->run())
if (mo_device->isWindowActive())
{
Mo_Level->Aktivieren(); // Aktionen aller Levelobjekte durchfuehren
// Zeichnen
mo_driver->beginScene(true, true, irr::video::SColor(0,200,200,200));
mo_smgr->drawAll();
mo_guienv->drawAll();
mo_driver->endScene();
// Framerate bestimmen
int fps = mo_driver->getFPS();
// Fenstertitel aktualisieren
if (lastFPS != fps)
{
irr::core::stringw str = L"Moonork Adventures : Quest for the Nightstone [";
str += mo_driver->getName();
str += "] FPS:";
str += fps;
mo_device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
// Loeschen der Devices
mo_device->drop();
mo_soundengine->drop();
return 0;
}
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 4:48 pm
Elementarschrein.cpp:
Code: Select all
// weitere Implementierung der Klasse Elementarschrein
#include "Elementarschrein.h"
// Konstruktor
MO::Elementarschrein::Elementarschrein(irr::scene::ISceneManager *smgr,
irr::ITimer* timer,
irr::scene::IMetaTriangleSelector * ts_bewegung,
MK::Eventmanager * emgr,
MO::GebietsManager *gmgr,
MO::Spieler *splr)
:
Mo_Spieler(splr)
{
// Fallen erzeugen
Mo_Flammenstrahl01 = new Flammenstrahl(smgr, timer, gmgr, splr, 20200);
Mo_Flammenstrahl02 = new Flammenstrahl(smgr, timer, gmgr, splr, 20201);
Mo_Flammenstrahl03 = new Flammenstrahl(smgr, timer, gmgr, splr, 20202);
Mo_Kaeltekreis = new Kaeltekreis(smgr, timer, gmgr, splr);
// Schalter sind anklickbar : Dreiecke fuers Anklicken vorbereiten
irr::scene::IMetaTriangleSelector * mo_ts_klick = smgr->createMetaTriangleSelector();
// Schalter erzeugen
Mo_Schalter1 = new Schalter(smgr,mo_ts_klick,gmgr,Mo_Spieler,20010,20300);
Mo_Schalter2 = new Schalter(smgr,mo_ts_klick,gmgr,Mo_Spieler,20011,20301);
Mo_Schalter3 = new Schalter(smgr,mo_ts_klick,gmgr,Mo_Spieler,20012,20302);
Mo_Nachtstein = new Schalter(smgr,mo_ts_klick,gmgr,Mo_Spieler,20001,20400);
// Unpassierbarkeit der Schalter
ts_bewegung->addTriangleSelector(mo_ts_klick);
// Unpassierbarkeit des Schreins (ID 20000)
irr::scene::ISceneNode * node = smgr->getSceneNodeFromId(20000, smgr->getRootSceneNode());
irr::scene::ITriangleSelector * selector = smgr->createOctTreeTriangleSelector(((irr::scene::IMeshSceneNode*)node)->getMesh(), node);
ts_bewegung->addTriangleSelector(selector);
selector->drop();
// Anklickbare Objekte an den Szenenmanager uebergeben
emgr->setze_Kollisionsobjekt(mo_ts_klick);
mo_ts_klick->drop();
}
// Aktivierung
void MO::Elementarschrein::Aktivieren()
{
// Aktivierungen Schalter
Mo_Schalter1->Aktivieren();
Mo_Schalter2->Aktivieren();
Mo_Schalter3->Aktivieren();
Mo_Nachtstein->Aktivieren();
// Fallen ausschalten
if(Mo_Schalter1->IstAngeschaltet())
Mo_Flammenstrahl01->Auschalten();
if(Mo_Schalter2->IstAngeschaltet())
{
Mo_Flammenstrahl02->Auschalten();
Mo_Flammenstrahl03->Auschalten();
}
if(Mo_Schalter3->IstAngeschaltet())
Mo_Kaeltekreis->Auschalten();
if(Mo_Nachtstein->IstAngeschaltet())
// Spieler hat gewonnen
;
// Aktivierungen Fallen
Mo_Flammenstrahl01->Aktivieren();
Mo_Flammenstrahl02->Aktivieren();
Mo_Flammenstrahl03->Aktivieren();
Mo_Kaeltekreis->Aktivieren();
}
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 4:49 pm
The other code only uses
Code: Select all
irr::core::vector3df MK::Eventmanager::bekommeAuswahlpunkt()
Code: Select all
irr::core::position2df Maus = mo_emgr->BekommeRelativeMausPosition();
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 4:55 pm
If I use
instead of
in Elementarschrein.cpp,
there is also no exception
Squarefox2
Posts: 67 Joined: Mon Feb 02, 2009 10:19 am
Post
by Squarefox2 » Sat Apr 04, 2009 5:04 pm
Ok, you was right - I got the error:
I uses the TriangleSelector in Eventmanager as I got it to there from Elementarschrein - without of copiing it.
So I got the exception.