Hi,
ich habe eine Frage bezüglich der Physik in einem Breakout-Clone.
Und zwar soll der Ball je nachdem, ob er in der Mitte des Paddles oder weiter außen auftrifft, abgelenkt werden.
Trifft er genau die Mitte des Paddles, soll er senkrecht nach oben fliegen, ansonsten, je stärker er in Richtung der Enden auftrifft, schräg ablenken.
Doch irgendwie stimmt mein Code nicht ganz, denn er springt nicht immer in die richtige Richtung und mit der richtigen Ablenkung.
Hier die Methode zur Kollisionsprüfung:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void CLevel::CheckCollision()
{
// Findet eine Kollision statt?
if (m_pBall->GetRect().y < m_pPaddle->GetRect().y + m_pPaddle->GetRect().h &&
m_pBall->GetRect().y + m_pBall->GetRect().h > m_pPaddle->GetRect().y &&
m_pBall->GetRect().x < m_pPaddle->GetRect().x + m_pPaddle->GetRect().w &&
m_pBall->GetRect().x + m_pBall->GetRect().w > m_pPaddle->GetRect().x)
{
float XPos = (m_pPaddle->GetRect().x + (m_pPaddle->GetRect().w / 2)) - (m_pBall->GetRect().x); // X-Koordinate des Aufpralls
XPos /= 50; // Wert verringern, damit die Ablenkung nicht zu stark wird und die trigonometrischen Funktionen klappen
float newAngle = acos(XPos * cos(m_pBall->GetAngle())); // Neuen Winkel berechnen
m_pBall->SetAngle(-newAngle); // Winkel dem Ball zuweisen
}
}
|
Und die Methode zum Setzen des Winkels:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
void CBall::SetAngle(float angle)
{
float c = sqrt(pow(m_fDX, 2) + pow(m_fDY, 2)); // Länge des Vektors
m_fDX = c * cos(angle); // Komponenten neu berechnen
m_fDY = c * sin(angle);
}
|
Ich hoffe, jemand kann mir da helfen. Ich stehe echt auf dem Schlauch.