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

1

21.01.2010, 15:25

Problem mit Funktionszeiger als Konstruktor-Parameter

Guten Tag zusammen,

ich steh im Moment vor einem wahrscheinlich eher kleinen Problem, bei dem ich eure Hilfe bräuchte.

Als erste größere Übung mit DirectX programmiere ich derzeit einen Snake-Klon in 2d.
In meinem Projekt gibt es eine Klasse CLevel, die unter anderem ein bool-Array in der Größe des Spielfelds besitzt, in dem gespeichert ist, ob ein Pixel begehbar ist oder nicht. Dazu gibt es eine Funktion bool CheckCollision(D3DXVECTOR3), die den entsprechenden Wert des Feldes zurückgibt.

Ich möchte mehr Objekte als nur Zahlen im Spielfeld haben und habe dazu die Klasse CObjectManager geschrieben, die diese Objekte verwaltet. Da die Objekte allerdings ja zum Level dazugehören, wollte ich den ObjectManager als Member von CLevel integrieren.
ObjectManager soll aber testen können, an welchen Orten ein Objekt überhaupt sein darf und dazu auf CLevel::CheckCollision zugreifen können. Um das zu realisieren, ist mir kein besserer Weg eingefallen, als dem Konstruktor von CObjectManager ein Zeiger auf die Funktion zu übergeben.

Ich scheitere dabei allerdings an der Syntax (oder kann mein Gedankengang überhaupt nicht funktionieren?):

C-/C++-Quelltext

1
1>d:\visual studio 2008\projects\snake2d\snake2d\level.cpp(31) : error C2664: 'CObjectManager::CObjectManager(LPDIRECT3D9,LPDIRECT3DDEVICE9,bool (__cdecl *)(D3DXVECTOR3))': Konvertierung des Parameters 3 von 'bool (__thiscall CLevel::* )(D3DXVECTOR3)' in 'bool (__cdecl *)(D3DXVECTOR3)' nicht möglich


Hier die entsprechenden Code-Ausschnitte:

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
class CObjectManager; //Forward-Deklaration


class CLevel
{
private:
    CObjectManager      *pObjectManager; // Zeiger auf ObjectManager für die Verwaltung der Objekte

    bool    CollisionArray[600][1024]; //das Array, das die Positionen der nicht begehbaren Pixel speichert


public:
    bool    CheckCollision(D3DXVECTOR3 Position); //diese Funktion soll als Zeiger an CObjectManager übergeben werden

};

class CObjectManager
{
private:
    bool           (*CheckCollision)(D3DXVECTOR3 Position); //Hier soll der Funktionszeiger gespeichert werden

 
public: 
        
                CObjectManager(LPDIRECT3D9 lpD3DPointer, LPDIRECT3DDEVICE9 lpD3DDevicePointer, bool (*CheckCollisionPointer)(D3DXVECTOR3 SnakePos)); //die ersten beiden Parameter sind für DX, der dritte soll den Zeiger aufnehmen

};

CLevel::CLevel() //Der Konstruktor von CLevel, der eine neue Instanz von CObjectManager erstellen und dabei den Funktionszeiger übergeben soll

{
    pObjectManager = new CObjectManager(lpD3D, lpD3DDevice, &CLevel::CheckCollision); //und in dieser Zeile wird die oben eingefügte Fehlermeldung ausgegeben

}


Ich hoffe, ich konnte mein Problem einigermaßen darlegen und die Quelltexte reichen aus.
Vielen Dank im Voraus für die Hilfe!
PPretzel

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

21.01.2010, 15:30

Übliches Problem bei Funktionszeiger. Lies am besten mal das Tutorial hier druch:
http://www.newty.de/fpt/index.html

Ein Zeiger auf eine freie Funktion hat nicht die gleiche Syntax, wie die auf eine Memberfunktion (wird dir klar werden, wenn du mal drüber nachdenkst).