irrlicht3d engine - problem mit buttons



  • hallo,
    ich habe ein problem mit folgendem code:

    int main() {
    	IrrlichtDevice *device = createDevice(driverChoiceConsole());
    	if(!device) return 1;
    	video::IVideoDriver *driver = device->getVideoDriver();
    	gui::IGUIEnvironment *guienv = device->getGUIEnvironment();
    	guienv->addButton(core::recti(250,20,390,50),0,101,L"Nächster Spieler");
    	while(device->run()) {
    		driver->beginScene();
    		guienv->drawAll();
    		driver->endScene();
    	}
    	device->drop();
    }
    

    wenn ich das prog laufen lasse, sehe ich den button, aber kann ihn nicht anklicken. und obwohl ich die lösung jetzt schon seit stunden suche 😕 , finde ich sie nicht 😕 .

    wäre sehr dankbar, wenn mir jemand helfen könnte... 😋



  • Dieser Thread wurde von Moderator/in phlox81 aus dem Forum Andere GUIs - Qt, GTK+, wxWidgets in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Geht bei mir, also was ist das genaue Problem?
    Wahrscheinlich meinst du den Event Receiver, das kann ich aber in deinem unvollständigen Code nicht erkennen. Auf jeden Fall sagst du Irrlicht nicht, wie auf Events reagiert werden soll.

    device->setEventReceiver(..);
    


  • Oh, tatsächlich...
    ich hab meinen code nämlich gekürzt, extra für euch 🙂
    ich will nämlich ein mühle-spiel proggen und jetzt geht der dumme button nicht.

    hier ist der ganze code:

    main.cpp

    #include "c:\Irrlicht\include\irrlicht.h"
    #include "c:\Irrlicht\include\driverchoice.h"
    #include "Figur.h"
    
    #pragma comment(lib, "irrlicht.lib")
    using namespace irr;
    
    bool player = 0;
    char figure = 0;
    
    Figur figures[2][9] = {
    	Figur(core::vector2di(30,50)),
    	Figur(core::vector2di(30,100)),
    	Figur(core::vector2di(30,150)),
    	Figur(core::vector2di(30,200)),
    	//...
    };
    
    core::vector2di posses[24] = {
    	core::vector2di(110,60),
    	core::vector2di(295,60),
    	core::vector2di(480,60),
    
    	core::vector2di(173,123),
    	core::vector2di(295,123),
    	core::vector2di(480-63,123),
    
    	core::vector2di(110+127,60+127),
    	//...
    };
    
    #include "eventreceiver.h"
    
    int main() {
    	IrrlichtDevice *device = createDevice(driverChoiceConsole());
    	if(!device) return 1;
    	EventReceiver receiver;
    	device->setWindowCaption(L"Mühle - Paul Reichert");
    	video::IVideoDriver *driver = device->getVideoDriver();
    	scene::ISceneManager *smgr = device->getSceneManager();
    	gui::IGUIEnvironment *guienv = device->getGUIEnvironment();
    	gui::IGUIFont *normalFont = guienv->getBuiltInFont();
    	gui::IGUIFont *hsFont     = guienv->getFont("fonths.bmp");
    	gui::IGUIButton *button   = guienv->addButton(core::recti(250,20,390,50),0,101,L"Nächster Spieler");
    	device->setEventReceiver(&receiver);
    	while(device->run()) {
    		driver->beginScene();
    		guienv->drawAll();
    		driver->draw2DRectangle(video::SColor(255,255,0,0),core::recti(100,50,500,450));
    		driver->draw2DRectangle(video::SColor(255,0,0,0)  ,core::recti(110,60,120,440));
    		driver->draw2DRectangle(video::SColor(255,0,0,0)  ,core::recti(110,60,490,70) );
    		driver->draw2DRectangle(video::SColor(255,0,0,0)  ,core::recti(480,60,490,440));
    		driver->draw2DRectangle(video::SColor(255,0,0,0)  ,core::recti(110,430,490,440));
    		//...
    		for each(Figur f in figures) {
    			f.Draw(driver);
    		}
    		driver->endScene();
    	}
    	device->drop();
    }
    

    Figur.h:

    #ifndef FIGUR_H
    #define FIGUR_H
    
    #include "c:\Irrlicht\include\irrlicht.h"
    
    using namespace irr;
    
    class Figur {
    public:
    	core::vector2di Pos;
    	inline bool Chosen(core::vector2di Pos);
    	inline void Draw(video::IVideoDriver *driver);
    	Figur(core::vector2di Pos, bool White = 1);
    	Figur() {}
    	bool White;
    };
    
    Figur::Figur(core::vector2di pos, bool white) : Pos(pos), White(white) {}
    
    bool Figur::Chosen(core::vector2di pos) {
    	return (pow((float)(Pos.X-pos.X),2) + pow((float)Pos.Y-pos.Y,2)) < pow((float)25,2);
    }
    
    void Figur::Draw(video::IVideoDriver *driver) {
    	video::ITexture *fig = driver->getTexture(White ? "figurw.png" : "figurb2.png");
    	driver->makeColorKeyTexture(fig,core::position2di(0,0));
    	driver->draw2DImage(fig,core::vector2di(Pos.X-25,Pos.Y-25),core::recti(0,0,50,50),0,video::SColor(255,255,255,255),true);
    }
    #endif
    

    EventReceiver.h:

    #ifndef ERECEIVER_H
    #define ERECEIVER_H
    
    #include "c:\Irrlicht\include\irrlicht.h"
    using namespace irr;
    
    class EventReceiver : public IEventReceiver {
    public:
    	virtual bool OnEvent(const SEvent &event) {
    		Figur f = figures[player][0];
    		switch(event.EventType) {
    			case EET_MOUSE_INPUT_EVENT:
    				if(event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
    					for(int i = 0; i < 9; ++i,f = figures[player][i]) {
    						if(f.Chosen(core::vector2di(event.MouseInput.X,event.MouseInput.Y))) {
    							figure = i;
    						}
    					}
    				}
    				return 1;
    				break;
    		}
    		if(event.EventType == EET_GUI_EVENT)
    			return true;
    		return false;
    	}
    };
    
    #endif
    

    Tja, nur leider kommt kein Event an und der Button kann auch nicht gedrückt werden... 😞



  • ich hab das problem eingeschränkt und es klappt nur, wenn man nicht setEventReceiver() aufruft.



  • Okay, hat sich erledigt, ich musste nur den MOUSE_LEFT_UP Event mit return false; statt true beenden. 😃


Anmelden zum Antworten