2022-06-05 02:17:49 +03:00
|
|
|
#include "maze.h"
|
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
|
|
|
|
#include <GL/gl.h>
|
|
|
|
#include <GL/glu.h>
|
|
|
|
#include <GL/glut.h>
|
|
|
|
|
|
|
|
#include "utils.hpp"
|
|
|
|
|
|
|
|
MazeScreen::MazeScreen(const std::vector<std::vector<int>>& maze):
|
|
|
|
maze(maze),
|
|
|
|
angleX(0),
|
|
|
|
mouseCapture(false),
|
2022-06-05 14:00:53 +03:00
|
|
|
posX(9999),
|
|
|
|
posZ(9999),
|
|
|
|
solid(true) {
|
|
|
|
for (int i = 0; i < maze.size(); i++) {
|
|
|
|
for (int j = 0; j < maze[i].size(); j++) {
|
|
|
|
if (maze[i][j] == 0 && j < posZ) {
|
|
|
|
posX = i;
|
|
|
|
posZ = j;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-06-05 02:17:49 +03:00
|
|
|
|
|
|
|
void MazeScreen::display() {
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glLoadIdentity();
|
|
|
|
|
|
|
|
//configures the camera with the position_x and position_z variables
|
|
|
|
gluLookAt(
|
|
|
|
posX,
|
|
|
|
0,
|
|
|
|
posZ,
|
2022-06-05 11:17:28 +03:00
|
|
|
posX + cos(Utils::toRad<float>(angleX)) * 3,
|
2022-06-05 02:17:49 +03:00
|
|
|
0,
|
2022-06-05 11:17:28 +03:00
|
|
|
posZ - sin(Utils::toRad<float>(angleX)) * 3,
|
2022-06-05 02:17:49 +03:00
|
|
|
0,
|
|
|
|
1,
|
|
|
|
0
|
|
|
|
);
|
|
|
|
|
|
|
|
for (int i = 0; i < maze.size(); i++) {
|
|
|
|
for (int j = 0; j < maze[i].size(); j++) {
|
2022-06-05 14:00:53 +03:00
|
|
|
// Draw floor
|
|
|
|
glPushMatrix();
|
|
|
|
glColor3ub(0x33, 0x33, 0x33);
|
|
|
|
glTranslatef(i, -1, j);
|
|
|
|
glutSolidCube(1);
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
float green, blue;
|
2022-06-05 02:17:49 +03:00
|
|
|
switch (maze[i][j]) {
|
|
|
|
case -1:
|
|
|
|
glPushMatrix();
|
|
|
|
glColor3f(1, 0, 0);
|
|
|
|
glTranslatef(i, 0, j);
|
|
|
|
glutWireCube(1);
|
|
|
|
glPopMatrix();
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
glPushMatrix();
|
2022-06-05 10:48:40 +03:00
|
|
|
|
|
|
|
glTranslatef(i, 0, j);
|
|
|
|
|
2022-06-05 02:17:49 +03:00
|
|
|
// Scale green by X
|
2022-06-05 14:00:53 +03:00
|
|
|
green = Utils::clamp<float>(Utils::nummap<float>(abs(i - posX), 0, 3, 0, 1), 0, 1);
|
2022-06-05 02:17:49 +03:00
|
|
|
// Scale blue by Z
|
2022-06-05 14:00:53 +03:00
|
|
|
blue = Utils::clamp<float>(Utils::nummap<float>(abs(j - posZ), 0, 3, 0, 1), 0, 1);
|
2022-06-05 10:48:40 +03:00
|
|
|
|
2022-06-05 02:17:49 +03:00
|
|
|
glColor3f(1, green, blue);
|
2022-06-05 10:48:40 +03:00
|
|
|
glutWireCube(1);
|
2022-06-05 02:17:49 +03:00
|
|
|
if (solid) {
|
2022-06-05 10:48:40 +03:00
|
|
|
glColor3f(1, green, blue);
|
2022-06-05 02:17:49 +03:00
|
|
|
glutSolidCube(1);
|
|
|
|
}
|
2022-06-05 10:48:40 +03:00
|
|
|
|
2022-06-05 14:00:53 +03:00
|
|
|
glPopMatrix();
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
glPushMatrix();
|
|
|
|
glColor3ub(0xee, 0xee, 0x00);
|
|
|
|
glTranslatef(i, -1, j);
|
|
|
|
glutSolidCube(1);
|
2022-06-05 02:17:49 +03:00
|
|
|
glPopMatrix();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
glFlush();
|
|
|
|
glutSwapBuffers();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MazeScreen::keyboard(unsigned char key, int x, int y) {
|
|
|
|
if (key == '\e') {
|
|
|
|
mouseCapture = false;
|
|
|
|
glutSetCursor(GLUT_CURSOR_INHERIT);
|
|
|
|
}
|
|
|
|
else if (key == ' ') {
|
2022-06-05 14:00:53 +03:00
|
|
|
solid = false;
|
2022-06-05 02:17:49 +03:00
|
|
|
}
|
|
|
|
else if (key == 'w') {
|
|
|
|
forceX += 1;
|
|
|
|
}
|
|
|
|
else if (key == 's') {
|
|
|
|
forceX -= 1;
|
|
|
|
}
|
|
|
|
else if (key == 'a') {
|
|
|
|
forceZ -= 1;
|
|
|
|
}
|
|
|
|
else if (key == 'd') {
|
|
|
|
forceZ += 1;
|
|
|
|
}
|
|
|
|
glutPostRedisplay();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MazeScreen::keyboardUp(unsigned char key, int x, int y) {
|
|
|
|
if (key == 'w') {
|
|
|
|
forceX -= 1;
|
|
|
|
}
|
|
|
|
else if (key == 's') {
|
|
|
|
forceX += 1;
|
|
|
|
}
|
|
|
|
else if (key == 'a') {
|
|
|
|
forceZ += 1;
|
|
|
|
}
|
|
|
|
else if (key == 'd') {
|
|
|
|
forceZ -= 1;
|
|
|
|
}
|
2022-06-05 14:00:53 +03:00
|
|
|
else if (key == ' ') {
|
|
|
|
solid = true;
|
|
|
|
}
|
|
|
|
|
2022-06-05 02:17:49 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
int gameTime;
|
|
|
|
|
|
|
|
void MazeScreen::idle() {
|
|
|
|
int newTime = glutGet(GLUT_ELAPSED_TIME);
|
|
|
|
auto deltaTime = (newTime - gameTime) / 1000.0;
|
|
|
|
gameTime = newTime;
|
|
|
|
|
2022-06-05 11:17:28 +03:00
|
|
|
posX += forceX * deltaTime * cos(Utils::toRad<float>(angleX)) + forceZ * deltaTime * sin(Utils::toRad<float>(angleX));
|
|
|
|
posZ += forceZ * deltaTime * cos(Utils::toRad<float>(angleX)) - forceX * deltaTime * sin(Utils::toRad<float>(angleX));
|
2022-06-05 02:17:49 +03:00
|
|
|
|
|
|
|
glutPostRedisplay();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MazeScreen::passiveMotion(int x, int y) {
|
|
|
|
if (mouseCapture) {
|
|
|
|
auto centerX = glutGet(GLUT_WINDOW_WIDTH) / 2;
|
|
|
|
auto centerY = glutGet(GLUT_WINDOW_HEIGHT) / 2;
|
|
|
|
|
|
|
|
auto diffX = x - centerX;
|
|
|
|
auto diffY = x - centerY;
|
|
|
|
|
|
|
|
// only left-right movement
|
|
|
|
angleX -= diffX;
|
|
|
|
|
|
|
|
if (x != centerX || y != centerY) {
|
|
|
|
glutWarpPointer(centerX, centerY);
|
|
|
|
}
|
|
|
|
glutPostRedisplay();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MazeScreen::mouse(int button, int state, int x, int y) {
|
|
|
|
if (button == GLUT_LEFT_BUTTON) {
|
|
|
|
auto centerX = glutGet(GLUT_WINDOW_WIDTH) / 2;
|
|
|
|
auto centerY = glutGet(GLUT_WINDOW_HEIGHT) / 2;
|
|
|
|
glutWarpPointer(centerX, centerY);
|
|
|
|
mouseCapture = true;
|
|
|
|
glutSetCursor(GLUT_CURSOR_NONE);
|
|
|
|
}
|
|
|
|
else if (button == GLUT_RIGHT_BUTTON) {
|
|
|
|
mouseCapture = false;
|
|
|
|
glutSetCursor(GLUT_CURSOR_INHERIT);
|
|
|
|
}
|
|
|
|
}
|