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 

Draw (Sprite) bringt das ganze Programm durcheinander

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 11:44    Titel: Draw (Sprite) bringt das ganze Programm durcheinander Antworten mit Zitat

Hi,

ich habe wie fallen ein Problem mit der Draw Funktion von LPD3DXSPRITE.

Mein Code sieht folgendermaßen aus:

Code:

//Draws the sprite
void CSprite::Draw(int iX,int iY)
{
   //Sets the postion
   m_vPosition.x = (float)iX + m_vRotationCenter.x;
   m_vPosition.y = (float)iY + m_vRotationCenter.y;

   //Transform matrix
   D3DXMATRIX SpriteMatrix,Translation,Scale,Rotation;

   //Sets the matrix
   D3DXMatrixRotationZ(&Rotation,m_fRotation);
   D3DXMatrixScaling(&Scale,m_vScale.x,m_vScale.y,m_vScale.z);
   D3DXMatrixTranslation(&Translation,m_vPosition.x,m_vPosition.y,m_vPosition.z);

   //Multiplies it
   D3DXMatrixMultiply(&SpriteMatrix,&Rotation,&Scale);
   D3DXMatrixMultiply(&SpriteMatrix,&SpriteMatrix,&Translation);

   //Begins with drawing the sprite
   m_lpSprite->Begin(m_dwFlags);

   //Transforms it
   m_lpSprite->SetTransform(&SpriteMatrix);

   //without an animation
   if(m_bAnimated == false)
   {
      //Draws it without an animation
      m_lpSprite->Draw(m_lpImage,0,&m_vRotationCenter,NULL,D3DCOLOR_ARGB(m_iAlpha,0xff,0xff,0xff));
   }
   else
   {
      //Draws it with an animation
      m_lpSprite->Draw(m_lpImage,&m_Rect,&m_vRotationCenter,NULL,D3DCOLOR_ARGB(m_iAlpha,0xff,0xff,0xff));
   }

   m_lpSprite->End();
}


Wenn ich
Code:

Sprite.Draw(140,50);

DXFont.DrawText("Dragon Studios",280,420,D3DCOLOR_ARGB(iAlphaBuffer,255,0,0));

mache, dann wird die Schrift nur so angezeigt:

Wenn ich aber das hier mache:
Code:

DXFont.DrawText("Dragon Studios",280,420,D3DCOLOR_ARGB(iAlphaBuffer,255,0,0));

Sprite.Draw(140,50);

dann funktioniert es.

Ich dachte es würde vielleicht funktionieren, wenn ich das summer update installiere, jetzt habe ich aber noch zusätzlich das Problem, das der Würfel, den ich in diesem Programm zeichne überhaupt nicht angezeigt wird.

Wenn ich m_lpSprite->Draw auskommentiere funktioniert auch alles.

Ich habe das an 4 anderen pc's getestet, bei denen funktioniert das mit der Schrift einwandfrei, aber der Würfel kommt nicht.

[edit]
Ich habe gerade das bsp Programm von Christian geteste, bei dem geht der Text bei mir auch nicht.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling


Zuletzt bearbeitet von abc_d am 02.06.2004, 15:55, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 01.06.2004, 12:21    Titel: Antworten mit Zitat

Sagt die Debug Runtime irgendwas, was sagt das Reference Device?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 02.06.2004, 16:33    Titel: Antworten mit Zitat

Mit Reference Device zeigt es den Text an. Aber der Würfel wird nur angezeigt, wenn das Sprite nicht gezeichnet wird/wurde.

Beim debuggen bekomme ich auch keinen Fehler.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling


Zuletzt bearbeitet von abc_d am 05.06.2004, 23:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

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

Hat jemand eine Ahnung warum das nicht funktioniert?
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 06.06.2004, 18:03    Titel: Antworten mit Zitat

Das bekommt ich beim debuggen.

