poprawiona czytelność kodu
This commit is contained in:
13
fabula.cpp
13
fabula.cpp
@@ -171,7 +171,6 @@ void ustawSiatkeNaWzorNieNadpisujacPostepu() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void nadpiszNowaSiatke(short nowy_wzor) {
|
void nadpiszNowaSiatke(short nowy_wzor) {
|
||||||
std::cout << "Przepisz zawartosc siatki!\n";
|
|
||||||
biezacy_wzor = nowy_wzor;
|
biezacy_wzor = nowy_wzor;
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
for (int j = 0; j < 10; j++) {
|
for (int j = 0; j < 10; j++) {
|
||||||
@@ -215,6 +214,7 @@ void tworzKratkiZSiatki() {
|
|||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
// Aby nie musieć rysować wzorów w odbiciu
|
// Aby nie musieć rysować wzorów w odbiciu
|
||||||
// lustrzanym, musimy tutaj przyjąć inną sekwencję
|
// lustrzanym, musimy tutaj przyjąć inną sekwencję
|
||||||
|
// (dlatego rysujemy od prawej do lewej (9 do 0))
|
||||||
for (int j = 0; j < 10; j++) {
|
for (int j = 0; j < 10; j++) {
|
||||||
tworzKratke(i, j, siatka[10*i + (9 - j)]);
|
tworzKratke(i, j, siatka[10*i + (9 - j)]);
|
||||||
}
|
}
|
||||||
@@ -223,10 +223,13 @@ void tworzKratkiZSiatki() {
|
|||||||
|
|
||||||
void aktualizujBiezacaKratke(short grid_x, short grid_z) {
|
void aktualizujBiezacaKratke(short grid_x, short grid_z) {
|
||||||
if (grid_x < 0 || grid_z < 0) return;
|
if (grid_x < 0 || grid_z < 0) return;
|
||||||
unsigned short a = siatka[10*grid_x + (9 - grid_z)];
|
|
||||||
siatka[10*grid_x + (9 - grid_z)] |= 2;
|
unsigned short poprzednia_wartosc = siatka[10*grid_x + (9 - grid_z)];
|
||||||
// jeżeli coś się zmieniło
|
siatka[10*grid_x + (9 - grid_z)] |= 2; // zaznacz pole jako zamalowane
|
||||||
if (siatka[10*grid_x + (9 - grid_z)] != a) {
|
unsigned short nowa_wartosc = siatka[10*grid_x + (9 - grid_z)];
|
||||||
|
|
||||||
|
// Jeżeli któreś z pól zostało zaktualizowane, sprawdź postęp gry
|
||||||
|
if (poprzednia_wartosc != nowa_wartosc) {
|
||||||
sprawdzPostepGry();
|
sprawdzPostepGry();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
444
main.cpp
444
main.cpp
@@ -75,14 +75,6 @@ BOOL APIENTRY AboutDlgProc(HWND hDlg, UINT message, UINT wParam, LONG lParam);
|
|||||||
|
|
||||||
void SetDCPixelFormat(HDC hDC);
|
void SetDCPixelFormat(HDC hDC);
|
||||||
|
|
||||||
void sprawdzPostepGry();
|
|
||||||
void ustalPozycjeGracza(GLfloat gracz_x, GLfloat gracz_z, short &grid_x, short &grid_z);
|
|
||||||
void ustawSiatkeNaWzorNieNadpisujacPostepu();
|
|
||||||
void nadpiszNowaSiatke(short nowy_wzor);
|
|
||||||
void tworzKratke(unsigned int grid_x, unsigned int grid_z, unsigned short grid_value);
|
|
||||||
void tworzKratkiZSiatki();
|
|
||||||
void aktualizujBiezacaKratke(short grid_x, short grid_z);
|
|
||||||
|
|
||||||
int polygonmode = 0;
|
int polygonmode = 0;
|
||||||
std::time_t lastTime = std::time(nullptr);
|
std::time_t lastTime = std::time(nullptr);
|
||||||
int monitormode = 1;
|
int monitormode = 1;
|
||||||
@@ -127,18 +119,18 @@ float CameraHeight = 50.0f; // Wysokość kamery
|
|||||||
float MoveSpeed = 0.5f; // Prędkość poruszania się
|
float MoveSpeed = 0.5f; // Prędkość poruszania się
|
||||||
|
|
||||||
|
|
||||||
float velocity = 0.0f; // Aktualna prędkość łazika
|
float velocity = 0.0f; // Aktualna prędkość łazika
|
||||||
float rotationVelocity = 0.0f; // Prędkość obrotu łazika
|
float rotationVelocity = 0.0f; // Prędkość obrotu łazika
|
||||||
|
|
||||||
|
|
||||||
const float friction = 0.05f; // Współczynnik tarcia (μ)
|
const float friction = 0.05f; // Współczynnik tarcia (μ)
|
||||||
const float maxSpeed = 2.0f; // Maksymalna prędkość łazika
|
const float maxSpeed = 2.0f; // Maksymalna prędkość łazika
|
||||||
const float acceleration = 0.2f;
|
const float acceleration = 0.2f;
|
||||||
|
|
||||||
|
|
||||||
float rotationAcceleration = 0.075f; // Przyspieszenie obrotu
|
float rotationAcceleration = 0.075f; // Przyspieszenie obrotu
|
||||||
float rotationFriction = 0.1f; // Współczynnik tarcia obrotu
|
float rotationFriction = 0.1f; // Współczynnik tarcia obrotu
|
||||||
float maxRotationSpeed = 0.5f; // Maksymalna prędkość obrotu
|
float maxRotationSpeed = 0.5f; // Maksymalna prędkość obrotu
|
||||||
|
|
||||||
// Struktura do reprezentacji płotu
|
// Struktura do reprezentacji płotu
|
||||||
struct Plot {
|
struct Plot {
|
||||||
@@ -150,24 +142,24 @@ struct Plot {
|
|||||||
bool mod_x; // 0 - płot pionowy, 1 - płot poziomy
|
bool mod_x; // 0 - płot pionowy, 1 - płot poziomy
|
||||||
};
|
};
|
||||||
|
|
||||||
// Funkcja sprawdzająca kolizję z płotem
|
|
||||||
// Funkcja sprawdzająca kolizję z płotem, uwzględniając wymiary łazika
|
// Funkcja sprawdzająca kolizję z płotem, uwzględniając wymiary łazika
|
||||||
static bool CheckFenceCollision(float roverXMin, float roverXMax, float roverZMin, float roverZMax, const Plot& plot) {
|
static bool CheckFenceCollision(float roverXMin, float roverXMax, float roverZMin, float roverZMax, const Plot& plot) {
|
||||||
if (plot.mod_x == 0) { // Płot pionowy (równoległy do osi Z)
|
if (plot.mod_x == 0) { // Płot pionowy (równoległy do osi Z)
|
||||||
float xMin = plot.xc - plot.gruboscY / 2.0f;
|
float xMin = plot.xc - plot.gruboscY / 2.0f;
|
||||||
float xMax = plot.xc + plot.gruboscY / 2.0f;
|
float xMax = plot.xc + plot.gruboscY / 2.0f;
|
||||||
float zMin = plot.zc - plot.length / 2.0f;
|
float zMin = plot.zc - plot.length / 2.0f;
|
||||||
float zMax = plot.zc + plot.length / 2.0f;
|
float zMax = plot.zc + plot.length / 2.0f;
|
||||||
|
|
||||||
// Sprawdzenie, czy którykolwiek fragment łazika wchodzi w obszar płotu
|
// Sprawdzenie, czy którykolwiek fragment łazika wchodzi w obszar płotu
|
||||||
if (roverXMax >= xMin && roverXMin <= xMax && // Kolizja w osi X
|
if (roverXMax >= xMin && roverXMin <= xMax && // Kolizja w osi X
|
||||||
roverZMax >= zMin && roverZMin <= zMax) { // Kolizja w osi Z
|
roverZMax >= zMin && roverZMin <= zMax) { // Kolizja w osi Z
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else { // Płot poziomy (równoległy do osi X)
|
|
||||||
float xMin = plot.xc - plot.length / 2.0f;
|
// Płot poziomy (równoległy do osi X)
|
||||||
float xMax = plot.xc + plot.length / 2.0f;
|
float xMin = plot.xc - plot.length / 2.0f;
|
||||||
|
float xMax = plot.xc + plot.length / 2.0f;
|
||||||
float zMin = plot.zc - plot.gruboscY / 2.0f;
|
float zMin = plot.zc - plot.gruboscY / 2.0f;
|
||||||
float zMax = plot.zc + plot.gruboscY / 2.0f;
|
float zMax = plot.zc + plot.gruboscY / 2.0f;
|
||||||
|
|
||||||
@@ -182,148 +174,163 @@ static bool CheckFenceCollision(float roverXMin, float roverXMax, float roverZMi
|
|||||||
|
|
||||||
// Funkcja ogólna do sprawdzania kolizji ze wszystkimi płotami
|
// Funkcja ogólna do sprawdzania kolizji ze wszystkimi płotami
|
||||||
static bool CheckAllFencesCollision(float roverXMin, float roverXMax, float roverZMin, float roverZMax, const std::vector<Plot>& fences) {
|
static bool CheckAllFencesCollision(float roverXMin, float roverXMax, float roverZMin, float roverZMax, const std::vector<Plot>& fences) {
|
||||||
for (const auto& fence : fences) {
|
for (const auto& fence: fences) {
|
||||||
if (CheckFenceCollision(roverXMin, roverXMax, roverZMin, roverZMax, fence)) {
|
if (CheckFenceCollision(roverXMin, roverXMax, roverZMin, roverZMax, fence)) {
|
||||||
return true; // Kolizja wykryta z którymś płotem
|
// Kolizja wykryta z którymś płotem
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false; // Brak kolizji
|
return false; // Brak kolizji
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UpdateRover(const std::vector<Plot>& fences) {
|
static void UpdateRover(const std::vector<Plot>& fences) {
|
||||||
// Przyspieszanie w przód
|
|
||||||
if (keyWPressed) {
|
|
||||||
velocity += acceleration;
|
|
||||||
if (velocity > maxSpeed) velocity = maxSpeed;
|
|
||||||
}
|
|
||||||
// Przyspieszanie w tył
|
|
||||||
else if (keySPressed) {
|
|
||||||
velocity -= acceleration;
|
|
||||||
if (velocity < -maxSpeed) velocity = -maxSpeed;
|
|
||||||
}
|
|
||||||
// Hamowanie (wytracanie prędkości z powodu tarcia)
|
|
||||||
else {
|
|
||||||
if (velocity > 0) {
|
|
||||||
velocity -= friction;
|
|
||||||
if (velocity < 0) velocity = 0;
|
|
||||||
}
|
|
||||||
else if (velocity < 0) {
|
|
||||||
velocity += friction;
|
|
||||||
if (velocity > 0) velocity = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Obracanie (rotacja z driftowaniem)
|
if (keyWPressed) {
|
||||||
if (keyAPressed) {
|
|
||||||
rotationVelocity += rotationAcceleration;
|
|
||||||
if (rotationVelocity > maxRotationSpeed) rotationVelocity = maxRotationSpeed;
|
|
||||||
}
|
|
||||||
else if (keyDPressed) {
|
|
||||||
rotationVelocity -= rotationAcceleration;
|
|
||||||
if (rotationVelocity < -maxRotationSpeed) rotationVelocity = -maxRotationSpeed;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Jeśli żadna z klawiszy A/D nie jest wciśnięta, to stopniowo spowalniamy rotację (drift)
|
|
||||||
float driftFactor = 0.1f; // Mniejsza wartość = dłuższy drift
|
|
||||||
if (rotationVelocity > 0) {
|
|
||||||
rotationVelocity -= rotationFriction * driftFactor;
|
|
||||||
if (rotationVelocity < 0) rotationVelocity = 0;
|
|
||||||
}
|
|
||||||
else if (rotationVelocity < 0) {
|
|
||||||
rotationVelocity += rotationFriction * driftFactor;
|
|
||||||
if (rotationVelocity > 0) rotationVelocity = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wyliczenie nowej pozycji na podstawie prędkości
|
// Przyspieszanie w przód
|
||||||
float radRotation = Rotation * GL_PI / 180.0f; // Przeliczamy rotację na radiany
|
velocity += acceleration;
|
||||||
float newSides = Sides - velocity * cos(radRotation); // Nowa pozycja w osi X
|
if (velocity > maxSpeed) velocity = maxSpeed;
|
||||||
float newFoward = Foward - velocity * sin(radRotation); // Nowa pozycja w osi Z
|
|
||||||
|
|
||||||
// Wymiary łazika (połówki w osi X i Z)
|
} else if (keySPressed) {
|
||||||
const float roverHalfWidthX = 19.0f; // 38/2
|
|
||||||
const float roverHalfLengthZ = 12.0f; // 24/2
|
|
||||||
|
|
||||||
// Wyliczenie obszaru zajmowanego przez łazik
|
// Przyspieszanie w tył
|
||||||
float roverXMin = newSides - roverHalfWidthX;
|
velocity -= acceleration;
|
||||||
float roverXMax = newSides + roverHalfWidthX;
|
if (velocity < -maxSpeed) velocity = -maxSpeed;
|
||||||
float roverZMin = newFoward - roverHalfLengthZ;
|
|
||||||
float roverZMax = newFoward + roverHalfLengthZ;
|
|
||||||
|
|
||||||
// Sprawdzanie kolizji przed aktualizacją pozycji
|
} else {
|
||||||
if (!Kolizja == true) {
|
|
||||||
if (CheckAllFencesCollision(roverZMin, roverZMax, roverXMin, roverXMax, fences)) {
|
|
||||||
// Jeśli jest kolizja, zatrzymujemy łazik
|
|
||||||
velocity = 0.0f;
|
|
||||||
//cout << "Kolizja podczas ruchu\n";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Jeśli brak kolizji, aktualizujemy pozycję
|
|
||||||
Sides = newSides;
|
|
||||||
Foward = newFoward;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sprawdzanie kolizji podczas obrotu
|
// Hamowanie (wytracanie prędkości z powodu tarcia)
|
||||||
if (rotationVelocity != 0.0f) {
|
if (velocity > 0) {
|
||||||
// Wyliczamy nową rotację
|
|
||||||
float newRotation = Rotation + rotationVelocity;
|
|
||||||
float radNewRotation = newRotation * GL_PI / 180.0f;
|
|
||||||
|
|
||||||
// Obracamy narożniki łazika
|
velocity -= friction;
|
||||||
std::vector<std::pair<float, float>> corners(4);
|
if (velocity < 0) velocity = 0;
|
||||||
corners[0] = {Sides - roverHalfWidthX, Foward - roverHalfLengthZ}; // Lewy dolny
|
|
||||||
corners[1] = {Sides + roverHalfWidthX, Foward - roverHalfLengthZ}; // Prawy dolny
|
} else if (velocity < 0) {
|
||||||
corners[2] = {Sides - roverHalfWidthX, Foward + roverHalfLengthZ}; // Lewy górny
|
|
||||||
corners[3] = {Sides + roverHalfWidthX, Foward + roverHalfLengthZ}; // Prawy górny
|
velocity += friction;
|
||||||
|
if (velocity > 0) velocity = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Obracanie (rotacja z driftowaniem)
|
||||||
|
if (keyAPressed) {
|
||||||
|
|
||||||
|
rotationVelocity += rotationAcceleration;
|
||||||
|
if (rotationVelocity > maxRotationSpeed) rotationVelocity = maxRotationSpeed;
|
||||||
|
|
||||||
|
} else if (keyDPressed) {
|
||||||
|
|
||||||
|
rotationVelocity -= rotationAcceleration;
|
||||||
|
if (rotationVelocity < -maxRotationSpeed) rotationVelocity = -maxRotationSpeed;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Jeśli żaden z klawiszy A/D nie jest wciśnięty,
|
||||||
|
// to stopniowo spowalniamy rotację (drift)
|
||||||
|
|
||||||
|
// Mniejsza wartość = dłuższy drift
|
||||||
|
float driftFactor = 0.1f;
|
||||||
|
|
||||||
|
if (rotationVelocity > 0) {
|
||||||
|
|
||||||
|
rotationVelocity -= rotationFriction * driftFactor;
|
||||||
|
if (rotationVelocity < 0) rotationVelocity = 0;
|
||||||
|
|
||||||
|
} else if (rotationVelocity < 0) {
|
||||||
|
|
||||||
|
rotationVelocity += rotationFriction * driftFactor;
|
||||||
|
if (rotationVelocity > 0) rotationVelocity = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wyliczenie nowej pozycji na podstawie prędkości
|
||||||
|
float radRotation = Rotation * GL_PI / 180.0f; // Przeliczamy rotację na radiany
|
||||||
|
float newSides = Sides - velocity * cos(radRotation); // Nowa pozycja w osi X
|
||||||
|
float newFoward = Foward - velocity * sin(radRotation); // Nowa pozycja w osi Z
|
||||||
|
|
||||||
|
// Wymiary łazika (połówki w osi X i Z)
|
||||||
|
const float roverHalfWidthX = 19.0f; // 38/2
|
||||||
|
const float roverHalfLengthZ = 12.0f; // 24/2
|
||||||
|
|
||||||
|
// Wyliczenie obszaru zajmowanego przez łazik
|
||||||
|
float roverXMin = newSides - roverHalfWidthX;
|
||||||
|
float roverXMax = newSides + roverHalfWidthX;
|
||||||
|
float roverZMin = newFoward - roverHalfLengthZ;
|
||||||
|
float roverZMax = newFoward + roverHalfLengthZ;
|
||||||
|
|
||||||
|
// Sprawdzanie kolizji przed aktualizacją pozycji
|
||||||
|
if (!Kolizja) {
|
||||||
|
|
||||||
|
if (CheckAllFencesCollision(roverZMin, roverZMax, roverXMin, roverXMax, fences)) {
|
||||||
|
// Jeśli jest kolizja, zatrzymujemy łazik
|
||||||
|
// cout << "Kolizja podczas ruchu!\n";
|
||||||
|
velocity = 0.0f;
|
||||||
|
} else {
|
||||||
|
// Jeśli brak kolizji, aktualizujemy pozycję
|
||||||
|
Sides = newSides;
|
||||||
|
Foward = newFoward;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sprawdzanie kolizji podczas obrotu
|
||||||
|
if (rotationVelocity != 0.0f) {
|
||||||
|
// Wyliczamy nową rotację
|
||||||
|
float newRotation = Rotation + rotationVelocity;
|
||||||
|
float radNewRotation = newRotation * GL_PI / 180.0f;
|
||||||
|
|
||||||
|
// Obracamy narożniki łazika
|
||||||
|
std::vector<std::pair<float, float>> corners(4);
|
||||||
|
corners[0] = {Sides - roverHalfWidthX, Foward - roverHalfLengthZ}; // Lewy dolny
|
||||||
|
corners[1] = {Sides + roverHalfWidthX, Foward - roverHalfLengthZ}; // Prawy dolny
|
||||||
|
corners[2] = {Sides - roverHalfWidthX, Foward + roverHalfLengthZ}; // Lewy górny
|
||||||
|
corners[3] = {Sides + roverHalfWidthX, Foward + roverHalfLengthZ}; // Prawy górny
|
||||||
bool collisionDetected = false;
|
bool collisionDetected = false;
|
||||||
// Obracamy wszystkie narożniki
|
|
||||||
for (auto& corner : corners) {
|
// Obracamy wszystkie narożniki
|
||||||
|
for (auto& corner: corners) {
|
||||||
float x = corner.first;
|
float x = corner.first;
|
||||||
float z = corner.second;
|
float z = corner.second;
|
||||||
|
|
||||||
corner.first = Sides + (x - Sides) * cos(radNewRotation) - (z - Foward) * sin(radNewRotation);
|
corner.first = Sides + (x - Sides) * cos(radNewRotation) - (z - Foward) * sin(radNewRotation);
|
||||||
corner.second = Foward + (x - Sides) * sin(radNewRotation) + (z - Foward) * cos(radNewRotation);
|
corner.second = Foward + (x - Sides) * sin(radNewRotation) + (z - Foward) * cos(radNewRotation);
|
||||||
|
|
||||||
|
|
||||||
// Sprawdzamy kolizję na podstawie obróconych narożników
|
// Sprawdzamy kolizję na podstawie obróconych narożników
|
||||||
|
if (CheckAllFencesCollision( corner.first, corner.first, corner.second, corner.second, fences)) {
|
||||||
|
|
||||||
if (CheckAllFencesCollision(corner.first, corner.first, corner.second, corner.second, fences)) {
|
|
||||||
collisionDetected = true;
|
collisionDetected = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (CheckAllFencesCollision( corner.second, corner.second, corner.first, corner.first, fences)) {
|
if (CheckAllFencesCollision(corner.second, corner.second, corner.first, corner.first, fences)) {
|
||||||
collisionDetected = true;
|
collisionDetected = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collisionDetected) {
|
if (collisionDetected) {
|
||||||
rotationVelocity = 0.0f; // Zatrzymujemy obrót
|
//cout << "Kolizja podczas obrotu!\n";
|
||||||
//cout << "Kolizja podczas obrotu\n";
|
rotationVelocity = 0.0f; // Zatrzymujemy obrót
|
||||||
} else {
|
} else {
|
||||||
// Aktualizujemy rotację, jeśli nie ma kolizji
|
// Aktualizujemy rotację, jeśli nie ma kolizji
|
||||||
Rotation = newRotation;
|
Rotation = newRotation;
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
// Jeśli kolizje są wyłączone, aktualizujemy wszystko bez sprawdzania
|
} else {
|
||||||
Sides = newSides;
|
// Jeśli kolizje są wyłączone, aktualizujemy wszystko bez sprawdzania
|
||||||
Foward = newFoward;
|
Sides = newSides;
|
||||||
Rotation += rotationVelocity;
|
Foward = newFoward;
|
||||||
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
Rotation += rotationVelocity;
|
||||||
if (Rotation < 0.0f) Rotation += 360.0f;
|
if (Rotation >= 360.0f) Rotation -= 360.0f;
|
||||||
}
|
if (Rotation < 0.0f) Rotation += 360.0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<Plot> fences = {
|
std::vector<Plot> fences = {
|
||||||
{ 450.0f, 3.0f, -90.0f, 900.0f, 4.0f, 1}, // 1 - poziomo
|
{ 450.0f, 3.0f, -90.0f, 900.0f, 4.0f, 1}, // 1 - poziomo
|
||||||
{ 0.0f, 3.0f, 405.0f, 990.0f, 4.0f, 0}, // 0 - pionowo
|
{ 0.0f, 3.0f, 405.0f, 990.0f, 4.0f, 0}, // 0 - pionowo
|
||||||
@@ -438,15 +445,15 @@ void SetDCPixelFormat(HDC hDC) {
|
|||||||
PFD_DOUBLEBUFFER, // Double buffered
|
PFD_DOUBLEBUFFER, // Double buffered
|
||||||
PFD_TYPE_RGBA, // RGBA Color mode
|
PFD_TYPE_RGBA, // RGBA Color mode
|
||||||
24, // Want 24bit color
|
24, // Want 24bit color
|
||||||
0,0,0,0,0,0, // Not used to select mode
|
0, 0, 0, 0, 0, 0, // Not used to select mode
|
||||||
0,0, // Not used to select mode
|
0, 0, // Not used to select mode
|
||||||
0,0,0,0,0, // Not used to select mode
|
0, 0, 0, 0, 0, // Not used to select mode
|
||||||
32, // Size of depth buffer
|
32, // Size of depth buffer
|
||||||
0, // Not used to select mode
|
0, // Not used to select mode
|
||||||
0, // Not used to select mode
|
0, // Not used to select mode
|
||||||
PFD_MAIN_PLANE, // Draw in main plane
|
PFD_MAIN_PLANE, // Draw in main plane
|
||||||
0, // Not used to select mode
|
0, // Not used to select mode
|
||||||
0,0,0 }; // Not used to select mode
|
0, 0, 0 }; // Not used to select mode
|
||||||
|
|
||||||
// Choose a pixel format that best matches that described in pfd
|
// Choose a pixel format that best matches that described in pfd
|
||||||
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
|
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
|
||||||
@@ -461,16 +468,16 @@ plane mapa( 0.0f, 0.0f, 0.0f, "res/models/mapka3_nofence_noplatform.obj");
|
|||||||
|
|
||||||
static void SetupRC() {
|
static void SetupRC() {
|
||||||
// Light values and coordinates
|
// Light values and coordinates
|
||||||
GLfloat ambientLight[] = { 0.3f, 0.3f, 0.3f, 1.0f };
|
GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};
|
||||||
GLfloat diffuseLight[] = { 0.7f, 0.7f, 0.7f, 1.0f };
|
GLfloat diffuseLight[] = {0.7f, 0.7f, 0.7f, 1.0f};
|
||||||
GLfloat specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
GLfloat specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
GLfloat specref[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
GLfloat specref[] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
|
||||||
// Multiple light positions (for light coming from all sides)
|
// Multiple light positions (for light coming from all sides)
|
||||||
GLfloat lightPos1[] = { 50.0f, -100.0f, 50.0f, 1.0f }; // Light 0 position
|
GLfloat lightPos1[] = { 50.0f, -100.0f, 50.0f, 1.0f}; // Light 0 position
|
||||||
GLfloat lightPos2[] = { -50.0f, -100.0f, 50.0f, 1.0f }; // Light 1 position
|
GLfloat lightPos2[] = {-50.0f, -100.0f, 50.0f, 1.0f}; // Light 1 position
|
||||||
GLfloat lightPos3[] = { 50.0f, -100.0f, -50.0f, 1.0f }; // Light 2 position
|
GLfloat lightPos3[] = { 50.0f, -100.0f, -50.0f, 1.0f}; // Light 2 position
|
||||||
GLfloat lightPos4[] = { -50.0f, -100.0f, -50.0f, 1.0f }; // Light 3 position
|
GLfloat lightPos4[] = {-50.0f, -100.0f, -50.0f, 1.0f}; // Light 3 position
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST); // Hidden surface removal
|
glEnable(GL_DEPTH_TEST); // Hidden surface removal
|
||||||
glFrontFace(GL_CCW); // Counter clockwise polygons face out
|
glFrontFace(GL_CCW); // Counter clockwise polygons face out
|
||||||
@@ -566,18 +573,19 @@ void static RenderScene(void) {
|
|||||||
|
|
||||||
// Ustawienie trybu rysowania wielokątów
|
// Ustawienie trybu rysowania wielokątów
|
||||||
switch (polygonmode) {
|
switch (polygonmode) {
|
||||||
case 1:
|
case 1:
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Rysowanie linii
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Rysowanie linii
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // Wypełnianie poligonów
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // Wypełnianie poligonów
|
||||||
}
|
}
|
||||||
|
|
||||||
// Czyszczenie ekranu przed rysowaniem
|
// Czyszczenie ekranu przed rysowaniem
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
// Przywrócenie macierzy widoku
|
// Widok panoramiczny (SHIFT/F5)
|
||||||
if (panoramic_view) {
|
if (panoramic_view) {
|
||||||
|
// Zwiększ prędkość obrotu oraz tarcie
|
||||||
maxRotationSpeed = 1.0f;
|
maxRotationSpeed = 1.0f;
|
||||||
rotationFriction = 0.5f;
|
rotationFriction = 0.5f;
|
||||||
gluLookAt(
|
gluLookAt(
|
||||||
@@ -588,6 +596,7 @@ void static RenderScene(void) {
|
|||||||
0.0f, 1.0f, 0.0f // Wektor "góry"
|
0.0f, 1.0f, 0.0f // Wektor "góry"
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
// Ustaw tarcie i prędkość obrotu na domyślną wartość
|
||||||
maxRotationSpeed = 0.5f;
|
maxRotationSpeed = 0.5f;
|
||||||
rotationFriction = 0.1f;
|
rotationFriction = 0.1f;
|
||||||
gluLookAt(
|
gluLookAt(
|
||||||
@@ -602,8 +611,9 @@ void static RenderScene(void) {
|
|||||||
|
|
||||||
// Rysowanie mapy
|
// Rysowanie mapy
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glColor3f(0.0, 1.0, 0.0); // Zielony kolor
|
// glColor3f(0.0, 1.0, 0.0); // Zielony kolor
|
||||||
// mapa.draw(); // nie rysuj mapy/terenu .obj
|
// mapa.draw(); // nie rysuj mapy/terenu .obj
|
||||||
|
|
||||||
// Platforma niebędąca częścią siatki:
|
// Platforma niebędąca częścią siatki:
|
||||||
glColor3d(0.031, 0.51, 0.094); // ciemnozielony
|
glColor3d(0.031, 0.51, 0.094); // ciemnozielony
|
||||||
platforma(450.0f, 0.0f, -45.0f, 450.0f, 45.0f);
|
platforma(450.0f, 0.0f, -45.0f, 450.0f, 45.0f);
|
||||||
@@ -614,7 +624,7 @@ void static RenderScene(void) {
|
|||||||
glTranslatef(Foward, 0.0f, Sides); // Translacja łazika
|
glTranslatef(Foward, 0.0f, Sides); // Translacja łazika
|
||||||
glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika
|
glRotatef(Rotation, 0.0f, 1.0f, 0.0f); // Obrót łazika
|
||||||
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(); // Rysuj łazik z pomocą lazik.cpp
|
||||||
UpdateRover(fences);
|
UpdateRover(fences);
|
||||||
fpsCounter.update();
|
fpsCounter.update();
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
@@ -622,6 +632,7 @@ void static RenderScene(void) {
|
|||||||
// std::cout << "X: " << Foward << " Z: " << Sides << " Rotation: " << Rotation << "\n";
|
// std::cout << "X: " << Foward << " Z: " << Sides << " Rotation: " << Rotation << "\n";
|
||||||
|
|
||||||
// Rysowanie innych obiektów
|
// Rysowanie innych obiektów
|
||||||
|
// 1 pole siatki = 90x90m
|
||||||
plot( 450.0f, 3.0f, -90.0f, 900.0f, 4.0f, 1); // 1 - poziomo
|
plot( 450.0f, 3.0f, -90.0f, 900.0f, 4.0f, 1); // 1 - poziomo
|
||||||
plot( 0.0f, 3.0f, 405.0f, 990.0f, 4.0f, 0); // 0 - pionowo
|
plot( 0.0f, 3.0f, 405.0f, 990.0f, 4.0f, 0); // 0 - pionowo
|
||||||
plot( 450.0f, 3.0f, 10*90.0f, 900.0f, 4.0f, 1); // 1 - poziomo
|
plot( 450.0f, 3.0f, 10*90.0f, 900.0f, 4.0f, 1); // 1 - poziomo
|
||||||
@@ -629,7 +640,6 @@ void static RenderScene(void) {
|
|||||||
stodola(45.0f, 0.0f, -45.0f, 70.0f);
|
stodola(45.0f, 0.0f, -45.0f, 70.0f);
|
||||||
|
|
||||||
// Mechanika gry
|
// Mechanika gry
|
||||||
// 1 pole siatki = 90x90m
|
|
||||||
short grid_x, grid_z;
|
short grid_x, grid_z;
|
||||||
ustalPozycjeGracza(Foward, Sides, grid_x, grid_z);
|
ustalPozycjeGracza(Foward, Sides, grid_x, grid_z);
|
||||||
// std::cout << "grid_X: " << grid_x << " grid_Z: " << grid_z << " status: " << siatka[10*grid_x + (9 - grid_z)] << "\n";
|
// std::cout << "grid_X: " << grid_x << " grid_Z: " << grid_z << " status: " << siatka[10*grid_x + (9 - grid_z)] << "\n";
|
||||||
@@ -721,7 +731,9 @@ HPALETTE static GetOpenGLPalette(HDC hDC) {
|
|||||||
// Return the handle to the new palette
|
// Return the handle to the new palette
|
||||||
return hRetPal;
|
return hRetPal;
|
||||||
}
|
}
|
||||||
|
|
||||||
void static CreateConsole() {
|
void static CreateConsole() {
|
||||||
|
|
||||||
// Tworzenie nowej konsoli
|
// Tworzenie nowej konsoli
|
||||||
if (AllocConsole()) {
|
if (AllocConsole()) {
|
||||||
// Przekierowanie standardowych strumieni do konsoli
|
// Przekierowanie standardowych strumieni do konsoli
|
||||||
@@ -731,76 +743,76 @@ void static CreateConsole() {
|
|||||||
freopen_s(&conin, "conin$", "r", stdin);
|
freopen_s(&conin, "conin$", "r", stdin);
|
||||||
freopen_s(&conout, "conout$", "w", stdout);
|
freopen_s(&conout, "conout$", "w", stdout);
|
||||||
freopen_s(&conerr, "conout$", "w", stderr);
|
freopen_s(&conerr, "conout$", "w", stderr);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
MessageBox(NULL, "Nie udalo sie utworzyc konsoli.", "Blad", MB_OK | MB_ICONERROR);
|
MessageBox(NULL, "Nie udalo sie utworzyc konsoli.", "Blad", MB_OK | MB_ICONERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
|
||||||
CreateConsole();
|
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
||||||
MSG msg; // Windows message structure
|
|
||||||
WNDCLASS wc{}; // Windows class structure
|
CreateConsole();
|
||||||
HWND hWnd; // Storeage for window handle
|
MSG msg; // Windows message structure
|
||||||
|
WNDCLASS wc{}; // Windows class structure
|
||||||
|
HWND hWnd; // Storeage for window handle
|
||||||
|
|
||||||
|
hInstance = hInst;
|
||||||
|
|
||||||
|
// Register Window style
|
||||||
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
|
wc.lpfnWndProc = (WNDPROC)WndProc;
|
||||||
|
wc.cbClsExtra = 0;
|
||||||
|
wc.cbWndExtra = 0;
|
||||||
|
wc.hInstance = hInstance;
|
||||||
|
wc.hIcon = NULL;
|
||||||
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||||
|
|
||||||
|
// No need for background brush for OpenGL window
|
||||||
|
wc.hbrBackground = NULL;
|
||||||
|
|
||||||
|
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
|
||||||
|
wc.lpszClassName = lpszAppName;
|
||||||
|
|
||||||
|
// Register the window class
|
||||||
|
if (RegisterClass(&wc) == 0) return FALSE;
|
||||||
|
|
||||||
|
|
||||||
hInstance = hInst;
|
// Create the main application window
|
||||||
|
hWnd = CreateWindow(
|
||||||
|
lpszAppName,
|
||||||
|
lpszAppName,
|
||||||
|
|
||||||
// Register Window style
|
// OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS
|
||||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
||||||
wc.lpfnWndProc = (WNDPROC)WndProc;
|
|
||||||
wc.cbClsExtra = 0;
|
|
||||||
wc.cbWndExtra = 0;
|
|
||||||
wc.hInstance = hInstance;
|
|
||||||
wc.hIcon = NULL;
|
|
||||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
||||||
|
|
||||||
// No need for background brush for OpenGL window
|
// Window position and size
|
||||||
wc.hbrBackground = NULL;
|
50, 50,
|
||||||
|
800, 800,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
hInstance,
|
||||||
|
NULL);
|
||||||
|
|
||||||
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
|
// If window was not created, quit
|
||||||
wc.lpszClassName = lpszAppName;
|
if (hWnd == NULL) return FALSE;
|
||||||
|
|
||||||
// Register the window class
|
|
||||||
if (RegisterClass(&wc) == 0) return FALSE;
|
|
||||||
|
|
||||||
|
|
||||||
// Create the main application window
|
const WORD ID_TIMER = 1;
|
||||||
hWnd = CreateWindow(
|
SetTimer(hWnd, ID_TIMER, 100, NULL);
|
||||||
lpszAppName,
|
|
||||||
lpszAppName,
|
|
||||||
|
|
||||||
// OpenGL requires WS_CLIPCHILDREN and WS_CLIPSIBLINGS
|
// Display the window
|
||||||
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
|
ShowWindow(hWnd, SW_SHOW);
|
||||||
|
UpdateWindow(hWnd);
|
||||||
|
|
||||||
// Window position and size
|
// Process application messages until the application closes
|
||||||
50, 50,
|
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||||
800, 800,
|
TranslateMessage(&msg);
|
||||||
NULL,
|
DispatchMessage(&msg);
|
||||||
NULL,
|
|
||||||
hInstance,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
// If window was not created, quit
|
|
||||||
if (hWnd == NULL) return FALSE;
|
|
||||||
|
|
||||||
|
|
||||||
const WORD ID_TIMER = 1;
|
|
||||||
SetTimer(hWnd, ID_TIMER, 100, NULL);
|
|
||||||
// Display the window
|
|
||||||
|
|
||||||
|
|
||||||
ShowWindow(hWnd, SW_SHOW);
|
|
||||||
UpdateWindow(hWnd);
|
|
||||||
|
|
||||||
// Process application messages until the application closes
|
|
||||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
|
||||||
TranslateMessage(&msg);
|
|
||||||
DispatchMessage(&msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
return msg.wParam;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return msg.wParam;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Window procedure, handles all messages for this program
|
// Window procedure, handles all messages for this program
|
||||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||||
@@ -811,6 +823,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
switch (message) {
|
switch (message) {
|
||||||
// Window creation, setup for OpenGL
|
// Window creation, setup for OpenGL
|
||||||
case WM_CREATE:
|
case WM_CREATE:
|
||||||
|
|
||||||
// Store the device context
|
// Store the device context
|
||||||
hDC = GetDC(hWnd);
|
hDC = GetDC(hWnd);
|
||||||
|
|
||||||
@@ -903,8 +916,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
// Window is being destroyed, cleanup
|
// Window is being destroyed, cleanup
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
user.unload();
|
|
||||||
|
|
||||||
|
user.unload();
|
||||||
//glDeleteProgram(programID);
|
//glDeleteProgram(programID);
|
||||||
//glDeleteVertexArrays(1, &VertexArrayID);
|
//glDeleteVertexArrays(1, &VertexArrayID);
|
||||||
|
|
||||||
@@ -922,6 +935,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
// Window is resized.
|
// Window is resized.
|
||||||
case WM_SIZE:
|
case WM_SIZE:
|
||||||
|
|
||||||
// Call our function which modifies the clipping
|
// Call our function which modifies the clipping
|
||||||
// volume and viewport
|
// volume and viewport
|
||||||
ChangeSize(LOWORD(lParam), HIWORD(lParam));
|
ChangeSize(LOWORD(lParam), HIWORD(lParam));
|
||||||
@@ -939,13 +953,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
// Validate the newly painted client area
|
// Validate the newly painted client area
|
||||||
if (!monitormode) ValidateRect(hWnd, NULL);
|
if (!monitormode) ValidateRect(hWnd, NULL);
|
||||||
else InvalidateRect(hWnd, NULL, FALSE);
|
else InvalidateRect(hWnd, NULL, FALSE);
|
||||||
//break;
|
break;
|
||||||
|
|
||||||
// Limit FPS
|
|
||||||
// Uaktualniaj FPS
|
|
||||||
// Ogranicz FPS
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case WM_QUERYNEWPALETTE:
|
case WM_QUERYNEWPALETTE:
|
||||||
// If the palette was created.
|
// If the palette was created.
|
||||||
@@ -982,8 +990,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
// Remap the current colors to the newly realized palette
|
// Remap the current colors to the newly realized palette
|
||||||
UpdateColors(hDC);
|
UpdateColors(hDC);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
break;
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
|
|
||||||
switch (wParam) {
|
switch (wParam) {
|
||||||
|
|||||||
Reference in New Issue
Block a user