Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
m_maty Mini JLI'ler
Anmeldedatum: 12.08.2003 Beiträge: 24 Wohnort: bei Koblenz Medaillen: Keine
|
Verfasst am: 19.09.2006, 19:51 Titel: Probleme mit Spriteposition nach Skallierung - komm nicht we |
|
|
hi,
ich habe ein Problem bei der 2D Kollisionserkennung Kap. 25
wenn ich mein Sprite mit m_vScale verkleiner/vergrösser bekomm ich das Rechteck nicht richtig errechnet, hab schon alles versucht aber der x, y wert ist immer verschoben (es liegt nicht an meiner draw funktion - (getestet)) Bekomme die Formel nicht umgeschrieben (mir gehts da nur um die neue D3DXVECTOR2 m_vPosition.
ich benöteige ja nur einfach eine neue x und y Position (D3DXVECTOR2 m_vPosition) wenn sich der Skalierungswert m_vScale ändert. aber irgendwie kann ich mit zB, m_vPosition * m_vScale oder ähnlichen die korrekte Position des Sprites nach skallierung nicht errechnen. (ich teste das rect auch immer mit drübergelegtem gezeichneten rect - aber das ist immer verschoben (ausser bei scall. 1.0f )
mein letzter versuch, das sprite rect ist auch wieder etwas verschoben vom x y startpunkt,
Die Grösse des Rect hab ich einfach * skallierungswert genommen das ging (h,w) aber das andre will nicht
CPP: | //Liefert die aktuelle Spriteposition als CPoint
CPoint CAnimSprite::GetAktPosition_CPoint()
{
CPoint poSprite;
float r = ((float)m_Width * m_vScale.x) + m_vPosition.x;
float b = ((float)m_Height * m_vScale.y) + m_vPosition.y;
poSprite.x = (int)r;
poSprite.y = (int)b;
return poSprite;
} | [/cpp]
kann mir jemand vileicht helfen ?
Grüsse, Maty |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 19.09.2006, 20:47 Titel: |
|
|
m_VScale beschreibt doch die Scalierung des Sprites im Mittelpunkt oder?
Dann:
CPP: | CPoint CAnimSprite::GetAktPosition_CPoint()
{
CPoint poSprite;
poSprite.x = (int)m_vPosition.x;
poSprite.y = (int)m_vPosition.y;
return poSprite;
} |
Mehr sollt das nicht sein, ist aber die Scalierung abhängig von zB dem 0,0 Punkt des Sprites ist der Mittelpunkt deines skalierten Sprites so:
CPP: | CPoint CAnimSprite::GetAktPosition_CPoint()
{
CPoint poSprite;
float r = ((float)m_Width * m_vScale.x)*0.5f + m_vPosition.x;
float b = ((float)m_Height * m_vScale.y)*0.5f + m_vPosition.y;
poSprite.x = (int)r;
poSprite.y = (int)b;
return poSprite;
} |
_________________ "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 |
|
|
m_maty Mini JLI'ler
Anmeldedatum: 12.08.2003 Beiträge: 24 Wohnort: bei Koblenz Medaillen: Keine
|
Verfasst am: 20.09.2006, 08:17 Titel: |
|
|
danke Fallen,
ja die Skallierung macht directx immer vom mittelpunkt aus, deshalb ändert sich auch immer die sichtbare x, y position des spirits nach der scalierung. die x ,y position die er zum zeicnen nimmt bleibt dabei ja immer noch die alte - nur an der stelle ist das sprite ja nach der verkleinerung gar nicht mehr sichtbar - und genau das ist das problem.
dein erster code geht nicht da er ja auch keine skalierung berücksichtigt , der 2. Code funktioniert nur wenn m_vScale den Wert 0.5f besitzt, bei zb. 0.3f verschiebt sich der CPoint nach oben links
Nun dachte ich mal den 0.5f mit dem m_vScale tauschen, aber das ging auch nicht :
CPP: | CPoint CAnimSprite::GetAktPosition_CPoint()
{
CPoint poSprite;
//float r = ((float)m_Width * m_vScale.x)*0.5f + m_vPosition.x;
//float b = ((float)m_Height * m_vScale.y)*0.5f + m_vPosition.y;
float r = ((float)m_Width * m_vScale.x)* m_vScale.x + m_vPosition.x;
float b = ((float)m_Height * m_vScale.y)* m_vScale.y + m_vPosition.y;
poSprite.x = (int)r;
poSprite.y = (int)b;
return poSprite;
} |
(m_Height und m_Width enthält übrigens die orginal Höhe und Breite vor der Skalierung)
sieht vileicht einfach aus aber es klappt irgendwie nicht |
|
Nach oben |
|
|
m_maty Mini JLI'ler
Anmeldedatum: 12.08.2003 Beiträge: 24 Wohnort: bei Koblenz Medaillen: Keine
|
Verfasst am: 20.09.2006, 09:55 Titel: |
|
|
so habs nun doch gelöst : CPP: | //Liefert die aktuelle Spriteposition als CPoint
CPoint CAnimSprite::GetAktPosition_CPoint()
{
CPoint poSprite;
float r = ((float)m_Width - GetSprite_CRect().right) /2;
float b = ((float)m_Height - GetSprite_CRect().bottom)/2;
poSprite.x = (int)m_vPosition.x + r;
poSprite.y = (int)m_vPosition.y + b;
return poSprite;
} |
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 20.09.2006, 10:13 Titel: |
|
|
sollte m_Width nicht das selbe sein wie GetSprite_CRect().right? _________________ "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 |
|
|
m_maty Mini JLI'ler
Anmeldedatum: 12.08.2003 Beiträge: 24 Wohnort: bei Koblenz Medaillen: Keine
|
Verfasst am: 20.09.2006, 10:30 Titel: |
|
|
nein den GetSprite_CRect().right liefert mir die höhe/weite des neu skalierten Sprite-CRect (m_Width enthielt den alten Wert). |
|
Nach oben |
|
|
|