Direct3D9: :====> ENTER: DLLMAIN(01753950): Process Attach: 00000c50, tid=00000930
Direct3D9: (WARN) :Executing processor detection code (benign first-chance exception possible)

Direct3D9: (INFO) :MMX detected

Direct3D9: (INFO) :Pentium Pro CPU features (fcomi, cmov) detected

Direct3D9: (INFO) :dwCPUFamily = 6, dwCPUFeatures = 3

Direct3D9: (INFO) :szCPUString = GenuineIntel

Direct3D9: :====> EXIT: DLLMAIN(01753950): Process Attach: 00000c50
Direct3D9: (INFO) :Direct3D9 Debug Runtime selected.
Direct3D9: (INFO) :======================= Hal SWVP device selected

Direct3D9: (INFO) :HalDevice Driver Style 9

Direct3D9: :BackBufferCount not specified, considered default 1
Direct3D9: :DoneExclusiveMode
Direct3D9: (INFO) :Using P3 PSGP

"C:\WINDOWS\system32\usp10.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\hid.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\setupapi.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\oleaut32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
"C:\WINDOWS\system32\ole32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
Direct3D9: (ERROR) :Vertex stride in stream 0 is less than in the declaration

Direct3D9: (ERROR) :DrawPrimitive failed.

Direct3D9: (ERROR) :Vertex stride in stream 0 is less than in the declaration

Direct3D9: (ERROR) :DrawPrimitive failed.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling


Zuletzt bearbeitet von abc_d am 06.06.2004, 18:07, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 06.06.2004, 18:07    Titel: Antworten mit Zitat

Naja, irgendwas ist faul Smile Die Daten, die du mit SetFVF() oder SetVertexDeclaration() bzw. SetStreamSource() setzt passen nicht zusammen. Guck mal, was du für Stride übergibst. Ist das genauso groß wie sizeof(VERTEX_STRUKTUR) ?

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 10.06.2004, 09:11    Titel: Antworten mit Zitat

Ja, sizeof(CustomVertex)

Ich habe jetzt den ganzen Code vom Beispiel kopiert, aber es funktioniert immer noch nicht:

Code:

Init:
   // Zeiger, der auf den Vertex Buffer gesetzt wird   
    BYTE* VertexBufferStart;

    // Vertex Buffer für das Dreieck anlegen
    // die Größe des Vertex Buffer muss mit
    // der Größe der Struktur, in der das Dreieck
    // gespeichert ist, übereinsimmen
    lpD3DDevice->CreateVertexBuffer(sizeof(TriangleVertices),
                                    D3DUSAGE_WRITEONLY,
                                    D3D_CUSTOMVERTEX,
                                    D3DPOOL_MANAGED,
                                    &VB_Triangle,
                                    NULL);

    // Vertex Buffer sperren
    VB_Triangle->Lock(0,0,(void**)&VertexBufferStart,0);

    // Vertices des Dreiecks in den Puffer kopieren
    memcpy(VertexBufferStart,TriangleVertices,sizeof(TriangleVertices));

    // Vertex Buffer wieder freigeben
    VB_Triangle->Unlock();

      // Vertex Buffer für das Dreieck anlegen
    lpD3DDevice->CreateVertexBuffer(sizeof(CubeVertices),
                                    D3DUSAGE_WRITEONLY,
                                    D3D_CUSTOMVERTEX,
                                    D3DPOOL_MANAGED,
                                    &VB_Cube,
                                    NULL);

    // Vertex Buffer sperren
    VB_Cube->Lock(0,0,(void**)&VertexBufferStart,0);

    // Daten des Dreiecks in der Buffer kopieren
    memcpy(VertexBufferStart,CubeVertices,
           sizeof(CubeVertices));

    // Vertex Buffer wieder freigeben
    VB_Cube->Unlock();

    // Die Kamera wird an der Position (0.0f, 0.0f, -10.0f) aufgestellt
    D3DXMATRIX ViewMatrix;
    D3DXMatrixLookAtLH(&ViewMatrix,
                       &D3DXVECTOR3(0.0f, 0.0f,-10.0f),
                       &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
                       &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
   
    lpD3DDevice->SetTransform(D3DTS_VIEW,&ViewMatrix);


    // Sichtkegel definieren
    D3DXMATRIX ProjMatrix;
    D3DXMatrixPerspectiveFovLH(&ProjMatrix,
                               D3DX_PI/4,
                               (float)SCR_WIDTH / (float)SCR_HEIGHT,
                               1.0f,
                               100.0f );

    lpD3DDevice->SetTransform(D3DTS_PROJECTION,&ProjMatrix);

    // Beleuchtung abschalten
    lpD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);

   Sprite.CreateSprite(lpD3DDevice,"test.PNG");

    return TRUE;

