Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
under_construction Junior JLI'ler
Alter: 36 Anmeldedatum: 12.11.2002 Beiträge: 52
Medaillen: Keine
|
Verfasst am: 30.05.2003, 13:17 Titel: Enginefrage |
|
|
Hi!
Also ich hab gerade angefangen eine 3DEngine zu coden und hab nun folgendes Problem:
Ich hab die Quellcodes aus dem Buch genommen und so meinen Vertexbuffer mit einem Array von 3 CustomVertices angelegt. Dann hab ich versucht das irgendwie dynamisch mit new und delete [] zu machen
aber das hat komischerweise nicht gefunzt: Code: | CutsomVertex *T=new CustomVertex[3] ... delete [] *T |
Wie kann ich den Code abändern, so dass ich beliebig viele Vertices Initialisieren und rendern kann? ? |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.05.2003, 13:46 Titel: Re: Enginefrage |
|
|
Code: | CutsomVertex *T=new CustomVertex[3] ... delete [] T; |
Es muss delete [] T; heissen. Außerdem kannst du doch sagen:
Code: |
int x = was_auch_immer;
CutsomVertex *T=new CustomVertex[x] ... delete [] T; |
Christian |
|
Nach oben |
|
 |
under_construction Junior JLI'ler
Alter: 36 Anmeldedatum: 12.11.2002 Beiträge: 52
Medaillen: Keine
|
Verfasst am: 30.05.2003, 14:34 Titel: Re: Enginefrage |
|
|
Ja klar. Bei mir sieht das dann in etwa so aus:
Code: |
class C3DInit
{
...
CustomVertex *T;
...
}
BOOL C3DInit::InitScene(CustomVertex VT[],int anzVert)
{
T = new CustomVertex[anzVert];
/* ... Kopiere Vertices vom einen ins andere Array ...*/
// Zeiger, der auf den Vertex Buffer gesetzt wird
BYTE* VertexBufferStart;
// Vertexpuffer für das Dreieck anlegen - die Größe
// des Vertex Buffers entspricht der Größe der
// Struktur, in der das Dreiecks gespeichert ist
lpD3DDevice->CreateVertexBuffer(
sizeof(T),
D3DUSAGE_WRITEONLY,
D3D_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&VB_Triangle);
// Vertex Buffer sperren
VB_Triangle->Lock(0,0,&VertexBufferStart,0);
// Daten des Dreiecks in der Buffer kopieren
memcpy(VertexBufferStart,T,
sizeof(T));
// Vertex Buffer wieder freigeben
VB_Triangle->Unlock();
// Einen Vertex Shader festlegen
lpD3DDevice->SetVertexShader(D3D_CUSTOMVERTEX);
return TRUE;
}
C3DInit::~C3DInit()
{
...
delete [] T;
...
}
|
Aber das zeigt keinen Fehler an, startet, zeigt ein schwarzes Bild und geht sofort wieder aus.
Woran kann das liegen??? |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 30.05.2003, 15:13 Titel: |
|
|
Hallo,
sizeof(T) ist falsch, da das 4 ist. Du fragst in diesem Fall nach der Größe des Zeigers T, das ist 4 bytes. Du musst aber sizeof(CustomVertex)*Anzahl_Vertices übergeben.
C. |
|
Nach oben |
|
 |
