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

07.06.2011, 14:18

Problem mit DrawPrimitive

Wie in meiner Anfrage weiter unten versuche ich einen Sternenhintergrund auf der Basis von POINTVERTICES
aufzubauen.
Jetzt hängeich seit Tagen mit DrawPrimitive herum.
Bis dahin sind alle Werte OK.
Nur DrawPrimitive kann nicht erfolgreich ausgeführt werden.

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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
// 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 "Objects.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 Space
{
public:
    Stars *Raum1;   // Raum1, weill später vieleicht noch andere Räume hinzukommen.
    DWORD FVF_Stars;
    _3DOT_Matrix ProjMatr;
    PDIRECT3DVERTEXBUFFER9 StarsRaum1VertexBuffer;

};

// Projectinterne Prototypen

byte DrawStars(_3DOT_Main*,SpHanse*),DrawMist(_3DOT_Main*,Space*);

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

    // 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=0.1f;
        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=0.1f;
        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=0.1f;
        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=-0.1f;
        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=-0.1f;
        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=-0.1f;
        GameClass->Raum1[z].Color=D3DCOLOR_XRGB(254,254,254);
    };
    for(z=0;z<300;z++)
    {
        if(GameClass->Raum1[z].Vertices.x>1.0f) GameClass->Raum1[z].Vertices.x=(GameClass->Raum1[z].Vertices.x/1000);
        if(GameClass->Raum1[z].Vertices.y>1.0f) GameClass->Raum1[z].Vertices.y=(GameClass->Raum1[z].Vertices.y/1000);
        if(GameClass->Raum1[z].Vertices.z>1.0f) GameClass->Raum1[z].Vertices.z=(GameClass->Raum1[z].Vertices.z/1000);
    }

    _3DOT_LogWr("Koordinatenliste für die Sterne gefüllt.",1);

    Stars *VBufferSpeicher;
    if(MainCl->pD3DDev->CreateVertexBuffer(300*sizeof(Stars),0,GameClass->FVF_Stars,D3DPOOL_DEFAULT,&GameClass->StarsRaum1VertexBuffer,NULL)!=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);
    _3DOT_LogWr("Vertexbuffer erfolgreich gespert,",1);
    for(z=0;z<300;z++)
        VBufferSpeicher[z]=GameClass->Raum1[z];
    _3DOT_LogWr("gefüllt.",1);

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

    // Allgemeine Einstellungen für die Grafiausgabe.

    // Als allererstes die Projectionsmatrix setzen.
    _3DOT_MatrixProjection(&GameClass->ProjMatr,180.0f,MainCl->VModSel->D_Mode.Width/MainCl->VModSel->D_Mode.Height,20.0f,2000.0f);
    MainCl->pD3DDev->SetTransform(D3DTS_PROJECTION,(D3DMATRIX*)&GameClass->ProjMatr);
    _3DOT_LogWr("Projectionsmatrix eigestellt.",1);

    // Bei Fehler return NULL;

    return GameClass;
}

byte DrawStars(_3DOT_Main *MainCl,Space *GameCl)
{
    MainCl->pD3DDev->SetFVF(GameCl->FVF_Stars);
    MainCl->pD3DDev->SetRenderState(D3DRS_LIGHTING,TRUE);   // Beleuchtung auf Pixelfarbe stellen
    _3DOT_LogWr("Parameter für Ausgabe der Sterne eingestellt.",1);

    //  Hier werden dann später die Transformationsmatrizen gesetzt.

    // Nun der Zeichenvorgang.
    if(MainCl->pD3DDev->SetStreamSource(0,GameCl->StarsRaum1VertexBuffer,0,sizeof(Stars))!=D3D_OK)
    {
        _3DOT_LogWr("StreamSource für die Sterne konnte nicht gesetzt werden.",1);
        return 0;
    }
    else
        _3DOT_LogWr("StreamSource für die Sterne gesetzt.",1);

    _3DOT_Vector3 TransformVector;
    _3DOT_Matrix TransformMatrix;

    TransformVector.x=0.0f;
    TransformVector.y=0.0f;
    TransformVector.z=0.0f;

    _3DOT_MatrixTransl(&TransformMatrix,&TransformVector);

    if(MainCl->pD3DDev->SetTransform(D3DTS_WORLD,(D3DMATRIX*)&TransformMatrix)!=D3D_OK)
    {
        _3DOT_LogWr("Transformation für die Sterne nicht erfolgreich.",1);

        return 0;
    }
    else
        _3DOT_LogWr("Transformation für die Sterne erfolgreich.",1);

    if(MainCl->pD3DDev->DrawPrimitive(D3DPT_POINTLIST,0,300)!=D3D_OK)
    {
        _3DOT_LogWr("Zeichenvorgang für die Sterne nicht erfolgreich.",1);
        return 0;
    }
    else
        _3DOT_LogWr("Zeichenvorgang für die Sterne erfolgreich.",1);

    // Referenzzähler zurücksetzen.

    return 1;
}

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.
    Space *GameCl=(Space*)GameClass;

    // Grafikkartenspeicher frei machen.
    if(MainCl->pD3DDev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1,0)!=D3D_OK)
    {
        _3DOT_LogWr("Grafikkartenspeicher kann nicht geleert werde.",1);
        return 0;
    }
    else
        _3DOT_LogWr("Grafikkartenspeicher erfolgreich geleert.",1);

    if(!DrawStars(MainCl,GameCl))
    {
        _3DOT_LogWr("DrawStars nicht erfolgreich.",1);
        return 0;
    }
    else
        _3DOT_LogWr("DrawStars erfolgreich ausgeführt.",1);

    // Bildschirmausgabe.
    MainCl->pD3DDev->Present(NULL,NULL,NULL,NULL);

    return 1; // Alles OK:
}

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

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


Bin dankbar für jede Hilfe.

Habe mit POINTLIST noch nie etwas gemacht.

Danke !

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

07.06.2011, 14:31

Hi Andi,
hast du denn schonmal deinen Debugger konsultiert? Sieht mir nicht danach aus. Ich hab auch ehrlich gesagt grad keine Zeit/Lust den ganzen Code zu durchforsten, woran es liegen könnte.

Wenn dir der Debugger nichts sagt(oder du es nich verstehst) können wir dir viel unkomplizierter helfen.
WIP Website: kevinheese.de

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

07.06.2011, 15:23

Du schaltest Beleuchtung ein aber deine Vertices haben keine Normalen.

4

07.06.2011, 15:39

Habe HRESULT Code ermittelt.

Habe Beleuchtung ausgeschaltet aber immer noch kein Erfolg.

Ich habe jetzt mal über HRESULT ein paar Angaben über den Fehler geholt.

HRESULT: 0x8876086c (2289436780)
Name: D3DERR_INVALIDCALL
Description: Invalid call
Severity code: Failed
Facility Code: Unknown (2166)
Error Code: 0x086c (2156)

P.S. Kann mir jemand sagen, wie ich den DirectX9 Debuger im VisualStudio2005 einstellen kann ?

Danke !

Werbeanzeige