JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Sprite für Pixelgenaue Kollisionserkennung auf Surface blitt

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


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.03.2004, 19:53    Titel: Sprite für Pixelgenaue Kollisionserkennung auf Surface blitt Antworten mit Zitat

Ich programmiere gerade an der Pixelgenauen Kollisionserkennung.

Die Funktion soll aus 2 Oberflächen und der relativen Position der Oberflächen eine neue erstellen, die erse Oberfläche in die neue kpieren, udn beim kopieren der zweiten Oberfläche testen, ob Pixel von der ersten Oberfläche überschrieben werden. (Der Satz klingt scheiße, aber man muss ihn nicht umbedingt verstehen)

Dazu müsste ich jetzt ein Direct3DSprite auf ein Surface blitten.

Meine Idee war es, die Spriteklasse um eine Funktion zu erweitern, die eine neue Surface in der richtigen Größe (wenn man ein Sprite dreht oder skaliert, ändert sich ja die Größe der Oberfläche, die man benötigtr um das Sprite zu zeichnen) erstellt und das Sprite darauf blittet. Dann wird die Adresse zurückgegeben, so das dann die Kollsionstestfunktion mit der Oberfläche arbeiten kann und sie hinterher mit Release() wieder löscht.

Also ist jetzt die Frage, wie ich die Spriteklasse dazu bringen kann, die Textur auf ein Surface zu blitten und wie ich vorher die benötigte Größe des Surfaces berechnen kann.

Code:

void CSprite::Draw(int XPos, int YPos)
{
   D3DXVECTOR2 vScaling(1.0f, 1.0f);
   D3DXVECTOR2 vRotationCenter(m_ImageInfo.Width/2.0f, m_ImageInfo.Height/2.0f);
   D3DXVECTOR2 vPosition((float)XPos, (float)YPos);
   D3DCOLOR ModulateColor=0xffffffff;
   if(FAILED(m_lpXSprite->Draw(m_lpTexture, NULL, &vScaling, &vRotationCenter, m_Rotation, &vPosition, ModulateColor)))
   {
      Error("Sprite konnte nicht angezeigt werden!");
   }
}


Das ist meine Ausgans SpriteDraw Funktion, sie müsste also noch um folgendes erweitert werden:
- Berechnen der größe der Oberfläche
- erstellung der Oberfläche
- Draw Funktion auf die neue Oberfläche anwenden

Der zweite Punkt ist ja easy, aber die anderen beiden weiß ich nicht.

Kann mir jemand helfen?

Mfg Jonathan
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.03.2004, 10:06    Titel: Antworten mit Zitat

Äh, ist die Frage denn wirckloch so schwer?

Wie hab ihr den die Kollsionserkennung umgesetzt? Ist meine Mehtode vieleicht nicht so geeignet? Es muss euch doch irgendetwas dazu einfallen!

Oder wollt ihr mir nicht antworten?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.04.2004, 05:54    Titel: Antworten mit Zitat

Kann es sein das es beim DXSprite so ne ähnliche Funktion wie SetRenderTarget(&lpSurface) gibt, mit der man festlegen kann, ob die Textur in den Backpuffer oder in eine andere Oberfläche gezeichnet werden soll?
Oder kann man irgendwie auf die Pixel einer Textur zugreifen, ähnlich wie bei einer Oberfläche?

Wegen der größe der Oberfläche: Man muss es ja nicht Pixegenau wissen, sondern kann einfach eine Oberfläche erstellen, in die das Sprite auf jeden Fall,bei jeder Drehung reinpasst: z:b. Quadratisch mit der doppelten Seitenlänge der vorher längeren Kannte.
_________________
https://jonathank.de/games/
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: 16.04.2004, 09:21    Titel: Antworten mit Zitat

SetRendertarget() sollte gehen. Ist ein Versuch Wert.

C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.04.2004, 10:59    Titel: Antworten mit Zitat

Ich hab mal vollgendes versucht, was aber nicht funktionierte:
Code:

void CSprite::DrawInSurface()
{
   if(NULL!=m_lpSurface)
   {
      m_lpSurface->Release();
      m_lpSurface=NULL;
   }
   m_lpD3DDevice->CreateOffscreenPlainSurface(m_ImageInfo.Width, m_ImageInfo.Height, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &m_lpSurface, 0);
   m_lpD3DDevice->SetRenderTarget(0, m_lpSurface);
   Draw(0, 0);
   m_lpD3DDevice->SetRenderTarget(0, m_Direct3D->GetBackBuffer());
}

In der DX Hilfe heißt es:
The new render target surface must have at least D3DUSAGE_RENDERTARGET specified.
Ich hab aber keine Ahnung, wie.

Ich hab auchmal ausprobiert, was passiert, wenn ich das RenderTarget nicht wieder umstelle. Dann dürfte er ja normalerweise nichts mehr anzeigen, weil alles auf die Oberfläche gerendert wird. Es funktioniert aber trotzdem. Wenn ich mir die Oberfläche anzeigen lasse, sind da nur blaue Streifen.
Ich weiß auch nicht was ich bei SetRenderTarget als ersten Parameter übergeben muss.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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