Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phalax

Frischling

  • »Phalax« ist der Autor dieses Themas

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

1

05.06.2010, 22:00

Ball je nach Aufschlagsposition ablenken

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.

2

05.06.2010, 22:16

wie ist GetAngle() definiert?
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

3

05.06.2010, 22:25

Ich nehme mal an, dass der Rückgabewert von Getangle Grad ist und dass du diesen nicht in das Bogenmaß umgerechnet hast.



Edit: http://www.willemer.de/informatik/cpp/mathlib.htm

Phalax

Frischling

  • »Phalax« ist der Autor dieses Themas

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

4

05.06.2010, 22:40

Stimmt,

GetAngle() gibt den Winkel in Grad zurück :sleeping:. Jetzt habe ich das geändert und es klappt :thumbsup:. Echt ein blöder Fehler.

Und Danke für die schnelle Hilfe :D.

Gruß Phalax

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

5

06.06.2010, 09:40

Die Aufschalgsposition selbst beeinflusst die Richtung nicht, sondern nur die Normale. Da auf einem Rechteck die Normale immer gleich ist, ist die Position uninteressant, nur die Seite muss beachtet werden. Was man als noch einbauen kann: Rotation des Balles. Bewegungsenergie des Pads wird teilweise in Rotationsenergie des Balles umgewandelt, wenn sich beide beruehren. Dann ergibt sich durch den Magnuseffekt eine senkrecht zur Flugrichtung wirkende Kraft.

Dark Fly

Treue Seele

Beiträge: 163

Wohnort: Bielefeld

Beruf: Schüler

  • Private Nachricht senden

6

08.06.2010, 18:27

Und wo bleit dann der Coriolis Effekt :?: :D
Coriolis-Effekt
Zudem ist die Anregungvon TGGC ja ganz gut, aber es schien mir von seinem Problem aus nicht so,
als wollte er das game mir der Physik des Jahres erschaffen :P
MfG Dark Fly

C-/C++-Quelltext

1
2
3
4
int *i;                     // Erstelle Zeiger
while(true)                 // führe Schleife immer aus
{new (int) = i;}            // allokiere frischen Speicher
                            // warte auf unendliche Langsamkeit....

7

09.06.2010, 18:22

Und wo bleit dann der Coriolis Effekt :?: :D
Coriolis-Effekt

Der wird ja bei CoD4 laut Aussage eines Charakters berücksichtigt :D

Dark Fly

Treue Seele

Beiträge: 163

Wohnort: Bielefeld

Beruf: Schüler

  • Private Nachricht senden

8

09.06.2010, 22:00

Meinst wenn du in Tschernobyl bist und snipern musst.
JAja alles was isch über die Erde bewegt wird nach rechts abgedrängt.
Auch sehr wichtig in der Meteorologie. Interessant :evil:
MfG Dark Fly

C-/C++-Quelltext

1
2
3
4
int *i;                     // Erstelle Zeiger
while(true)                 // führe Schleife immer aus
{new (int) = i;}            // allokiere frischen Speicher
                            // warte auf unendliche Langsamkeit....

Werbeanzeige