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 

Sprite auf Surface

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



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 05.02.2004, 22:59    Titel: Sprite auf Surface Antworten mit Zitat

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
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.02.2004, 10:09    Titel: Antworten mit Zitat

Entwerder Sprites nutzen oder mit StretchRect.

Christian
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 06.02.2004, 19:08    Titel: Antworten mit Zitat

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
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.02.2004, 20:54    Titel: Antworten mit Zitat

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



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 06.02.2004, 23:44    Titel: Antworten mit Zitat

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. Confused
_________________
Schau mir in die Augen, Kleines.
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.02.2004, 23:50    Titel: Antworten mit Zitat

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



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 07.02.2004, 00:59    Titel: Antworten mit Zitat

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



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 08.02.2004, 14:30    Titel: Antworten mit Zitat

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



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 10.02.2004, 18:46    Titel: Antworten mit Zitat

*push*
_________________
Schau mir in die Augen, Kleines.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 10.02.2004, 19:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 10.02.2004, 20:40    Titel: Antworten mit Zitat

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



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 10.02.2004, 22:24    Titel: Antworten mit Zitat

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 Wink


MFG
Chris
_________________
Schau mir in die Augen, Kleines.
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