JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Kollision mit gedrehten Sprites
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 24.04.2008, 21:27    Titel: Kollision mit gedrehten Sprites Antworten mit Zitat

Ich arbeite gerade an einem 2D Weltraumshooter.
Ansicht ist eine Top Ansicht.

Habe den Code für die Kollisionsabfrage aus dem Buch "Jetzt lerne ich Spieleprogrammierung mit DirectX"
Der funktioniert aber nicht mit gedrehten Sprites.
Man spiel mit einem raumschiff das sich 360 grad drehen kann,
und deshalb muss ich eine kollisionsabrfage mit gedrehten sprites machen können, weis aber nicht wie.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 25.04.2008, 17:24    Titel: Antworten mit Zitat

Hallo,

das ist etwas aufwändig, wenn du es pixelgenau machen willst. Ich denke aber, dass die nicht notwendig ist. Wenn du mit Collisionspolygonen arbeitest, sollte das für die meinsten Fälle genau genug sein und sind weniger aufwändig zu drehen. Hier ein Beispiel:



C.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 25.04.2008, 20:55    Titel: Antworten mit Zitat

Ja danke, denke das reicht auch aus.

Bin noch im 2d teil des buches,
das mit den Collisionspolygonen wird das später im buch noch erklärt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 02.05.2008, 11:38    Titel: Antworten mit Zitat

Sorry wegen doppeltpost aber wie mach ich das mit den Collisionspolygonen?
Kann mir das jemand sagen oder einen link oder ne quelle wo ich das finde geben?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 04.05.2008, 11:08    Titel: Antworten mit Zitat

Bigmek hat Folgendes geschrieben:
Sorry wegen doppeltpost aber wie mach ich das mit den Collisionspolygonen?
Kann mir das jemand sagen oder einen link oder ne quelle wo ich das finde geben?


Gibt viel im Netz, z.B. http://www.codeproject.com/KB/GDI-plus/PolygonCollision.aspx
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 04.05.2008, 11:36    Titel: Antworten mit Zitat

danke, aber gibts sowas auch auf deutsch, wäre dan leichter verständlich für mich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 07.05.2008, 18:12    Titel: Antworten mit Zitat

Schwer, wüsste spontan nicht wo. In welcher Klasse bist du? Vll findest du das notwendige Wissen bereits in deinem Mathebuch. ;) Ansonsten mal nach dem V-Clip Algo googeln.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 15.05.2008, 11:46    Titel: Antworten mit Zitat

So war ne weile beschäftigt,
hab gleich nach der Schule eine Ausbildung als informatiker gemacht, hab leider nichts dergleichen gelernt.
Vieleicht verstehe ich die Pixelgenau abfrage besser, gibts für gedrehte pixelgenau abfrage ein Tutorial?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.05.2008, 20:02    Titel: Antworten mit Zitat

Wenn du eine pixelgenaue Abfrage hast die mit einfachen Sprites funktioniert, wo ist das Problem das ganze auf gedrehte Sprites anzuwenden? Die Pixel interessiert das nicht, ob sie verdreht oder verknotet sind. :) Wenn du ein Sprite drehen kannst, kannst du für die Kollisionsabfrage auch deine Abfrageposition mit dem gleichen Algorithmus drehen.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 22.05.2008, 09:32    Titel: Antworten mit Zitat

Nein kann ich leider nicht.
hier mal der code wo ich drehe

CPP:
void CSprite::Draw(int AnimationNr,float x, float y,float Rotation, float scale)
{
   if (CDirectX::Instance().getSprite() != NULL)
   {

      m_vScale.x = scale;
      m_vScale.y = scale;
      float m_TempRot = -Rotation * D3DX_PI / 180.0f;
      D3DXMATRIX Matrix;
      D3DXVECTOR3 vPosition(x-m_Width/2, y-m_Height/2, 0.0f);
      D3DXMatrixTransformation2D(
        &Matrix,
        reinterpret_cast<D3DXVECTOR2*>(&m_vRotationCenter),
        0.0f,
        &m_vScale,
        reinterpret_cast<D3DXVECTOR2*>(&m_vRotationCenter),
        m_TempRot,
        reinterpret_cast<D3DXVECTOR2*>(&vPosition));

      CDirectX::Instance().getSprite()->Begin(D3DXSPRITE_ALPHABLEND);


      // Transformations-Matrix setzen
      CDirectX::Instance().getSprite()->SetTransform(&Matrix);

      // Mittelpunkt des Sprite
      //D3DXVECTOR3 vCenter(float(m_Width/2), float(m_Height/2), 0.0f);
      // Sprite an Position 100, 100 zeichnen
      //vPosition.x = x;
      //vPosition.y = y;
      //vPosition.z = 0.0f;

      CDirectX::Instance().getSprite()->Draw(m_AnimationSequence[AnimationNr],
                   NULL,
                   NULL,
                   NULL,
                   0xFFFFFFFF);
      CDirectX::Instance().getSprite()->End();
   }
   //CDirectX::Instance().getDevice();
}


