Sterowanie na ocene chyba 4.0

This commit is contained in:
Pc
2025-01-07 20:49:20 +01:00
parent 4956d74c1a
commit 2afc119bb9

138
main.cpp
View File

@@ -76,7 +76,7 @@ int monitormodecounter = 0;
std::time_t monitormodehelper; std::time_t monitormodehelper;
//Zmienne do ruchu ############################################## //Zmienne do ruchu ##############################################
/*
float Foward = 0.0f; // Pozycja łazika w przód/tył float Foward = 0.0f; // Pozycja łazika w przód/tył
float Sides = 0.0f; // Pozycja łazika w lewo/prawo float Sides = 0.0f; // Pozycja łazika w lewo/prawo
float Rotation = 0.0f; // Rotacja łazika (w stopniach) float Rotation = 0.0f; // Rotacja łazika (w stopniach)
@@ -110,6 +110,92 @@ void RotateRoverAndCamera(float angle) {
if (Rotation >= 360.0f) Rotation -= 360.0f; if (Rotation >= 360.0f) Rotation -= 360.0f;
if (Rotation < 0.0f) Rotation += 360.0f; if (Rotation < 0.0f) Rotation += 360.0f;
} }
*/
//Zmienne do ruchu ##############################################^^^^^^^^^^^^^^^^^^^^^^^^^^^^
bool keyWPressed = false;
bool keySPressed = false;
bool keyAPressed = false;
bool keyDPressed = false;
float Foward = 0.0f; // Pozycja łazika w przód/tył
float Sides = 0.0f; // Pozycja łazika w lewo/prawo
float Rotation = 0.0f; // Rotacja łazika (w stopniach)
float CameraHeight = 50.0f; // Wysokość kamery
float MoveSpeed = 3.0f; // Prędkość poruszania się
// Funkcja do poruszania łazikiem
void MoveRover(bool forward) {
// Zamieniamy kąt na radiany
float radRotation = Rotation * GL_PI / 180.0f;
// Wektor ruchu w kierunku przód/tył (kierunek łazika)
float moveX = cos(radRotation);
float moveZ = sin(radRotation);
// Ruch w przód
if (forward) {
Sides -= MoveSpeed * moveX;
Foward -= MoveSpeed * moveZ;
}
// Ruch w tył
else {
Sides += MoveSpeed * moveX;
Foward += MoveSpeed * moveZ;
}
}
// Funkcja do obracania łazika wokół osi Y
void RotateRoverAndCamera(float angle) {
Rotation += angle;
if (Rotation >= 360.0f) Rotation -= 360.0f;
if (Rotation < 0.0f) Rotation += 360.0f;
}
void UpdateRover() {
if (keyWPressed) {
if (keyAPressed) {
// Ruch do przodu i skręt w lewo
RotateRoverAndCamera(3.0f); // Dostosuj wartość kąta według potrzeb
MoveRover(true);
}
else if (keyDPressed) {
// Ruch do przodu i skręt w prawo
RotateRoverAndCamera(-3.0f); // Dostosuj wartość kąta według potrzeb
MoveRover(true);
}
else {
// Ruch do przodu bez skrętu
MoveRover(true);
}
}
else if (keySPressed) {
if (keyAPressed) {
// Ruch do tyłu i skręt w lewo
RotateRoverAndCamera(-3.0f); // Dostosuj wartość kąta według potrzeb
MoveRover(false);
}
else if (keyDPressed) {
// Ruch do tyłu i skręt w prawo
RotateRoverAndCamera(3.0f); // Dostosuj wartość kąta według potrzeb
MoveRover(false);
}
else {
// Ruch do tyłu bez skrętu
MoveRover(false);
}
}
else {
if (keyAPressed) {
// Obrót w miejscu w lewo
RotateRoverAndCamera(3.0f); // Dostosuj wartość kąta według potrzeb
}
else if (keyDPressed) {
// Obrót w miejscu w prawo
RotateRoverAndCamera(-3.0f); // Dostosuj wartość kąta według potrzeb
}
}
}
// Change viewing volume and viewport. Called when window is resized // Change viewing volume and viewport. Called when window is resized
void ChangeSize(GLsizei w, GLsizei h) { void ChangeSize(GLsizei w, GLsizei h) {
@@ -385,10 +471,12 @@ void RenderScene(void) {
// Rysowanie łazika (porusza się i obraca) // Rysowanie łazika (porusza się i obraca)
glPushMatrix(); glPushMatrix();
glTranslatef(Foward, 0.0f, Sides); // Translacja łazika na jego pozycję glTranslatef(Foward, 0.0f, Sides); // Translacja łazika na jego pozycję
glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika wokół własnej osi glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika wokół własnej osi
glColor3f(1.0, 0.0, 0.0); // Czerwony kolor dla łazika glColor3f(1.0, 0.0, 0.0); // Czerwony kolor dla łazika
user.draw(); user.draw();
UpdateRover();
glPopMatrix(); glPopMatrix();
@@ -681,11 +769,31 @@ float radRotation = Rotation * GL_PI / 180.0f;
return 0; return 0;
} }
break; break;
case WM_KEYUP:
switch (wParam) {
case 'W':
keyWPressed = false;
break;
case 'S':
keySPressed = false;
break;
case 'A':
keyAPressed = false;
break;
case 'D':
keyDPressed = false;
break;
// Obsługa innych klawiszy
}
break;
// Key press, check for arrow keys to do cube rotation.
case WM_KEYDOWN: case WM_KEYDOWN:
switch (wParam) { switch (wParam) {
case VK_UP: case VK_UP:
xRot -= 5.0f; xRot -= 5.0f;
break; break;
@@ -721,27 +829,17 @@ float radRotation = Rotation * GL_PI / 180.0f;
if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!"); if (polygonmode) timestampedCout("Uwaga! Tryb wireframe jest niewydajny i powinien sluzyc tylko do debugowania!");
break; break;
case 'W': // Ruch w przód case 'W':
MoveRover(true); keyWPressed = true;
break; break;
case 'S': // Ruch w tył case 'S':
MoveRover(false); keySPressed = true;
break; break;
case 'A':
case 'A': // Obrót w lewo keyAPressed = true;
RotateRoverAndCamera(5.0f); // Obrót łazika i kamery w lewo
break; break;
case 'D': // Obrót w prawo case 'D':
RotateRoverAndCamera(-5.0f); // Obrót łazika i kamery w prawo keyDPressed = true;
break;
case 'J': // Obrót w lewo (wokół własnej osi)
Rotation += 5.0f;
if (Rotation > 360.0f || Rotation < 0.0f) Rotation -= 360.0f;
break;
case 'K': // Obrót w prawo (wokół własnej osi)
Rotation -= 5.0f;
if (Rotation > 360.0f || Rotation < 0.0f) Rotation += 360.0f;
break; break;
case 114: // F3 case 114: // F3