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

03.06.2011, 11:33

DirectX9 CreateVertexBuffer Problem.

Hallo .

Da ich längere Zeit ausgesetzt habe (ungefähr 1 Jahr) und jetzt wieder ein Project erstellen möchte.
Ich bin wahrscheinlich ein wenig eingerostet.

Ich möchte für ein Weltraumgame einen Sternenhimmel erstellen mit Punktvertices.

Meine .exe Datei ist vorkompiliert und ich programmiere das eigentliche Game in einer DLL.

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Diese Dll repräsentiert das eigentliche Spiel
// Dieses wird hier Initialisiert, die Spielnachrichtenschleife wird hier 
// programmiert.

#include "windows.h"
#include "D3D9.h"
#include "DSound.h"
#include "Import.h"
#include "Main.h"
#include "Logbuch.h"
#include "Export.h"
#include "Project.h"


// Die Gameclass
struct Pos
{
    float x,y,z;
};

struct Stars
{
    Pos Vertices;
    DWORD Color;
};

class SpHanse
{
public:
    Stars *Raum1;   // Raum1, weill später vieleicht noch andere Räume hinzukommen.
    DWORD FVF_Stars;
    PDIRECT3DVERTEXBUFFER9 StarsRaum1VertexBuffer;

};

DLL_IMP_EXP void *_3DOT_IniGame(_3DOT_Main *MainCl)
{
    // Für ... muss die jeweilige Class oder struct des Spiels angegeben werden.
     SpHanse *GameClass=new SpHanse;

    // Hier müssen nun die ganzen Initialisierungen für die Class o. Struct
    // vorgenommen werden.
     GameClass->FVF_Stars=D3DFVF_XYZ|D3DFVF_DIFFUSE;
     GameClass->Raum1=new Stars[300];   // 300 Sterne im Raum verteillen.

    // Jetzt werden die Sterne Per Zufall im Raum (Würfel) an den Wänden verteillt.Diese werden dann wenn zufriedenstellend in einer Datei gespeichert 
    // und dann hier nur noch direct in den Vertexbuffer eingelessen.
    // Maße 1000.0f bis -1000.0f
    // Boden:
    _3DOT_InitRandom();

    int z;
    for(z=0;z<50;z++)
    {
        GameClass->Raum1[z].Vertices.x=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.z=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.y=1000.0f;
        GameClass->Raum1[z].Color=D3DCOLOR_XRGB(254,254,254);
    };
    // Wand 1;
    for(z=50;z<100;z++)
    {
        GameClass->Raum1[z].Vertices.x=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.y=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.z=1000.0f;
        GameClass->Raum1[z].Color=D3DCOLOR_XRGB(254,254,254);
    };
    // Wand 2;
    for(z=100;z<150;z++)
    {
        GameClass->Raum1[z].Vertices.z=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.y=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.x=1000.0f;
        GameClass->Raum1[z].Color=D3DCOLOR_XRGB(254,254,254);
    };
    // Decke
    for(z=150;z<200;z++)
    {
        GameClass->Raum1[z].Vertices.x=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.z=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.y=-1000.0f;
        GameClass->Raum1[z].Color=D3DCOLOR_XRGB(254,254,254);
    };
    // Wand 3;
    for(z=200;z<250;z++)
    {
        GameClass->Raum1[z].Vertices.x=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.y=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.z=-1000.0f;
        GameClass->Raum1[z].Color=D3DCOLOR_XRGB(254,254,254);
    };
    // Wand 4;
    for(z=250;z<300;z++)
    {
        GameClass->Raum1[z].Vertices.z=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.y=(float)_3DOT_Random(0,-1000);
        GameClass->Raum1[z].Vertices.x=-1000.0f;
        GameClass->Raum1[z].Color=D3DCOLOR_XRGB(254,254,254);
    };
    _3DOT_LogWr("Koordinatenliste für die Sterne gefüllt.",1);

    Stars *VBufferSpeicher;
    MainCl->pD3DDev->CreateVertexBuffer(300*sizeof(Stars),D3DUSAGE_POINTS,D3DFVF_XYZ|D3DFVF_DIFFUSE,D3DPOOL_DEFAULT,&GameClass->StarsRaum1VertexBuffer,NULL);
    if(GameClass->StarsRaum1VertexBuffer!=D3D_OK)
    {
        _3DOT_LogWr("Vertexbuffer für die Sterne konnte nicht erstellt werden.",1);
        return NULL;
    }
    else
        _3DOT_LogWr("Vertexbuffer für die Sterne erfolgreich erstellt.",1);

    GameClass->StarsRaum1VertexBuffer->Lock(0,0,(void**)VBufferSpeicher,0);
    for(z=0;z<300;z++)
        VBufferSpeicher[z]=GameClass->Raum1[z];
    _3DOT_LogWr("Vertexbuffer erfolgreich gefüllt.",1);

    GameClass->StarsRaum1VertexBuffer->Unlock();
    _3DOT_LogWr("Und entspert.",1);

    // Bei Fehler return NULL;

    return GameClass;
}

DLL_IMP_EXP byte _3DOT_RunEngine(_3DOT_Main* MainCl,void* GameClass,float time,
                                 byte* Gamestatus,unsigned uMsg,WPARAM wParam,LPARAM lParam)
{
    // Funktion für die Nachrichtenbehandlung im Spiel.
    SpHanse *GameCl=(SpHanse*)GameClass;
        
    return 1; // Alles OK:
}

 DLL_IMP_EXP byte _3DOT_deleteGame(void* GameClass)
 {
     // Deinitialisierung bei Beenden des Spiels
    SpHanse *GameCl=(SpHanse*)GameClass;

    GameCl->StarsRaum1VertexBuffer->Release();
    delete GameCl->Raum1;
    delete GameCl;
    
     return 1;
 }


Das Problem ist forlgendes immer wenn ich den Vertexbuffer für die Sterne erstellen will bekomme ich in mein Logbuch
"Vertexbuffer für die Sterne konnte nicht erstellt werden."

Die Direct3D-Device wird in der .exe einwandfrei initialisiert und bei CreateDevice wird auch in den eingestellten Videomod geschaltet aber ich kann in der Device einfach den Vertexbuffer nicht erstellen.

Kann irgendjemand helfen ?

Danke !

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

03.06.2011, 12:32

C-/C++-Quelltext

1
if(GameClass->StarsRaum1VertexBuffer!=D3D_OK)

Das ist Schwachsinn. Wenn du was auf D3D_OK prüfen willst dann den Rückgabewert von CreateVertexBuffer() und nicht den Pointer. D3D_OK ist nämlich 0, d.h. dein if () schlägt genau dann an wenn es funktioniert hat und sonst nicht...

3

03.06.2011, 13:05

Uppps

Als ich diese Zeile geschriebenhabe muss ich wohl einen imTee gehabt haben.

Danke, das dumich auf diesen Schuslichkeitsfehler aufmerksam gemacht hast.

Auf jeden Fall das war das Problem. Jetzt funzt es.

Tschüss. :thumbsup:

Werbeanzeige