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