und hier die erzeuge ich das für die Kollisionsabfrage benötigte Byte Array

CPP:
BYTE* CSprite::GetReducedImage(int AnimationNr)
{
   int nReductionFactor = 1;
   D3DSURFACE_DESC desc;

    LPDIRECT3DTEXTURE9 lpTexture = m_AnimationSequence[AnimationNr];
   lpTexture->GetLevelDesc(0, &desc);

    // Breite und Hoehe speichern
    DWORD tempWidth  = desc.Width;
    DWORD tempHeight = desc.Height;

   BYTE* lpReducedImage = new BYTE[m_Width / nReductionFactor * m_Height / nReductionFactor];

   // Textur sperren
   D3DLOCKED_RECT LockedRect;

   lpTexture->LockRect(0, &LockedRect, NULL, D3DLOCK_READONLY);

   DWORD* pPixels = reinterpret_cast<DWORD*>(LockedRect.pBits);

   LockedRect.Pitch /= 4;

   int i, j;

   // reduzierten Puffer füllen
   for(i=0;i<tempHeight;i+=nReductionFactor)
   {
      for(j=0;j<tempWidth;j+=nReductionFactor)
      {
         if(pPixels[i*LockedRect.Pitch + j] != 0)
         {
            lpReducedImage[i/nReductionFactor * tempWidth/nReductionFactor + j/nReductionFactor] = 1;
         }
         else
         {
            lpReducedImage[i/nReductionFactor * tempWidth/nReductionFactor + j/nReductionFactor] = 0;
         }
      }
   }

   // Textur freigeben
   lpTexture->UnlockRect(0);

   return lpReducedImage;
}


Hab keine ahnung wie ich jetzt das sprite für die Kollisionsabfrage drehen soll
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 22.05.2008, 09:57    Titel: Antworten mit Zitat

Spontan fallen mir da zwei Möglichkeiten ein, wie du eine pixelgenaue Collosionsmap deines gedrehten Sprites bekommst:

1. Per Hardware-Rendering
Du renderst dein gewünschtes Sprite mit deiner gewünschten Transformation in eine leere Textur und erstellst daraus dann mit deinem Algo ganz normal die Collisionsmap.

2. Per Software-Rendering
Du transformierst bzw. drehst dein Sprite "per Hand". Dazu benötigst du einige trigometrische Funktionen, aber Nährers solltest du hier rauslesen können: http://www.jliforum.de/afe-gmdg/index.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 22.05.2008, 12:32    Titel: Antworten mit Zitat

ah danke das 1 hört sich gut an.
Wie mach ich das?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 22.05.2008, 15:07    Titel: Antworten mit Zitat

Bigmek hat Folgendes geschrieben:
ah danke das 1 hört sich gut an.
Wie mach ich das?



Du legst eine leere Textur an. Beispielsweiße mit CreateTextur(...)

Um in die neue Textur rendern zu können, benötigst du einen Aufruf von SetRenderTarget(...), in der du ein Surface der Textur angibst. Später musst du dann aber auch wieder das RenderTarget auf den Backbuffer setzen Wink

mfg Matthias

[edit]Wahlweise kannst du dich evt. sogar damit begnügen nur ein Surface anzulegen Wink [/edit]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Bigmek
Mini JLI'ler



Anmeldedatum: 24.04.2008
Beiträge: 10

Medaillen: Keine

BeitragVerfasst am: 23.05.2008, 07:41    Titel: Antworten mit Zitat

hey danke.
Kannst mir ein beispiel für die Funktion SetRenderTarget.

so in etwa
CPP:
texture
CreateTexture(...,&texture)
SetRenderTarget(???,texture)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 23.05.2008, 09:10    Titel: Antworten mit Zitat

Bigmek hat Folgendes geschrieben:
hey danke.
Kannst mir ein beispiel für die Funktion SetRenderTarget.


Kennst du eigentlich das kleine Wörtchen: 'Selbstinitiative'?
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 -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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