Zeichnen:

   //Matrix
   D3DXMATRIX WorldMatrix;
   D3DXMATRIX RotationMatrix;
   D3DXMATRIX TranslationMatrix;

   //Gets the device
   lpD3DDevice = DXGraphics.GetDevice();

   // Deletes the screen D3DCOLOR_XRGB(0,125,232,232)
   DXGraphics.Clear();     
   // Begin with presenting
   DXGraphics.BeginScene();
   
        // Das Vertex-Format festlegen
        lpD3DDevice->SetFVF(D3D_CUSTOMVERTEX);

   // die Quelle für das Dreieck setzen
   lpD3DDevice->SetStreamSource(0,VB_Triangle,0,sizeof(CustomVertex));
           
   // das Dreieck nach links schieben
   D3DXMATRIX TransMatrix;
   D3DXMatrixTranslation(&TransMatrix,-2.0f,0.0f,0.0f);
           
   lpD3DDevice->SetTransform(D3DTS_WORLD,&TransMatrix);
           
   // Das Dreieck ist das erste Element im Puffer
   // und es wird genau ein Objekt gezeichnet
   lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
           
   // die Quelle für den Würfel setzen
   lpD3DDevice->SetStreamSource(0,VB_Cube,0,sizeof(CustomVertex));
           
   // Rotationsmatrix für den Würfel erstellen
   D3DXMatrixRotationX(&RotationMatrix,fCubeRotateX);

   // Translationsmatrix für den Würfel erstellen
   D3DXMatrixTranslation(&TranslationMatrix,0.0f,0.0f,fCubeTranslationZ);

   // Die beiden Matrizen zusammenfassen
   D3DXMatrixMultiply(&WorldMatrix,&RotationMatrix,&TranslationMatrix);
   // und die neue Matrix als Welt-Transformation-
   // Matrix nutzen

   lpD3DDevice->SetTransform(D3DTS_WORLD,&WorldMatrix);
   lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,12);

   lpD3DDevice->SetIndices( 0 );
   lpD3DDevice->SetStreamSource( 0,0, 0,0);

         // Das Vertex-Format festlegen
      lpD3DDevice->SetFVF(D3DFVF_NORMAL);

   Sprite.Draw(100,100);

   // Die Szene ist beendet
   DXGraphics.Present();



Seidem ich vor dem Zeichnen des Sprites SetIndices(),SetStreamSource( 0,0, 0,0) und SetFVF(D3DFVF_NORMAL); mache kommt beim debugen kein Fehler mehr.

Die 3D Objekte werden beim ersten mal gezeichnet, aber sobald ich das Sprite zum erstenmal zeichne werden sie nicht mehr dargestellt.
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 13.06.2004, 15:52    Titel: Antworten mit Zitat

Hat hier noch nie jemand ein Sprite + ein 3D Modell gerendert?
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 13.06.2004, 16:17    Titel: Antworten mit Zitat

Doch Smile Schick doch mal das Projekt mit allem was dazu gehöhrt per mail.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
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