Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

31

19.01.2010, 17:18

Und hier mein nächstes Problem, besser Frage:

EEEEEEEEEEEEEEEEEEEDIT: Hat sich erledigt, unten nächstes ;) Problem

wenn ich habe:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class base
{
public:
      virtual bool foo ();
};


class specbase : public base
{
public:
       virtual bool foo ();
};

class derivspecbase : public specbase
{
      bool foo ();  // Wie Schaffe ich es, dass explizit derivspecbase::foo aufgerufen wird ?

};


Das ganze ist wegen den Framelistenern: Ich wollt mir mal einen Allgemeinen Schreiben, der ja von Ogre::FrameListener Erbt. Dann einen Speziellen für die GUI, der ja eigentlich ohne Probleme von derm Allgemeinen erben sollte. Doch er ruft immer allgemein::blablabla statt SpeziellFürGUI::blablabla auf.

Ist es eigentlich überhaupt so möglich, oder sitz ich grade einem Gewaltigen Designfehler auf ?


EDIT: ab hier neues

C-/C++-Quelltext

1
        quit->subscribeEvent (CEGUI::PushButton::EventClicked, CEGUI::Event::Subscriber (&BaseFrameListener::quit, appFrameListener));

Hier bockt er mir rum, dass er keinen überladene Funktion, welche 2 Argumente Akzeptiert finden kann. Dabei hab ich den Code mittlerweile direkt von der OgreWiki.
Kann es sein, dass in dem Tut ne ältere CEGUI::Version verwendet wird ? In der Neusten ist ja Event::Subscriber als Event SubsciberSlot definiert. Kanns vielleicht daran liegen ?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

32

19.01.2010, 18:42

Zitat

// Wie Schaffe ich es, dass explizit derivspecbase::foo aufgerufen wird ?

Wie meinst du das? In deinem Beispiel wird immer dieselbe Funktion aufgerufen, nämlich die von derivspecbase, sofern der dynamsiche Typ derivspecbase ist. (das ist der Sinn von virtuellen Funktionen).

33

19.01.2010, 18:53

Aso, kei wunder, ich hatte noch als typen specbse drinne. Kei wunder. *hand gegen den Kopf schlag*

34

22.01.2010, 18:50

Ich hab mal ne Frage (kann aber auch sein, dass ich einfach was überlesen habe ;) )
Brauch man die media.cfg wirklich ?

Und was muss da rein ?
So wie ich das verstanden habe, muss da jede resource, die verwendet wird, vom Program, ordentlich aufgelistet werden ? Stimmt das so ?

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

35

22.01.2010, 19:55

Ich kann dir die Frage bezüglich der media.cfg nicht genau beantworten, da ich sie noch nicht gebraucht habe. Die Resourcen die du verwendest, also Meshes, Texturen, Shader, Materialien etc. müssen durch ihre Verzeichnisse in der resource.cfg gelistet werden.

Prinzipiell gilt aber, das Ogre keine der *.cfg Dateien vorraussetzt. Du kannst das alles auch im Code angeben. Ich selber habe zwei Projekte am Laufen, wovon das eine auf den Ansatz mit plugins.cfg und resource.cfg aufsetzt, während die ogre.cfg durch den Config-Dialog erzeugt wird ( aber auch der ist optional). Die *.cfg Dateien werden dabei an die Verzeichnisstruktur angepaßt wenn ich mit cmake meine Buildumgebung konfiguriere, so daß ich mein Projekt später ohne Probleme aus der IDE debuggen kann. Das zweite spezifiziert alles im Code, also wo die Rendersystemplugins liegen und wo die Verzeichnisse mit den Resourcen sind. Da entfällt logischerweise das Konfigurieren von Config-Dateien, dafür muß man mehr sorgfalt darauf verwenden, wie man Plugins und Resourcen im Programm lädt.

Thoran
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

36

22.01.2010, 20:43

Das komische ist ja, dass es ohne die media.cfg einen Fehler bei der erstellung des Roots gibt !

Danke schonmal für die Resourcen- Infos.

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

37

22.01.2010, 20:55

Wenn du den Fehler postest und die Codezeile, wo das Root Objekt erstellt wird, will ich dir gern helfen. Wahrscheinlich liegt es eher daran, daß er das plugins.cfg nicht findet. Hast du ins Ogre.log geschaut, was er da sagt?

Mal zum Vergleich mein Code zum Erstellen des Ogre-Rootobjekts. Der Code ist mehr oder weniger aus dem ExampleFramework (ExampleApplication.h), aber das tut bei mir.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       // Provide a nice cross platform solution for locating the  configuration files

        // On windows files are searched for in the current working directory, on OS X however

        // you must provide the full path, the helper function macBundlePath does this for us.

#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
        mResourcePath = macBundlePath() + "/Contents/Resources/";
#else
        mResourcePath = "";
#endif

