Files
TheSubterranean/src/game.cpp

254 lines
10 KiB
C++

#include "game.h"
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void calcCollision(Player* &player, Object* object) {
c2Manifold manifold;
c2AABBtoAABBManifold(player->playerBody, object->objectBody, &manifold);
if (manifold.count > 0) {
if (manifold.n.y == 1) {
player->onGround++;
player->vSpeed = 0.0f;
player->Position.y = object->Position.y - player->Size.y;
}
if (manifold.n.y == -1) {
player->Position.y = object->Position.y + object->Size.y -50.0f;
player->vSpeed = -player->vSpeed * .3f;
}
if (manifold.n.x == 1) {
player->Position.x = object->Position.x - player->Size.x + 50.0f;
player->hSpeed = -player->hSpeed*0.01f;
}
if (manifold.n.x == -1) {
player->Position.x = object->Position.x + object->Size.x - 50.0f;
player->hSpeed = -player->hSpeed * 0.01f;
}
}
};
void calcCollisionE(Enemy*& enemy, Object* object) {
c2Manifold manifold;
c2AABBtoAABBManifold(enemy->EnemyBody, object->objectBody, &manifold);
if (manifold.count > 0) {
if (manifold.n.y == 1) {
enemy->onGround++;
enemy->vSpeed = 0.0f;
enemy->Position.y = object->Position.y - enemy->Size.y;
}
if (manifold.n.y == -1) {
enemy->Position.y = object->Position.y + object->Size.y - 50.0f;
enemy->vSpeed = -enemy->vSpeed * .3f;
}
if (manifold.n.x == 1) {
enemy->Position.x = object->Position.x - enemy->Size.x + 50.0f;
enemy->hSpeed = -enemy->hSpeed * 0.01f;
}
if (manifold.n.x == -1) {
enemy->Position.x = object->Position.x + object->Size.x - 50.0f;
enemy->hSpeed = -enemy->hSpeed * 0.01f;
}
}
};
//constructor & destructor
Game::Game(const unsigned int SCR_WIDTH, const unsigned int SCR_HEIGHT, const char* name)
:scrWidth(SCR_WIDTH), scrHeight(SCR_HEIGHT)
{
//initialise window
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//create window
window = glfwCreateWindow(scrWidth, scrHeight, name, NULL, NULL);
glfwMakeContextCurrent(window);
//set callbacks
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// glad: load all OpenGL function pointers
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
}
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// Setup Dear ImGui style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer bindings
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init((char*)glGetString(GL_NUM_SHADING_LANGUAGE_VERSIONS));
}
Game::~Game() {
}
//Game state
void Game::init()
{
//----------testing-----------
//----------testing-----------
//create shader object
Shader shader = ResourceManager::LoadShader("shaders/shader.vert", "shaders/shader.frag", nullptr, "shader");
//perspective projection
//glm::mat4 projection;
//projection = glm::perspective(glm::radians(45.0f), 1920.0f/ 1080.0f , 0.0f, 1.0f);
glm::mat4 projection = glm::ortho(0.0f, scrWidth, scrHeight, 0.0f, -1.0f, 1.0f);
ResourceManager::GetShader("shader").Use();
glUniform1i(glGetUniformLocation(ResourceManager::GetShader("shader").ID, "image"), 0);
glUniformMatrix4fv(glGetUniformLocation(ResourceManager::GetShader("shader").ID, "projection"), 1, GL_FALSE, glm::value_ptr(projection));
//ResourceManager::LoadTexture("art/dirt.png", "dirtTexture");
renderer = new SpriteRenderer(shader);
player = new Player(glm::vec2(0.0f, 2000.0f), glm::vec2(192.0f, 192.0f));
enemy = new Enemy(glm::vec2(100.0f, 2100.0f), glm::vec2(192.0f/2, 192.0f/2));
world = new World("terrainFile/terrain.txt", glm::vec2(32.0f,32.0f));
//dirtBlock = new Object(glm::vec2(71-0.0-710, 700.0), glm::vec2(1600.0, 512.0));
//dirtBlock1 = new Object(glm::vec2(1210.0-100.0, 200.0+250.0-300), glm::vec2(32.0 , 32.0));
}
//--------imgui--------
void Game::renderImgui() {
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
{
ImGui::Begin("babyboigame");
ImGui::Text("Very nice game info window hmhmhmh tetyeysyessss");
ImGui::SliderFloat("Height", &player->Position.y, 0.0f, 4000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("MaxGrav", &player->maxGravity, 0.0f, 4000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("Grav", &player->gravity, 0.0f, 2000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("Leg boi", &player->jumpStrength, 0.0f, -3000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("maxWalki", &player->maxWalkingSpeed, 0.0f, 10000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("maxriunnkmmm", &player->maxRunningSpeed, 0.0f, 10000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("walkaccilatraion oui", &player->hAcceleration, 0.0f, 10000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::SliderFloat("walkdeaccilatraion oui", &player->hDeacceleration, 0.0f, 5000.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
}
//Gameloop
void Game::handleEvents(float dt)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
if (enemy->vSpeed > enemy->maxSpeed) { enemy->vSpeed = enemy->maxSpeed; }
else { enemy->vSpeed += 1.0f * enemy->hAcceleration * dt; }
}
else if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
if (enemy->vSpeed < -enemy->maxSpeed) { enemy->vSpeed = -enemy->maxSpeed; }
else { enemy->vSpeed -= 1.0f * enemy->hAcceleration * dt; }
}
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
if (player->hSpeed > player->maxSpeed) { player->hSpeed = player->maxSpeed; }
else { player->hSpeed += 1.0f * player->hAcceleration *dt; }
player->direction = 1;
if (enemy->hSpeed > enemy->maxSpeed) { enemy->hSpeed = enemy->maxSpeed; }
else { enemy->hSpeed += 1.0f * enemy->hAcceleration * dt; }
enemy->direction = 1;
}
else if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
if (player->hSpeed < -player->maxSpeed) { player->hSpeed = -player->maxSpeed; }
else { player->hSpeed -= 1.0f * player->hAcceleration *dt; }
player->direction = -1;
if (enemy->hSpeed < -enemy->maxSpeed) { enemy->hSpeed = -enemy->maxSpeed; }
else { enemy->hSpeed -= 1.0f * enemy->hAcceleration * dt; }
enemy->direction = -1;
}
else {
if (player->hSpeed > -5.0f && player->hSpeed < 5.0f) {
player->hSpeed = 0.0f;
player->state = player->IDLE;
}
else if (player->hSpeed > 0.0f) {
player->hSpeed -= 1.0f * player->hDeacceleration * dt;
}
else if (player->hSpeed < 0.0f) {
player->hSpeed += 1.0f * player->hDeacceleration * dt;
}
}
if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) {
player->maxSpeed = player->maxRunningSpeed;
}
else{ player->maxSpeed = player->maxWalkingSpeed; }
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS && player->onGround) {
player->onGround = 0;
player->vSpeed = player->jumpStrength;
}
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS && player->onGround) {
player->onGround = 0;
player->vSpeed = player->jumpStrength;
}
this->x += dt;
/*
if (this->player->Position.x > this->enemy->Position.x) {
if (enemy->hSpeed > enemy->maxSpeed) { enemy->hSpeed = enemy->maxSpeed; }
else { enemy->hSpeed += 1.0f * enemy->hAcceleration * dt; }
enemy->direction = 1;
}
else {
if (enemy->hSpeed < -enemy->maxSpeed) { enemy->hSpeed = -enemy->maxSpeed; }
else { enemy->hSpeed -= 1.0f * enemy->hAcceleration * dt; }
enemy->direction = -1;
}*/
player->calcPos(dt);
enemy->calcPos(dt);
for (int i = 0; i < this->world->objects.size(); i++) {
calcCollision(this->player, this->world->objects[i]);
calcCollisionE(this->enemy, this->world->objects[i]);
}/*
if (enemy->hSpeed == 0.0f) {
enemy->onGround = 0;
enemy->vSpeed = enemy->jumpStrength;
}*/
player->animSprite(dt);
enemy->animSprite(dt);
}
void Game::render()
{
//view matrix
glm::mat4 view;
view = glm::lookAt(glm::vec3(player->Position.x + player->Size.x /2- scrWidth/2, player->Position.y + player->Size.y/2 - scrHeight/2,1.0f), glm::vec3(player->Position.x + player->Size.x / 2 - scrWidth/2, player->Position.y + player->Size.y / 2 - scrHeight/2, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
glUniformMatrix4fv(glGetUniformLocation(ResourceManager::GetShader("shader").ID, "view") , 1, GL_FALSE, glm::value_ptr(view));
//draw objects
this->player->drawPlayer(*renderer);
//this->enemy->drawEnemy(*renderer);
this->world->drawWorld(*renderer);
}
//------CALLBACKS---------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
//---------getset---------
GLFWwindow* Game::getWindow() {
return window;
}