Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 24.04.2008, 21:27 Titel: Kollision mit gedrehten Sprites |
|
|
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 |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 25.04.2008, 17:24 Titel: |
|
|
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 |
|
|
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 25.04.2008, 20:55 Titel: |
|
|
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 |
|
|
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 02.05.2008, 11:38 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
|
Nach oben |
|
|
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 04.05.2008, 11:36 Titel: |
|
|
danke, aber gibts sowas auch auf deutsch, wäre dan leichter verständlich für mich. |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 07.05.2008, 18:12 Titel: |
|
|
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 |
|
|
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 15.05.2008, 11:46 Titel: |
|
|
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.05.2008, 20:02 Titel: |
|
|
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 |
|
|
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 22.05.2008, 09:32 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 22.05.2008, 09:57 Titel: |
|
|
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 |
|
|
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 22.05.2008, 12:32 Titel: |
|
|
ah danke das 1 hört sich gut an.
Wie mach ich das? |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 22.05.2008, 15:07 Titel: |
|
|
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
mfg Matthias
[edit]Wahlweise kannst du dich evt. sogar damit begnügen nur ein Surface anzulegen [/edit] |
|
Nach oben |
|
|
Bigmek Mini JLI'ler
Anmeldedatum: 24.04.2008 Beiträge: 10
Medaillen: Keine
|
Verfasst am: 23.05.2008, 07:41 Titel: |
|
|
hey danke.
Kannst mir ein beispiel für die Funktion SetRenderTarget.
so in etwa
CPP: | texture
CreateTexture(...,&texture)
SetRenderTarget(???,texture)
|
|
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 23.05.2008, 09:10 Titel: |
|
|
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 |
|
|
|