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

1

02.11.2014, 19:56

Problem bei der Berechnung von Punkten auf einer Kreisbahn

Hallo zusammen,
ich sitze schon länger an einem Problem und hoffe ihr könnt mir helfen.
Ich programmiere zurzeit ein 2D-Spiel mit C++ und SFML, in dem der Spieler Gegenstände, wie eine Waffe o.ä. halten kann. Der Spieler besteht aus 3 Teilen: Körper, Beine und der Arm, sodass ich diese getrennt voneinander animieren und rendern kann (so kann er gleichzeitig laufen und schlagen, ohne dass ich dafür extra Animationsframes brauche). Solange man die linke Maustaste drückt, schlägt der Spieler. Dafür lasse ich den Arm um einen Punkt an der Schulter nach oben rotieren bis zu einem gewissen Maximum und ab da nach unten rotieren bis zu einem Minimum usw.
Nun soll ein Gegenstand, den der Spieler trägt in der Hand erscheinen. Man legt am Anfang auf dem Arm-Sprite einen Punkt fest, an dem die Gegenstände gerendert werden sollen und an diesen Punkt setzt man den Gegenstand in jedem Frame.
Wenn der Spieler nun schlägt, rotiert der Arm und somit wandert der Punkt an eine andere Stelle. Und hier ist das Problem: Die Funktion, die die neue Position des Punktes berechnen soll, an dem der Gegenstand nun sein müsste gibt scheinbar zufällige Ergebnisse aus, sodass der Gegenstand an zufälligen Positionen um den Spieler herum erscheint.
Theoretisch müsste es möglich sein, da sich der "Andock-Punkt" für die Gegenstände in einer Kreisbahn um den Rotationspunkt des Arms bewegt, mit den Formeln x = MittlepunktX + radius + cos(Winkel) und y = MittelpunktY + radius + sin(Winkel) die neue Position dieses Punktes zu berechnen, aber es klappt nicht.
Woran liegt das?




Funktion zur Berechnung der neuen Position
m_pArm: Der Arm-Sprite
m_RotatingAngle: Der Winkel, um den der Arm zurzeit gedreht ist, wenn der Spieler nach links gerichtet steht
m_ArmXOrigin/m_ArmYOrigin: Der Rotationspunkt auf dem Sprite
m_HandX/m_HandY: Der Andock Punkt auf dem Sprite
_left: ist der Spieler nach links gedreht?



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//returns the position of the hand
Vector2i CLiving3Part::GetHandPos(bool _left)
{
    Vector2i handPos;
    Vector2f vec;
    float radius;
    
    double angle;
    
    if(_left)
    {
        angle = (180 - m_RotatingAngle)*180/3.1415926535;                                                   //Umrechnung des Drehwinkels ins Bogenmaß
        vec = Vector2f(m_ArmXOrigin, m_ArmYOrigin) - Vector2f(m_HandX, m_HandY);    //Berechnen des Vektors, der dem Radius entspricht
        radius = sqrt(vec.x* vec.x + vec.y * vec.y);                                                                    //Berechnen der Länge des Vektors (der Radius)
        handPos.x = m_pArm->GetRect().left + radius*cos(angle);
        handPos.y = m_pArm->GetRect().top + radius*sin(angle);
    }
    else
    {
        angle = (m_RotatingAngle)*180/3.1415926535;
        vec = Vector2f(m_ArmXOrigin, m_ArmYOrigin) - Vector2f(m_HandX, m_HandY); 
        radius = sqrt(vec.x* vec.x + vec.y * vec.y);

        handPos.x = m_pArm->GetRect().left + radius*cos(angle);
        handPos.y = m_pArm->GetRect().top + radius*sin(angle);
    }

    return handPos;
}

2

02.11.2014, 20:04

Schau dir mal deine Umrechnung von Grad in Bogemaß genauer an.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

3

02.11.2014, 20:15

Oh... Ich hatte wohl echt Tomaten auf den Augen... :D
Danke, ohne dich hätte ich wahrscheinlich noch ewig nach dem Fehler gesucht.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

4

03.11.2014, 19:34

Du hast in deinem Text: "Radius + cos" etc. geschrieben! Im Code stehts dann aber richtig... ;)
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Werbeanzeige