#ifdef _DEBUG
       pluginsPath = mResourcePath + "plugins_d.cfg";
#else
       pluginsPath = mResourcePath + "plugins.cfg";
#endif


mRoot = new Root(pluginsPath, mResourcePath + "ogre.cfg", mResourcePath + "Ogre.log");


Alternativ dazu der Aufruf ohne plugins.cfg zu verwenden, allerdings muß man dann mehr Aufwand beim LAden der Rendersysteme treiben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
   //Don't load from plugins.cfg, but load manually from bin dir.

#if defined(_WIN32) && defined(_DEBUG)
   m_ogre_root = new Root("");
   m_ogre_root->loadPlugin("Plugin_CgProgramManager_d");
   m_ogre_root->loadPlugin("Plugin_ParticleFX_d");
#else
   m_ogre_root = new Root();
   m_ogre_root->loadPlugin("Plugin_CgProgramManager");
   m_ogre_root->loadPlugin("Plugin_ParticleFX");
#endif

//Methode zum Laden der Renderplugins

void CRenderManager::loadRenderer()
{
#if defined(_WIN32)
    try
    {
#if defined(_DEBUG)
    m_ogre_root->loadPlugin("RenderSystem_GL_d");
    m_ogre_root->loadPlugin("RenderSystem_Direct3D9_d");
#else
    m_ogre_root->loadPlugin("RenderSystem_GL");
    m_ogre_root->loadPlugin("RenderSystem_Direct3D9");
#endif
    }
    catch(...)
    {
        m_logmanager->logMessage("--===== Loading of RendersystemPlugin failed! ====--",LML_CRITICAL);
    }
#else
    try
    {
        m_ogre_root->loadPlugin("/usr/local/lib/OGRE/RenderSystem_GL");
        //mRoot->loadPlugin("/usr/lib64/OGRE/RenderSystem_GL"); //Needed for Matt

    }
    catch(...)
    {
        m_logmanager->logMessage("--===== Loading of RendersystemPlugin failed! ====--",LML_CRITICAL);
    }
#endif
}


Ich hoffe, dass dir das weiterhilft.

Thoran
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

38

22.01.2010, 21:00

Ja, danke.

Hab bisher immer den Code vom Example-Framework verwendet. Das Komische ist ja, dass der Fehler in dem Code auftritt, (vom Example-Framework).

Auf alle Fälle schon mal gut zu wissen, wie man die Plugins ohne die Plugins.cfg läd.

EDIT:
:oops: Hab jetzt, nach dem ichs zum Laufen gebracht hab, nochmal geguckt, und siehe da, jetzt funktionierts auch ohne media.cfg.
Naja, lag wohl doch an was anderem :D

39

24.01.2010, 13:44

So, schon wieder ein nächstes Problem. Diesmal aber nicht so direkt mit OGRE, sondern wieder mit der lieben Vererbung. :(

Mein Problem ist das:
Mein Frame Listener (TestFrameListener) erbt von OGRE::FrameListener und von OIS::KeyListener.

Jetzt hab ich die Methoden frameStarted (...) und frameEnded (...) implementiert.
Mein Problem ist das, dass zwar der Konstruktor von TestFrameListener, und der Destruktor aufgerufen wird, aber der Rest nicht !

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class TestFrameListener : public Ogre::FrameListener, public OIS::KeyListener
{
// blablabla

public:
    TestFrameListener (RenderWindow* win, Camera* cam):
      rendWin (win), camera (cam)
    {
            // blablabla

         }
//

     bool frameEnded (Ogre::FrameEvent& Event)
    {
        // blablabal

    }

    bool keyPressed( const OIS::KeyEvent &arg ) {return true;}
    bool keyReleased( const OIS::KeyEvent &arg ) {return true;}
    
        //

     bool frameStarted (Ogre::FrameEvent& Event)
    {
        // blabla bla

    }


// blablabla

};


Das ganze wird dann so erzeugt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    TestFrameListener* fram;

    // Den Frame Listener erstellen

    void createFrameListener ()
    {
        fram = new TestFrameListener (mWindow, mCamera);
        mRoot->addFrameListener (fram);
}


Ich seh das Problem darin, dass mRoot->addFrameListener ja einen Ogre::FrameListener als Parameter nimmt, und dadurch das frameStarted meines abgeleiteten FrameListeners ja nicht aufgerufen wird. Doch bei dem ExampleFrame Listener, da aus dem Sample-Framework wird das ja auch aufgerufen. :evil: :evil:

Bin für jede Antwort dankbar. :)

Mirlix

Supermoderator

Beiträge: 451

Beruf: Developer Advocate

  • Private Nachricht senden

40

24.01.2010, 14:57

Kann es sein das du das const bei den frame Funktionen vergessen hast?

http://www.ogre3d.org/docs/api/html/classOgre_1_1FrameListener.html

Werbeanzeige