254 lines
10 KiB
C++
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;
|
|
} |