Liebe Leser
Ich weis das es hierzu bereiz einige Themen gibt. aber mir hat es leider nicht weitergeholfen
Ich Entwickle grade mein erstes Spiel. (Action-Adventure)
Ich Arbeite Grade an der Steuerung des Spielers. Der Spieler soll sich um
die Y Achse (rechts / links schauen) und um die X Achse(oben / unten schauen).
Wie die Ego_Shouter Perspective;
Wen ich den Spieler etwas um die Y Achse drehe und danach um die X Achse. Dreht der Spieler sich plötzlich mit um die Z Achse. Je weiter ich mich vom Ursprung entferne desto größer ist die Rotation um die Z Achse.
Obwohl m_vRotation.z = 0 ist.
Hier ist der Code. Ich haben ihn etwas gekützt
Die Klasse CPlayer Stellt einen Spieler dar. Sie ist ähnlich wie CShip in Galactica aufgebaut
CPlayer
|
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
30
31
|
// Den Spieler Steuen Lassen
Control(fTime);
//Bewegungsvector Begrenzen
if (m_vVelocity.x > 2.75f) m_vVelocity.x = 2.75f;
else if (m_vVelocity.x < -2.75f) m_vVelocity.x = -2.75f;
if (m_vVelocity.z > 2.75f) m_vVelocity.z = 2.75f;
else if (m_vVelocity.z < -2.75f) m_vVelocity.z = -2.75f;
//Drehung begrenzen
if (m_vRotation.y > 1.75f) m_vRotation.y = 1.75f;
else if (m_vRotation.y < -1.75f) m_vRotation.y = -1.75f;
if (m_vRotation.x > 1.75f) m_vRotation.x = 1.75f;
else if (m_vRotation.x < -1.75f) m_vRotation.x = -1.75f;
//BewegungsVector Abschwäschen
if(pf_Button[TB_KEY_A] == FALSE && pf_Button[TB_KEY_D] == FALSE && pf_Button[TB_KEY_S] == FALSE && pf_Button[TB_KEY_W] == FALSE)
m_vVelocity = m_vVelocity / 1.10f;
//Rotation Abschwäschen
if(pf_Button[TB_KEY_LEFT] == FALSE && pf_Button[TB_KEY_RIGHT] == FALSE && pf_Button[TB_KEY_UP] == FALSE && pf_Button[TB_KEY_DOWN] == FALSE)
m_vRotation = m_vRotation / 1.20;
// Bewegung einsetzen
AddVelocityRel(mv_Steering * fTime);
AddRotationRel(mv_Rotation * fTime);
// Matrix Updaten und Bewegung Starten
Update();
Move(fTime);
|
Die CPlayer::Control Methode Steuert den Spieler. Sie wird in Move aufgerufen
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
// Bewegung Durchführen
mv_Steering.x = ((pf_Button[TB_KEY_D] - pf_Button[TB_KEY_A]) * 4);
mv_Steering.z = ((pf_Button[TB_KEY_W] - pf_Button[TB_KEY_S]) * 4);
// Rotation Durchführen
mv_Rotation.y =(( pf_Button[TB_KEY_RIGHT] - pf_Button[TB_KEY_LEFT])* 4);
mv_Rotation.x =(( pf_Button[TB_KEY_UP] - pf_Button[TB_KEY_DOWN])* 4);
|
Die CGame:
etProjection erstellt und Setzt Kamera und Projectionsmatrix.
|
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
|
tbDirect3D &D3D = tbDirect3D::Instance();
// Parameter
float f_Clipping;
float f_FOV;
tbVector3 v_CameraPos;
tbVector3 v_CameraLock;
tbVector3 v_CameraUp;
tbMatrix m_Camera;
tbMatrix m_Projection;
// Parameter Werte zuweisen
f_Clipping = 500.0f;
v_CameraPos = mp_Player->RelToAbsPos(tbVector3(0.0f,0.5f,0.0f));
v_CameraLock = v_CameraPos + mp_Player->m_vZAxis;
v_CameraUp = mp_Player->m_vYAxis ;
f_FOV = TB_DEG_TO_RAD(70.0f);
// Matrizen erzeugen
m_Camera = tbMatrixCamera(v_CameraPos,v_CameraLock,v_CameraUp);
m_Projection = tbMatrixProjection(f_FOV,D3D.GetAspect(),0.005f,f_Clipping);
// Matrizen einsetztem
D3D.SetTransform(D3DTS_VIEW, m_Camera);
D3D.SetTransform(D3DTS_PROJECTION, m_Projection);
|
Ich hoffe einer von euch kann mir helfen
Liebe Grüße
Sebastian Müller