|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 02.09.2004, 21:29 Titel: Surfaces anlegen |
|
|
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 |
|
|
MATTT Junior JLI'ler
Anmeldedatum: 18.06.2003 Beiträge: 59
Medaillen: Keine
|
Verfasst am: 03.09.2004, 09:42 Titel: |
|
|
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 |
|
|
DarK Super JLI'ler
Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 03.09.2004, 09:48 Titel: |
|
|
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 |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 03.09.2004, 14:00 Titel: |
|
|
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 |
|
|
nerem JLI'ler
Alter: 36 Anmeldedatum: 21.09.2003 Beiträge: 169 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 04.09.2004, 13:49 Titel: |
|
|
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 |
|
|
nerem JLI'ler
Alter: 36 Anmeldedatum: 21.09.2003 Beiträge: 169 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 11.09.2004, 09:40 Titel: |
|
|
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 _________________ The killer in me is the killer in you... |
|
Nach oben |
|
|
|
|
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
|