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;
}
|