Aktuelle Zeit: 12.05.2025, 23:06

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: EventReceiver
BeitragVerfasst: 05.05.2009, 11:19 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Hallo hab wieder ein Problem mit dem EventReceiver ^,^'

Ich habe mein Programm etwas umzustrukturiert und eine game klasse erstellt.
In dieser erstelle ich das device und möchte auch den EventReceiver festlegen

In einer Funktion habe ich dort folgendes stehen:

Code:
    IEnumStructure::SAppContext context;
    context.device = device;
    StartmenuEventReceiver receiver(context);
    device->setEventReceiver(&receiver);


-> Dies steht in der funktion CreateStartmenu()

Meine main() funktion sieht also so aus:

Code:
int main()
{
CGame Game;
// Init game
Game.Init();

// Create scene
Game.CreateStartmenu();


// Main Loop
while(Game.device->run())
    {
    Game.MainLoop();
    }

// Clean up memory
Game.Finish();
return 0;
}


Wenn ich es nun starte, kommt diese fehlermeldung:

Zitat:
Eine nicht behandelte Ausnahme des Typs "System.AccessViolationException"....


Dabei liegt der Zeiger auf dem Code
Code:
if (UserReceiver)
      absorbed = UserReceiver->OnEvent(event); //Hier scheint der fehler aufzutreten

(Im cirrdevicestub.cpp / Funktion: bool CIrrDeviceStub::postEventFromUser(const SEvent& event))



Verschiebe ich das setzten des EventReceivers wieder in die main funktion

Code:
int main()
{
CGame Game;
// Init game
Game.Init();

// Create scene
Game.CreateStartmenu();
    IEnumStructure::SAppContext context;
    context.device = Game.device;
    StartmenuEventReceiver receiver(context);
    Game.device->setEventReceiver(&receiver);

// Main Loop
while(Game.device->run())
    {
    Game.MainLoop();
    }

// Clean up memory
Game.Finish();
return 0;
}


Funktioniert alles ^.^
Bin irgentwie noch etwas zu doof für c++ - hab ich so das gefühl, hat jemand ne ahnung, ob ich dies auch in der funktion einsetzten kann?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 05.05.2009, 12:44 
Offline

Registriert: 12.09.2008, 21:41
Beiträge: 187
Wohnort: Deutschland
Hi,

also die Variable wird wohl einfach keine Gültigkeit haben, also machste dir am besten eine GetReceiver() Funktion für deine Klasse, die dann genau den Receiver zurückgibt, den CreateStartmenü() erzeugt hat...

Gruß
Scarabol

_________________
My Toolbox:
- Irrlicht 1.7.1
- Blender 2.49a
- Microsoft Visual C++ Express Edition 2008
- Newton Game Dynamics 2.xx
Regeln zur Programmierung:
Regel 1: Die Programmiersprache hat keine Fehler.
Regel 2: Solltest du doch einen Fehler finden, tritt automatisch Regel 1 in Kraft.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 05.05.2009, 15:08 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Oder erzeug dir den Receiver über new. Und lösch ihn am ende wieder.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 05.05.2009, 17:18 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Sylence hat geschrieben:
Oder erzeug dir den Receiver über new. Und lösch ihn am ende wieder.


Meinst du das so?

Code:
    IEnumStructure::SAppContext context;
    context.device = device;
    StartmenuEventReceiver *receiver = new StartmenuEventReceiver(context);
    device->setEventReceiver(receiver);
    delete receiver;


hilft auch nicht kommt der gleiche fehler ^.^' Oder meintest was anderes?^^


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 05.05.2009, 18:28 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Ja so, aber das delete muss ans Ende des _Programms_

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 05.05.2009, 18:45 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Sylence hat geschrieben:
Ja so, aber das delete muss ans Ende des _Programms_


dann gibt er aber eine Fehlermeldung dort aus:
Code:
bool StartmenuEventReceiver::OnEvent(const SEvent &event)
    {
    IGUIEnvironment* env = Context.device->getGUIEnvironment();


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 05.05.2009, 20:53 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Pointer immer mit Null initialisieren und vor dem Benutzen prüfen.
device wird in diesem Fall ungültig sein.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 05.05.2009, 21:03 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Hab ich mir schon gedacht :D Danke nun gehts :lol:


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 06.05.2009, 22:41 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Hab dazu wieder ne doofe Frage :D

Also ich hab nun ne Klasse für den eventReceiver - dort habe ich mehrere funktionen die natürlich auf die variable event zugreifen müssen.
Ich habs bisher so versucht:

Code:
bool IInterface::OnEvent(const SEvent &event)
{
    Event = event;
....


Das Problem: einige daten darin scheinen dadurch inkorrekt zu sein (z.b. Maus Position) - hat jemand ne Idee wie man das lösen könnte?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 07.05.2009, 07:44 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
SEvent will nicht gerne kopiert werden ;)

Warum übergibts du das event nicht einfach den Methoden als Parameter ?

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 07.05.2009, 09:37 
Offline

Registriert: 24.05.2008, 13:41
Beiträge: 151
Wohnort: Marienhafe
Scheinbar auch nicht gerne übergeben, zumindest:
Event.EventType
funktioniert nicht :(


Edit: Nochmal zu was anderem, wenn ich das programm im vollbildmodus starte kommt immer die fehlermeldung "Direct3d9 end scene failed" in die Konsole - Das game scheint aber weiterhin zu laufen


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: EventReceiver
BeitragVerfasst: 07.05.2009, 10:31 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Übergib einfach das komplette event.

Also in etwa sowas:
Code:
class Receiver
{
bool OnEvent( const SEvent& event );

bool onMouseEvent( const SEvent& event );
bool onGuiEvent( const SEvent& event );
};

...

bool Receiver::OnEvent( const SEvent& event )
{
   if( event.EventType == EET_GUI_EVENT )
      return onGuiEvent( event );
   else if( event.EventType == EET_MOUSE_EVENT )
      return onMouseEvent( event );

   ...
}


Diesen end scene fehler hatte ich bisher nur einmal und das lag daran, dass ich aus Versehen zwei mal driver->endScene() aufgerufen hatte.

Zur Not kannst du den code vom Dx9 driver dahingehend mal ändern, dass du den Fehlercode bekommst, den EndScene() zurück gibt.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de