 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 05.02.2004, 22:59 Titel: Sprite auf Surface |
|
|
Hi
ich möchte gerne ein Sprite auf ein Direct3D-Surface kopieren.
Welche Methode muss ich dazu benutzen? Es gibt ja die ColorFill Methode des D3D Devices, aber die füllt einen Bereich ja nur mit einer bestimmten Farbe. Wie kann ich es bewerkstelligen, dass eine Grafik dort draufgezeichnet werden kann?
Das Surface, auf das ich zeichnen möchte, ist meine Spielfläche, und darauf soll halt die Umgebung des Spielers wie Bäume, Steine oder Häuser gezeichnet werden.
Oder sollte ich als Spielfläche doch lieber ein Sprite nehmen? Was denkt ihr?
MFG
Chris _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.02.2004, 10:09 Titel: |
|
|
Entwerder Sprites nutzen oder mit StretchRect.
Christian |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 06.02.2004, 19:08 Titel: |
|
|
Thx (:
Ich werd dann wohl doch ein Sprite benutzen, weil das bei mir besser zu handhaben ist (find ich).
Aber könnte es da nicht ein wenig problematisch werden, wenn ich eine, sagen wir mal eine 4096x3072 große Grafik, bestehend aus zig Sprites im Speicher habe? _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.02.2004, 20:54 Titel: |
|
|
Das kommt drauf an, wo du das Surface erzeugst. Im Hauptspeicher geht es immer, beim AGP/Videospeicher hängt es von der Grafikkarte ab. Ev. macht es Sinn 4 1024x1024 große Teile zu nutzen.
C. |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 06.02.2004, 23:44 Titel: |
|
|
Hm, also ich hab die verschiedenen Varianten von Pool mal ausprobiert.
Dabei funktioniert jedoch nur diese hier:
Code: |
m_lpD3DDevice->CreateOffscreenPlainSurface(
m_fileinfo.Width,
m_fileinfo.Height,
D3DFMT_X8R8G8B8,
D3DPOOL_DEFAULT,
&m_lpSurface,
0);
|
Wenn ich versuche, das Surface mit D3DPOOL_SYSTEMMEM oder MANAGED anzulegen, wird es nicht angezeigt, sondern der ganze Bildschirm, bis auf meine Figur, flimmert, weil dort sich halt anscheinend nichts befindet.  _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 06.02.2004, 23:50 Titel: |
|
|
Ja, denn :"IDirect3DDevice9::StretchRect requires that both the source and destination surfaces must be D3DPOOL_DEFAULT surfaces."
Wenn es von der Größe her geht, ist das wolh die beste Lösung, ansonsten Sprites (da sollte die Textur überall sein dürfen). Sonst kannst du noch selber kopieren, was aber mituner langsam sein wird.
Christian |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 07.02.2004, 00:59 Titel: |
|
|
Hm, ich hab das jetzt folgendermaßen geregelt. Weiss net, obs die beste Lösung ist, aber so funktioniert es im Prinzip:
Ich hab CDirect3D um die Methode DrawOnSurface() ergänzt:
Code: |
void CDirect3D::DrawOnSurface(char* filename, RECT &destRect)
{
D3DXLoadSurfaceFromFile(m_lpSurface,0, &destRect,filename, 0,D3DX_FILTER_NONE,0,NULL);
m_lpD3DDevice->StretchRect(m_lpSurface,
0,
m_lpBackBuffer,
&destRect,
D3DTEXF_NONE);
}
|
Dazu noch die Methode DrawSurface(), die m_lpSurface ausgibt:
Code: |
void CDirect3D::DrawOnSurface(char* filename, RECT &destRect)
{
D3DXLoadSurfaceFromFile(m_lpSurface,0, &destRect,filename, 0,D3DX_FILTER_NONE,0,NULL);
m_lpD3DDevice->StretchRect(m_lpSurface,
0,
m_lpBackBuffer,
&destRect,
D3DTEXF_NONE);
}
|
So füll ich das Surface komplett mit einer Grasgrafik (mapX ist die Breite des Surface und mapY die Höhe, hier wären das 2048 und 1600):
Code: |
// Textur auf Surface zeichnen
RECT rect = { 0, 0, 400, 400 }; // 400 ist Breite bzw. Höhe der Textur
while(rect.left < mapX)
{
while(rect.top < mapY)
{
Direct3D.DrawOnSurface("Gras.png", rect);
rect.top += 400;
rect.bottom += 400;
}
rect.top = 0;
rect.bottom = 400;
rect.left += 400;
rect.right += 400;
}
|
Bleibt zwar ganz rechts am Rand immer ein Stückchen, das nicht von der Grafik bedeckt wird, aber mir gings erst mal nur ums Prinzip. _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 08.02.2004, 14:30 Titel: |
|
|
Eine Frage hätt ich noch.
Ich habe jetzt mein Hintergrundsurface stehen und würde da nun gern ein Sprite draufzeichnen, was beim Scrollen dann auch sich dementsprechend aus dem Bildschirm bewegt. Momentan verhalten sich die Sprites bei mir so, dass sie immer an derselben Stelle des Bildschirms verweilen, auch wenn gescrollt wird.
Kann man das noch anders regeln, als bei jedem Scrollschritt den Positionswert jedes einzelnen Sprites dementsprechend erhöht bzw. erniedrigt und neuzeichnet? Mir scheint nämlich, dass diese Methode recht langsam ist, da eine Liste aller Sprites durchlaufen und von jedem die Position verändert werden muss, und das bei jedem Scrolling in eine beliebige Richtung.
MFG
Chris _________________ Schau mir in die Augen, Kleines. |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 10.02.2004, 19:29 Titel: |
|
|
Du könntest beim Rendern deiner Hintergrundsprites der Position einen weiteren Wert anhängen der den Scrollwert angibt.
Code: | ...->Draw(...->Position+ScrollWert); |
Und wenn du scrollen möchtest änderst du einfach den Scrollwert.
nach Rechts zum Beispiel:
Code: | ScrollWert.x+=0.5f; |
_________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 10.02.2004, 20:40 Titel: |
|
|
Zitat: | Kann man das noch anders regeln, als bei jedem Scrollschritt den Positionswert jedes einzelnen Sprites dementsprechend erhöht bzw. erniedrigt und neuzeichnet? Mir scheint nämlich, dass diese Methode recht langsam ist, da eine Liste aller Sprites durchlaufen und von jedem die Position verändert werden muss, und das bei jedem Scrolling in eine beliebige Richtung. |
Anders geht es nicht, wenn du nicht gerade sehr viele Sprites hast (> 1000) sollte die Zeit, die für das updaten der Position drauf geht im Gegensatz zum Blitten (reden wir gar nicht erst vom Warten auf den V-Sync) vernachlässigbar sein.
C. |
|
Nach oben |
|
 |
Zyrian Super JLI'ler

Anmeldedatum: 30.08.2003 Beiträge: 321 Wohnort: Essen Medaillen: Keine
|
Verfasst am: 10.02.2004, 22:24 Titel: |
|
|
Jo danke für die Antworten (:
Ich habs jetzt hingekriegt. Wenn die Berechnung der Positionen einer Vielzahl von Sprites tatsächlich nicht so sehr auf die Performance geht, dann ist das ja alles kein Problem
MFG
Chris _________________ Schau mir in die Augen, Kleines. |
|
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
|