[SOLVED] Very Strange Bug - please help!

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.
Post Reply
Squarefox2
Posts: 67
Joined: Mon Feb 02, 2009 10:19 am

[SOLVED] Very Strange Bug - please help!

Post by Squarefox2 »

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 »

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 »

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 »

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 »

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 »

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 »

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 »

If I use

Code: Select all

//mo_ts_klick->drop();
instead of

Code: Select all

mo_ts_klick->drop();
in Elementarschrein.cpp,
there is also no exception
Squarefox2
Posts: 67
Joined: Mon Feb 02, 2009 10:19 am

Post by Squarefox2 »

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.
Post Reply