under_construction Junior JLI'ler
Alter: 36 Anmeldedatum: 12.11.2002 Beiträge: 52
Medaillen: Keine
|
Verfasst am: 30.05.2003, 16:01 Titel: |
|
|
Also, ich hab meine Funktion in etwa auf folgendes umgeändert:
Code: |
BOOL C3DInit::InitScene(CustomVertex VT[],int anzVert)
{
T = new CustomVertex[anzVert];
int a=anzVert-1;
while(a>=0)
{
T[a].color=VT[a].color;
T[a].x=VT[a].x;
T[a].y=VT[a].y;
T[a].z=VT[a].z;
T[a].rhw=VT[a].rhw;
}
// Zeiger, der auf den Vertex Buffer gesetzt wird
BYTE* VertexBufferStart;
// Vertexpuffer für das Dreieck anlegen - die Größe
// des Vertex Buffers entspricht der Größe der
// Struktur, in der das Dreiecks gespeichert ist
lpD3DDevice->CreateVertexBuffer(
sizeof(CustomVertex)*anzVert ,
D3DUSAGE_WRITEONLY,
D3D_CUSTOMVERTEX,
D3DPOOL_MANAGED,
&VB_Triangle);
// Vertex Buffer sperren
VB_Triangle->Lock(0,0,&VertexBufferStart,0);
// Daten des Dreiecks in der Buffer kopieren
memcpy(VertexBufferStart,T,
sizeof(CustomVertex)*anzVert);
// Vertex Buffer wieder freigeben
VB_Triangle->Unlock();
// Einen Vertex Shader festlegen
lpD3DDevice->SetVertexShader(D3D_CUSTOMVERTEX);
return TRUE;
}
|
Wenn ich es compiliere und ausführe erscheint ein schwarzer Bildschirm, dann ein weißer (sollte eigentlich blau sein) und dann hängt sich der Computer auf.
Ciao und schonmal thx im voraus! |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 31.05.2003, 00:39 Titel: |
|
|
Hallo,
bist du sicher, dass sich der Computer aufhängt? Diese Schleife
endet zumindest nie. a ist immer >= 0, zumindest solange anzVert-1 > 0 ist.
while(a>=0)
{
T[a].color=VT[a].color;
T[a].x=VT[a].x;
T[a].y=VT[a].y;
T[a].z=VT[a].z;
T[a].rhw=VT[a].rhw;
}
C. |
|
Nach oben |
|
 |
Starwash Senior JLI'ler
Alter: 40 Anmeldedatum: 22.09.2002 Beiträge: 252 Wohnort: Zossen (bei Berlin) Medaillen: Keine
|
Verfasst am: 31.05.2003, 10:19 Titel: |
|
|
Hi,
du willst doch das komplette Array durchlaufen, oder? Dann nutze dafür doch eine Zählschleife (For) oder ändere deine Bedinungsschleife (while) so ab, dass sie auch als Zählschleife fungiert.
Code: | for(a=0;a<anzVert;a++)
bla[a].color=x[a].clr; //blablabla |
Gruss Tarek |
|
Nach oben |
|
 |
under_construction Junior JLI'ler
Alter: 36 Anmeldedatum: 12.11.2002 Beiträge: 52
Medaillen: Keine
|
Verfasst am: 31.05.2003, 10:39 Titel: |
|
|
Wenn es einen Preis für Leichtsinnsfehler gäbe, dann wäre ich ungeschlagener Sieger seit Jahren.
Dass ich darauf nicht selbst gekommen bin!
Ich hab's abgeändert und es funktioniert!
Vielen Dank nochmal!!!
Ciao! |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 31.05.2003, 12:24 Titel: |
|
|
Ich benutze den Debugger ja kaum aber bei solchen stupiden Fehlern hilft er ungemein. :) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
Starwash Senior JLI'ler
Alter: 40 Anmeldedatum: 22.09.2002 Beiträge: 252 Wohnort: Zossen (bei Berlin) Medaillen: Keine
|
Verfasst am: 31.05.2003, 13:12 Titel: |
|
|
Hi,
ich debugge sehr oft und man findet verdammt viele Fehler auf diese Weise. Bspw. wenn eine math. Formel falsch hergeleitet wurde und falsche Werte liefert. Oder man erhält die Zeile in der bspw. probiert wird einen Null-Pointer zu dereferenzieren und und und...
Der Debugger ist meiner Meinung nach ein echt geniale Erfindung, welche ich auch gerne nutze, sofern mein Programm nicht so funktioniert wie es soll.
Gruss Tarek |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 31.05.2003, 13:22 Titel: |
|
|
Das mit den Mathe Formeln ist bei mir fast nie ein Problem. Bevor ich sie einsetze rechne ich vorher auf Papier was durch und beim Austesten im Programm merkt man ja auch, wenn was nicht stimmt. Das mit den Zeigern stimmt schon aber wenn man sowas öfters gesehen hat, weiß man was passiert, wenn man mit ungültigen Zeigern arbeitet und man sieht ja, wo das Programm abstürzt. Daraus kann man dann Rückschlüsse ziehen, welcher Zeiger ungültig sein muss. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 31.05.2003, 13:38 Titel: |
|
|
Ich schreib mir manchmal einfach ne kleine Konsolenanwendung, um eine einzige Funktion zu testen. Ich hab z.B. für die Kistenklasse(Klasse für Verschieben, setzen und nehmen von Gegenständen) auch erst ne Konsolenanwendung gemacht. Die sind einfacher zu debuggen
<edit>
und wenns dann funzt, übertrag ichs aufs eigentliche Spiel/Programm.
</edit> _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
|