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

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

1

11.05.2009, 10:18

Probleme mit Funktionspointern

Hallo,

ich habe ein Problem in der Render und Move Funktion. Diese beiden Methoden werden (wie bei dem Spiel Galactica) als Funktionspointer an die DoMessageLoop der Engine übergeben. Das Problem das ich habe ist, das die Render Methode zwar die Methode SetupCamera aufrufen kann, die Attribute m_vCameraPos kann sie aber nicht beschreiben. Das selbe mit der Variale m_fTime und der Funktion Move. Was muss man beachten um die Attribute einer Klasse aus einer Methode die als Pointer an eine andere Funktion übergeben wurde anzusprechen?
Wenn ich die Funktion SetupCamera innerhalb der Spielklasse aufrufe habe ich keine Probleme.

Als Hinweis: Der Code ist nicht aus dem Buch kopiert, ich habe vielmehr einen an das Buch angelehnten eigenen Code geschrieben um es besser zu verstehen.

Ich hoffe jemand kann mir helfen, danke im vor raus!

Viele Grüße,
MCP

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

11.05.2009, 10:32

Hi und willkommen im Forum!

Ich bin mir nicht ganz sicher, wie deine Funktion aussieht. Bekommt sie als Parameter die Instanz der Klasse übergeben oder nicht?

Wenn ja, kannst du die Methode ganz normal über . oder -> aufrufen, bspw.

C-/C++-Quelltext

1
2
3
4
void testFunction(Class* instance)
{
    instance->otherFunction();
}


Wenn du das Klassenobjekt nicht übergibst gibts keine Möglichkeit an die anderen Funktionen der Klasse zu kommen, weil deine Funktion kein Objekt der Klasse kennt und somit auch keine der Methoden.
Hoffe ich hab dich soweit richtig verstanden.

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

3

11.05.2009, 10:49

Hallo und danke für die schnelle Antwort,

die Klasseinstanz habe ich nicht übergeben.

Der Funktionskopf der DoMessageLoop sieht so aus:

C-/C++-Quelltext

1
FTL_API ftlResult ftlDoMessageLoop(ftlResult (*pMoveProc)(float), ftlResult (*pRenderProc)(float))


Der Aufruf der DoMessageLoop:

C-/C++-Quelltext

1
ftlDoMessageLoop(::Move, ::Render)


Und letztlich die Render Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
ftlResult FTL_Test::Render(float fTime)
{
    ftlDirect3D &D3D = ftlDirect3D::Instance();
...
    D3D->BeginScene();

    m_vCameraPos = ftlVector3(0.0f, 0.0f, -1.0f); //So eine Zuweisung geht auch nicht, dieselbe Anweisung erfolgt auch in der Methode SetupCamera

    SetupCamera();

    D3D->EndScene();
    return FTL_OK;
}


die DoMessageLoop gehört zur Engine, vergleichbar der tbDoMessageLoop in der Tribase.cpp

Der Rest des Codes ist an die CGame Klasse aus dem Spiel Galactica angelehnt. Die Attribute wie m_vCameraPos sind public, der Methodenaufruf von SetupCamera funktioniert ohne Probleme.

Hoffe das ist so etwas besser verständlich.

Viele Grüße,
MCP

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

4

11.05.2009, 11:12

Bin leider gerade nicht zuhause um mal etwas rumzuprobieren. Sind die Methoden Move und Render statisch?
Bei ftlDoMessageLoop(::Move, ::Render) fehlt mir zumindest die Übergabe einer Instanz. Wie genau sieht denn SetupCamera aus?

Vielleicht hat ja noch jemand anders eine Idee, ich seh gerade nicht worans liegen kann, zumal die Zuweisung ja in SetupCamera funktioniert, das macht mich etwas stutzig.

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

5

11.05.2009, 11:27

Deswegen Frage ich ja im Forum, micht macht das ganze auch stutzig...
Im Spiel Galactica geht es auch, also muss ich irgendetwas übersehen haben...
Die Methoden ::Move und ::Render sind ganz normale Methoden:

Das ist die Klassendefinition:

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
class FTL_Test
{
public:
    FTL_Test(void);
    ~FTL_Test(void);
    ftlResult Load();
    ftlResult Unload();
    ftlResult Init();
    ftlResult Exit();
    ftlResult Run();
    ftlResult Move(float);
    ftlResult Render(float);
    ftlResult SetupCamera(void);

    float m_fTime;
    LPDIRECT3DVERTEXBUFFER9 m_oVertexBuffer;
    ftlVector3 m_vCameraPos;
    ftlVector3 m_vCameraLookAt;
    ftlVector3 m_vCameraUp;
    float m_fFOV;

private:
    ftlConfig m_Config;
    
};


Und die gewünschte SetupCamera:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ftlResult FTL_Test::SetupCamera(void)
{
    ftlMatrix mCamera;
    ftlMatrix mProjection;

    m_vCameraPos = ftlVector3(0.0f, 0.0f, -1.0f);

    m_vCameraLookAt = ftlVector3(0.0f, 0.0f, 0.0f);

    m_vCameraUp = ftlVector3(0.0f, 1.0f, 0.0f);

    m_fFOV = 1.22f;

    mCamera = ftlMatrixCamera(m_vCameraPos, m_vCameraLookAt, m_vCameraUp);
    ftlDirect3D::Instance().SetTransform(D3DTS_VIEW, mCamera);

    mProjection = ftlMatrixProjection(m_fFOV, ftlDirect3D::Instance().GetAspect(), 1.0f, 5000.0f);
    ftlDirect3D::Instance().SetTransform(D3DTS_PROJECTION, mProjection);
    
    return FTL_OK;
}


Ich werde mir nochmal das Galactica Projekt genauer anschauen und hoffe das ich etwas finde wo vielleicht eine Referenz etc übergeben wurde... Aber ich meine das es sowas nicht gab. Und friend-Funktionen etc fallen auch weg da sich die Engine ja in einer DLL ohne Wissen über die Exe befindet...

Viele Grüße,
Skalli

MCP

Alter Hase

  • »MCP« ist der Autor dieses Themas

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

6

11.05.2009, 11:47

Ah, ich glaube ich habe das Problem gefunden...
Bei der Kapselung hatte ich mit einem Testprojektglobalen Pointer gearbeitet der eine Klasseinstanz enthält.

C-/C++-Quelltext

1
2
3
4
FTL_Test* g_pFTL_Test = NULL;
...
ftlResult Move(float fTime) { return g_pFTL_Test->Move(fTime); }
ftlResult Render(float fTime) { return g_pFTL_Test->Render(fTime); }


Dieser wurde aber nie initialisiert, da ich die Klasseninstanz Lokal in der WinMain erstellt hatte. Nun habe ich es so geändert das die Klasseninstanz auf dem Heaperzeugt wird und dem Pointer zugewiesen wird. Jetzt läuft es ohne Probleme...

Ein kleines Detail, aber große Auswirkung... Sorry für die Umstände...

Auf das Problem mit der Kapselung hätte ich auf früher kommen können, aber mir fiel eben erst ein danach zu schauen... ^^"

Viele Grüße,
MCP

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

7

11.05.2009, 12:52

Alles klar ;)

Werbeanzeige