DXScene Objekte zur Runtime erstellen und verwalten



  • Ja stimmt, Nun geht es. 🙄
    Wie startet man das am kleversten mit dem Start der Anwendung? Über einen TTimer eventuell?

    Weiß eventuell jemand warum
    1. device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
    bei mir den Form1->Caption nicht ändert?

    2. guienv->addStaticText(L"Hello World! This is the Irrlicht renderer!", irr::core::rectirr::s32(10,10,300,50), true);
    ist sehr unleserlich. Waran kann das liegen?

    3. Wenn ich oben im TForm auf das "X" Schließsymbol drücke, dann stopt erstmal nur die Animation, wenn ich nochmal drauf drücke beendet sich auch die Anwendung. Das selbe Spiel beim Taskpopup und "Schließen". Warum ist dies so, warum beendet sich nicht gleich die Anwendung? Muss ich da etwas beachten?

    Sonst freut es mich schonmal rießig das ich Tutorial 1 mit eurer und vor allem VergissEs Hilfe geschafft habe. 😃



  • Mit device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
    würdest du den Caption ändern wenn du das Fenster über Irrlicht erstellst
    aber du verwendest ja "nur" den Panel Handle als Ausgabe somit musst du zum ändern des Fenster Caption VCL typisch vorgehen.

    Caption = "Hello World! - Irrlicht Engine Demo";
    


  • Ja stimmt, ich gebe ihm ja nur das Panel Handle. Das habe ich gar nicht berücksichtigt. Damit wäre Punkt 1 geklärt. 😉



  • zu Punkt 2:
    Schriftgröße zu klein?
    Auflösung zu klein?
    Kamera zu weit weg?

    zu Punkt 3:
    Der Thread wird erst beendet dann beim zweiten klick beendet die Anwendung.
    Also vorher erst Irrlicht beenden dann Programm schliessen lassen.



  • @VergissEs

    zu Punkt 2:
    Das ist der standard Font aus dem Irrlicht Tutorial 01, da es 2D Anzeige ist kann Kamera nicht zu weit entfernt sein. Aber du hast Recht, wenn ich das Fenster etwas größer mache, dann ist er lesbar. Verstehe das nur nicht. Ist das ein Bug?
    Ich definiere doch ein Rechteck in dem der Text erscheinen soll (WordWrap damit möglich).

    zu Punkt 3:
    So beenden schlägt leider völlig fehl, dann bekomme ich eine Errormeldung: "Pure virtual function called" 🙄

    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    	if (device)
    	{
    		device->closeDevice();
    		device->drop();
    	}
    }
    

    ~dxscene schrieb:

    Wie startet man das am kleversten mit dem Start der Anwendung? Über einen TTimer eventuell?

    Wenn man es nicht in OnShow starten kann fällt mir nichts anderes ein. Gibt es andere Möglichkeiten? Weil ein Timer ist doch sehr unsicher. Was ist wenn das Programm mal länger brauch weil Festplattenzugriff anderer Programme oder Systemauslastung den Start verzögern. Dann dürfte so ein Timer, wenn er nicht gerade auf 10s steht, eventuell in die Hose gehen. 😕



  • So ... auf der Schnelle mal was zusammen geklatscht.

    Projekt CPP

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <tchar.h>
    #include "Form_Main.h"
    //---------------------------------------------------------------------------
    USEFORM("Form_Main.cpp", FormMain);
    //---------------------------------------------------------------------------
    WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
    {
    	try
    	{
    		Application->Initialize();
    		Application->MainFormOnTaskBar = true;
    		Application->CreateForm(__classid(TFormMain), &FormMain);
    		FormMain->InitIrrlicht();
    		FormMain->Show();
    		FormMain->RunIrrlicht(); 
    		//Application->Run(); 
    
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	catch (...)
    	{
    		try
    		{
    			throw Exception("");
    		}
    		catch (Exception &exception)
    		{
    			Application->ShowException(&exception);
    		}
    	}
    	return 0;
    }
    //---------------------------------------------------------------------------
    

    Form H

    //---------------------------------------------------------------------------
    #ifndef Form_MainH
    #define Form_MainH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    
    #include <irrlicht.h>
    //---------------------------------------------------------------------------
    class TFormMain : public TForm
    {
    __published:	// IDE-verwaltete Komponenten
    	TPanel *Panel1;
    	TLabel *Label1;
    	TLabel *lblFPS;
    private:	// Benutzer Deklarationen
    	irr::IrrlichtDevice* device;
    	irr::video::IVideoDriver* driver;
    	irr::scene::ISceneManager* smgr;
    public:		// Benutzer Deklarationen
    	__fastcall TFormMain(TComponent* Owner);
    	void InitIrrlicht();
    	void RunIrrlicht();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TFormMain *FormMain;
    //---------------------------------------------------------------------------
    #endif
    

    Form CPP

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Form_Main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TFormMain *FormMain;
    //---------------------------------------------------------------------------
    __fastcall TFormMain::TFormMain(TComponent* Owner)
    	: TForm(Owner)
    {
    
    }
    //---------------------------------------------------------------------------
    void TFormMain::InitIrrlicht() {
    
    	HWND hIrrlichtWindow = Panel1->Handle;
    
    	irr::SIrrlichtCreationParameters param;
    	param.WindowId = hIrrlichtWindow;
    	param.DriverType = irr::video::EDT_OPENGL;
    
    	device = irr::createDeviceEx(param);
    	smgr = device->getSceneManager();   // setup a simple 3d scene
    	driver = device->getVideoDriver();
    
    	irr::scene::ICameraSceneNode* cam = smgr->addCameraSceneNode();
    	cam->setTarget(irr::core::vector3df(0,0,0));
    
    	irr::scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(irr::core::vector3df(0,10,0), 30.0f);
    	cam->addAnimator(anim);
    	anim->drop();
    
    	irr::scene::ISceneNode* cube = smgr->addCubeSceneNode(25);
    	cube->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    	cube->setMaterialTexture(0, driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\rockwall.bmp"));
    
    	smgr->addSkyBoxSceneNode(
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_up.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_dn.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_lf.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_rt.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_ft.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_bk.jpg"));
    
    }
    //---------------------------------------------------------------------------
    void TFormMain::RunIrrlicht() {
    
    	while (device->run()) {
    
    		driver->beginScene(true, true, 0);
    		smgr->drawAll();
    		driver->endScene();
    
    		lblFPS->Caption = (int)driver->getFPS();
    	}
    
    	device->closeDevice();
    
    	device->drop();
    }
    //---------------------------------------------------------------------------
    


  • Schnell zusammen geklatscht und funktioniert prima! 👍
    Danke dir für den tollen Support! Werde die Tage mir mal Zeit nehmen und Irrlicht nun besser zu verstehen.



  • Ich habe hier nen billig Rechner der bei 3D Sachen sofort den Lüfter hoch jagd und im Zeitalter des Stromsparends würde mich sehr eine Optimierung der Anzeige interessieren. Ich hätte gern das Irrlicht nur was macht und berechnet, wenn sich etwas verändert und man gegebenenfalls auch "Pause" drücken kann.

    Optimal wäre wenn das Irrlicht erkennen würde und eine Variable dafür zur Verfügung stellt. Dahingehend fand ich leider nichts. Ich dachte da erstmal an einen Schalter welcher eine Boolean setzt oder wenn das Fenster nicht mehr den Focus hat.

    void TFormMain::RunIrrlicht()
    {
    	while (device->run())
    	{
    		if (irrlicht_on)
    		{
    			driver->beginScene(true, true, 0);
    			smgr->drawAll();
    			driver->endScene();
    
    			Caption = (int)driver->getFPS();
    		}
    	}
    
    	device->closeDevice();
    	device->drop();
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormMain::Button2Click(TObject *Sender)
    {
    	irrlicht_on = !irrlicht_on;
    }
    

    Leider bleibt damit der CPU-Load und er rechnet scheinbar im Hintergrund weiter. Sobald ich die Animation weiterlaufen lassen will ist die schon weitergelaufen, ich habe lediglich die Darstellung angehalten.

    Hat für so etwas jemand eine Lösung?



  • Mal eine Frage, welche Anwendung hast du vor zu Entwickeln?
    nun keine Animation mehr ?
    also einfaches Bildrendern nach Bedarf?
    Evtl. ist ja Irrlicht dann nicht das richtige für deine Zwecke.



  • So wieder eine "normale" Projekt CPP

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <tchar.h>
    #include "Form_Main.h"
    //---------------------------------------------------------------------------
    USEFORM("Form_Main.cpp", FormMain);
    //---------------------------------------------------------------------------
    WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
    {
    	try
    	{
    		Application->Initialize();
    		Application->MainFormOnTaskBar = true;
    		Application->CreateForm(__classid(TFormMain), &FormMain);
    		FormMain->Show();
    		Application->Run();
    
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	catch (...)
    	{
    		try
    		{
    			throw Exception("");
    		}
    		catch (Exception &exception)
    		{
    			Application->ShowException(&exception);
    		}
    	}
    	return 0;
    }
    //---------------------------------------------------------------------------
    

    und

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Form_Main.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TFormMain *FormMain;
    //---------------------------------------------------------------------------
    __fastcall TFormMain::TFormMain(TComponent* Owner)
    	: TForm(Owner)
    {
    	irrlicht_on=false;
    	HWND hIrrlichtWindow = Panel1->Handle;
    
    	irr::SIrrlichtCreationParameters param;
    	param.WindowId = hIrrlichtWindow;
    	param.DriverType = irr::video::EDT_OPENGL;
    
    	device = irr::createDeviceEx(param);
    	smgr = device->getSceneManager();   // setup a simple 3d scene
    	driver = device->getVideoDriver();
    
    	InitIrrlicht();
    }
    //---------------------------------------------------------------------------
    __fastcall TFormMain::~TFormMain() {
    
    	device->closeDevice();
    	device->drop();
    }
    //---------------------------------------------------------------------------
    void TFormMain::InitIrrlicht() {
    
    	irr::scene::ICameraSceneNode* cam = smgr->addCameraSceneNode();
    	cam->setTarget(irr::core::vector3df(0,0,0));
    
    	irr::scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(irr::core::vector3df(0,10,0), 30.0f);
    	cam->addAnimator(anim);
    	anim->drop();
    
    	irr::scene::ISceneNode* cube = smgr->addCubeSceneNode(25);
    	cube->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    	cube->setMaterialTexture(0, driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\rockwall.bmp"));
    
    	smgr->addSkyBoxSceneNode(
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_up.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_dn.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_lf.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_rt.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_ft.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_bk.jpg"));
    
    }
    //---------------------------------------------------------------------------
    void TFormMain::RunIrrlicht() {
    
    	while (device->run() && irrlicht_on) {
    
    		driver->beginScene(true, true, 0);
    		smgr->drawAll();
    		driver->endScene();
    
    		lblFPS->Caption = (int)driver->getFPS();
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall TFormMain::Button2Click(TObject *Sender)
    {
    	irrlicht_on = !irrlicht_on;
    	if (irrlicht_on) {
    		RunIrrlicht();
    	}
    }
    //---------------------------------------------------------------------------
    


  • Vielen Dank! Klappt super, allerdings ist auch hier das sich die Kamera während der Pause weitergedreht hat. Denn wenn ich die Pause aufhebe, ist die Skybox und die Kamera ganz woanders.

    Liegt vermutlich an createFlyCircleAnimator(), kann man solche Animations-Funktionen nicht auch pausieren?

    Mal eine Frage, welche Anwendung hast du vor zu Entwickeln?

    Ich möchte gern ein kleines Spielchen machen. 4 Gewinnt oder ein Schiebepuzzle. Ich habe nur einen billig PC und wenn ich 3D laufen lasse heult der PC Lüfter hoch das einem die Ohren weh tun und da bei solchen Spielen auf Benutzereingaben gewartet wird brauch man ja nur dann die Szene neu darstellen. So dachte ich mir das zumindest.


Anmelden zum Antworten