JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Enginefrage

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
under_construction
Junior JLI'ler


Alter: 35
Anmeldedatum: 12.11.2002
Beiträge: 52

Medaillen: Keine

BeitragVerfasst am: 30.05.2003, 13:17    Titel: Enginefrage Antworten mit Zitat

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? Question ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 30.05.2003, 13:46    Titel: Re: Enginefrage Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
under_construction
Junior JLI'ler


Alter: 35
Anmeldedatum: 12.11.2002
Beiträge: 52

Medaillen: Keine

BeitragVerfasst am: 30.05.2003, 14:34    Titel: Re: Enginefrage Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 30.05.2003, 15:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
under_construction
Junior JLI'ler


Alter: 35
Anmeldedatum: 12.11.2002
Beiträge: 52

Medaillen: Keine

BeitragVerfasst am: 30.05.2003, 16:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 31.05.2003, 00:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Starwash
Senior JLI'ler


Alter: 39
Anmeldedatum: 22.09.2002
Beiträge: 252
Wohnort: Zossen (bei Berlin)
Medaillen: Keine

BeitragVerfasst am: 31.05.2003, 10:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
under_construction
Junior JLI'ler


Alter: 35
Anmeldedatum: 12.11.2002
Beiträge: 52

Medaillen: Keine

BeitragVerfasst am: 31.05.2003, 10:39    Titel: Antworten mit Zitat

Embarassed
Wenn es einen Preis für Leichtsinnsfehler gäbe, dann wäre ich ungeschlagener Sieger seit Jahren.
Dass ich darauf nicht selbst gekommen bin! Laughing
Ich hab's abgeändert und es funktioniert!

Vielen Dank nochmal!!!
Ciao!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 31.05.2003, 12:24    Titel: Antworten mit Zitat

Ich benutze den Debugger ja kaum aber bei solchen stupiden Fehlern hilft er ungemein. :)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Starwash
Senior JLI'ler


Alter: 39
Anmeldedatum: 22.09.2002
Beiträge: 252
Wohnort: Zossen (bei Berlin)
Medaillen: Keine

BeitragVerfasst am: 31.05.2003, 13:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 31.05.2003, 13:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 31.05.2003, 13:38    Titel: Antworten mit Zitat

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 Wink
<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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum