JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=80b070707a218a4f826b357fa5d947b2Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Surfaces anlegen

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


Alter: 36
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 02.09.2004, 21:29    Titel: Surfaces anlegen Antworten mit Zitat

Ich schreibe immer noch an meiner D3D Class und möchte, dass man unendlich Surfaces anlegen kann!
Dazu dachte ich, dass ich einfach ein
LPDIRECT3DSURFACE9 TestSurface;
erstelle und dies an die Funktion der D3DClass übergebe und diese damit arbeitet!
allerdings werden die Surfaces nicht angezeigt.
Hier der Code:

Code:

// CREATE SURFACE
void CDirect3D::CreateSurface(int x, int y, LPDIRECT3DSURFACE9 Surface)
{
   // x und y Wert ergeben in RECT r1 Breite und Höhe
   RECT r1 = { 0, 0, x, y };

   m_lpD3DDevice->CreateOffscreenPlainSurface(
                               x,
                               y,
                               D3DFMT_A8R8G8B8,
                               D3DPOOL_DEFAULT,
                               &Surface,
                               0);

   m_lpD3DDevice->ColorFill(Surface,&r1,0xF0FF0000);


}



Dann hab ich noch ne Funktion, die Surfaces in Bereiche aufteilt und diese mit versch. Farben füllt:




Code:

// SURFACE COLORFILL
void CDirect3D::SurfaceColorFill(SurfaceRect SR[], int anzahl, LPDIRECT3DSURFACE9 Surface)
{
   for(int i=0;i<anzahl;i++)
   {
      RECT r = {SR[i].x, SR[i].y, SR[i].x2, SR[i].y2 };
      m_lpD3DDevice->ColorFill(Surface,&r,SR[i].Color);
   }
}


Das ist die Struktur SurfaceRect:

Code:

// Struktur zum unterteilen der Surfaces in verschiedene Bereiche
struct SurfaceRect
{
     int x;
     int y;
     int x2;
     int y2;
     D3DCOLOR Color;
};



Und das ist in der main.cpp:

Code:

CDirect3D Direct3D;
LPDIRECT3DSURFACE9 TestSurface = NULL;

...

   case WM_PAINT:   
            // RectStrukt Element für die Unterteilung des Surfaces
            SurfaceRect SR[1];
            
            // Surfaceteile definieren
            SR[0].x = 0;
            SR[0].y = 0;
            SR[0].x2 = 100;
            SR[0].y2 = 100;
            SR[0].Color = D3DCOLOR_XRGB(0xFF,0xAA,0);
               
            // Szene beginnen
            Direct3D.BeginScene();
               // Surface anlegen
               Direct3D.CreateSurface(1024, 100, TestSurface);
               // Surface mit den definierten SurfaceRect Werten unterteilen und füllen
               Direct3D.SurfaceColorFill(SR, 1, TestSurface);
               // Surface darstellen
               Direct3D.DrawSurface(Surface, TestSurface);
               // Text ausgeben
               Direct3D.WriteText("TEST Class CDirect3D", 490, 350, D3DCOLOR_XRGB(0xFF,0xAA,0));
            
               // Szene beenden
            Direct3D.EndScene();
         break;



Und das Surface wird nicht angezeigt!
Ich glaube es hängt irgendwie damit zusammen, dass wenn ich den LPDIRECT3DSURFACE9 übergebe, dass dort nicht die Adresse gespeichert wird, aber ich weis es nicht!
D3D wird übrigens richtig intialisiert. Das Text ausgeben funzelt!

Danke für eure Hilfe,

FeliX
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MATTT
Junior JLI'ler



Anmeldedatum: 18.06.2003
Beiträge: 59

Medaillen: Keine

BeitragVerfasst am: 03.09.2004, 09:42    Titel: Antworten mit Zitat

Kann es sein, dass es daran liegt, dass du das Surface andauert neu erzeugst?

Oder wird WM_PAINT nur am Anfang einmal gesendet?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 03.09.2004, 09:48    Titel: Antworten mit Zitat

WM_PAINT wird nur einmal beim Fensteraufruf ausgeführt...
_________________
"Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."

"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."

"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 03.09.2004, 14:00    Titel: Antworten mit Zitat

Und das ist zuviel.

CreateSurface() sollte eigentlich nur aufgerufen wenn das Device neu ist oder resetet worden war (was bei WM_PAINT nicht der Fall ist.)
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nerem
JLI'ler


Alter: 36
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 04.09.2004, 13:49    Titel: Antworten mit Zitat

Ursprünglich hatte ich die Funktion, dass man nur 1 Surface anlegen konnte und das hat funtkionier!
Jetzt möchte ich einfach nur die Möglichkeit haben, unendlich viele Anzulegen!
Also hab ich gedacht ich lege einfach für jedes Surface eine Variable an und übergebe diese den entsprechenden Funktionen!
Das klappt aber net!
WM_PAINT wird nur 1mal aufgerufen!
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nerem
JLI'ler


Alter: 36
Anmeldedatum: 21.09.2003
Beiträge: 169
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 11.09.2004, 09:40    Titel: Antworten mit Zitat

OK, an sich war es wirklich einfach! Ich habs jetzt:
Die Funktion zum Anlegen des surfaces muss den Zeiger natürlich auch zurückgeben:

Code:

LPDIRECT3DSURFACE9 CDirect3D::CreateSurface(LPDIRECT3DSURFACE9 Surface, RECT SurfaceRect)
{
         // Surface anlegen
         //        ...

         return Surface;
}



und das ganze muss natürlich so aufgerufen werden:
Code:

LPDIRECT3DSURFACE9 TestSurface = NULL;

TestSurface = Direct3D.CreateSurface(TestSurface, SurfaceRect);



Eigentlich ganz einfach!
Trotzdem danke für eure Hilfe!
Hätte aber auch gleich drauf kommen müssen Rolling Eyes
_________________
The killer in me is the killer in you...
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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