#include #include "camera.hpp" #include "input_handler.hpp" #include "map.hpp" #include "player.hpp" using namespace std; using namespace glm; using namespace dragonblocks; Player* Player::localplayer = nullptr; Player *Player::createLocalplayer(Camera *c, InputHandler *i, Map *m) { if (localplayer) throw runtime_error("Localplayer already exists"); return localplayer = new Player(c, i, m); } void Player::staticMouseHandler(double dtime, double x, double y) { localplayer->mouseHandler(dtime, x, y); } void Player::staticKeyHandler(double dtime, set keys) { localplayer->keyHandler(dtime, keys); } void Player::mouseHandler(double dtime, double x, double y) { yaw += x; pitch -= y; pitch = clamp(pitch, -89.0, 89.0); camera->update(yaw, pitch); } void Player::keyHandler(double dtime, set keys) { vec3 vel = vec3(speed * dtime); vec3 front = camera->front(), right = camera->right(), up = camera->up(); if (! pitch_move) { front = normalize(vec3(front.x, 0, front.z)); up = normalize(vec3(0, up.y, 0)); } if (keys.find(GLFW_KEY_W) != keys.end()) { pos += vel * front; } else if (keys.find(GLFW_KEY_S) != keys.end()) { pos -= vel * front; } if (keys.find(GLFW_KEY_D) != keys.end()) { pos += vel * right; } else if (keys.find(GLFW_KEY_A) != keys.end()) { pos -= vel * right; } if (keys.find(GLFW_KEY_SPACE) != keys.end()) { pos += vel * up; } else if (keys.find(GLFW_KEY_LEFT_SHIFT) != keys.end()) { pos -= vel * up; } camera->pos = pos; loadChunks(); } void Player::loadChunks() { ivec3 chunkp = Map::getChunkPos(pos); for (int x = chunkp.x - 1; x <= chunkp.x + 1; x++) { for (int y = chunkp.y - 1; y < chunkp.y + 1; y++) { for (int z = chunkp.z - 1; z <= chunkp.z + 1; z++) { map->createChunk(ivec3(x, y, z)); } } } } Player::Player(Camera *c, InputHandler *i, Map *m) : camera(c), input_handler(i), map(m) { input_handler->listenFor(GLFW_KEY_W); input_handler->listenFor(GLFW_KEY_A); input_handler->listenFor(GLFW_KEY_S); input_handler->listenFor(GLFW_KEY_D); input_handler->listenFor(GLFW_KEY_SPACE); input_handler->listenFor(GLFW_KEY_LEFT_SHIFT); input_handler->addMouseHandler(Player::staticMouseHandler); input_handler->addKeyHandler(Player::staticKeyHandler); }