Use Z for up (Part 3)

Fix camera, player movement, and bounding boxes.
This commit is contained in:
Pedro Gimeno 2020-02-20 22:48:14 +01:00
parent 76071d9f26
commit 9a1b193be9
5 changed files with 49 additions and 48 deletions

View File

@ -56,8 +56,8 @@ class ClientPlayer : public Player {
void checkCollisions(const ClientWorld &world);
float pointTargetedX() const { return m_x + cos(m_angleH * RADIANS_PER_DEGREES) * cos(m_angleV * RADIANS_PER_DEGREES); }
float pointTargetedY() const { return m_y + sin(m_angleV * RADIANS_PER_DEGREES); }
float pointTargetedZ() const { return m_z + sin(m_angleH * RADIANS_PER_DEGREES) * cos(m_angleV * RADIANS_PER_DEGREES) - 0.00001; }
float pointTargetedY() const { return m_y + sin(m_angleH * RADIANS_PER_DEGREES) * cos(m_angleV * RADIANS_PER_DEGREES) - 0.00001; }
float pointTargetedZ() const { return m_z + sin(m_angleV * RADIANS_PER_DEGREES); }
static ClientPlayer &getInstance() { return *s_instance; }
static void setInstance(ClientPlayer *instance) { s_instance = instance; }

View File

@ -46,6 +46,7 @@ GameState::GameState(const std::string &host, int port) {
m_textureAtlas = &gk::ResourceHandler::getInstance().get<TextureAtlas>("atlas-blocks");
m_camera.setUpVector(gk::Vector3d{0., 0., 1.});
m_camera.setAspectRatio((float)Config::screenWidth / Config::screenHeight);
initShaders();
@ -68,8 +69,8 @@ void GameState::onEvent(const SDL_Event &event) {
if (&m_stateStack->top() == this) {
if (event.type == SDL_MOUSEMOTION) {
if(Config::screenWidth / 2.0f != event.motion.x || Config::screenHeight / 2.0f != event.motion.y) {
m_player.turnH(event.motion.xrel * 0.01 * Config::mouseSensitivity);
m_player.turnV(-event.motion.yrel * 0.01 * Config::mouseSensitivity);
m_player.turnH(event.motion.xrel * -0.01 * Config::mouseSensitivity);
m_player.turnV(event.motion.yrel * -0.01 * Config::mouseSensitivity);
gk::Mouse::resetToWindowCenter();
}

View File

@ -35,13 +35,13 @@ ClientPlayer *ClientPlayer::s_instance = nullptr;
ClientPlayer::ClientPlayer(gk::Camera &camera) : m_camera(camera) {
// FIXME: Warning: Duplicated in ServerCommandHandler.hpp
m_x = 12;
m_y = 20;
m_z = 12;
m_y = 12;
m_z = 20;
m_angleH = -90.0;
m_angleV = 0.01;
m_camera.setPosition(m_x, m_y - 0.1, m_z);
m_camera.setPosition(m_x, m_y, m_z - 0.1);
m_camera.setTargetPosition(pointTargetedX(), pointTargetedY(), pointTargetedZ());
}
@ -74,92 +74,92 @@ void ClientPlayer::turnV(float angle) {
void ClientPlayer::move(float direction) {
direction += m_angleH;
m_velocity.x = 0.04f * cos(direction * RADIANS_PER_DEGREES);
m_velocity.z = 0.04f * sin(direction * RADIANS_PER_DEGREES);
m_velocity.x = 0.04f * cosf(direction * RADIANS_PER_DEGREES);
m_velocity.y = 0.04f * sinf(direction * RADIANS_PER_DEGREES);
}
void ClientPlayer::processInputs() {
if(gk::GamePad::isKeyPressed(GameKey::Jump) && !m_isJumping) {
m_isJumping = true;
m_velocity.y = m_jumpSpeed;
m_velocity.z = m_jumpSpeed;
}
if(gk::GamePad::isKeyPressed(GameKey::Fly)) {
m_velocity.y = 0.1;
m_velocity.z = 0.1;
}
if(gk::GamePad::isKeyPressed(GameKey::Sneak)) {
m_velocity.y = -0.1;
m_velocity.z = -0.1;
}
if(gk::GamePad::isKeyPressed(GameKey::Up)) move(0.0f);
else if(gk::GamePad::isKeyPressed(GameKey::Down)) move(180.0f);
if(gk::GamePad::isKeyPressed(GameKey::Left)) move(-90.0f);
else if(gk::GamePad::isKeyPressed(GameKey::Right)) move(90.0f);
if(gk::GamePad::isKeyPressed(GameKey::Left)) move(90.0f);
else if(gk::GamePad::isKeyPressed(GameKey::Right)) move(-90.0f);
if (gk::GamePad::isKeyPressed(GameKey::Left) && gk::GamePad::isKeyPressed(GameKey::Up)) move(-45.0f);
if (gk::GamePad::isKeyPressed(GameKey::Right) && gk::GamePad::isKeyPressed(GameKey::Up)) move(45.0f);
if (gk::GamePad::isKeyPressed(GameKey::Left) && gk::GamePad::isKeyPressed(GameKey::Down)) move(-135.0f);
if (gk::GamePad::isKeyPressed(GameKey::Right) && gk::GamePad::isKeyPressed(GameKey::Down)) move(135.0f);
if (gk::GamePad::isKeyPressed(GameKey::Left) && gk::GamePad::isKeyPressed(GameKey::Up)) move(45.0f);
if (gk::GamePad::isKeyPressed(GameKey::Right) && gk::GamePad::isKeyPressed(GameKey::Up)) move(-45.0f);
if (gk::GamePad::isKeyPressed(GameKey::Left) && gk::GamePad::isKeyPressed(GameKey::Down)) move(135.0f);
if (gk::GamePad::isKeyPressed(GameKey::Right) && gk::GamePad::isKeyPressed(GameKey::Down)) move(-135.0f);
if (gk::GamePad::isKeyPressed(GameKey::Sprint)) {
m_velocity.x *= 1.5;
m_velocity.z *= 1.5;
m_velocity.y *= 1.5;
}
}
void ClientPlayer::updatePosition(const ClientWorld &world) {
ClientChunk *chunk = (ClientChunk *)world.getChunkAtBlockPos(m_x, m_y - 0.2, m_z);
ClientChunk *chunk = (ClientChunk *)world.getChunkAtBlockPos(m_x, m_y, m_z - 0.2);
if (!Config::isFlyModeEnabled && chunk && chunk->isInitialized()) {
m_velocity.y -= m_gravity; // Gravity
m_velocity.z -= m_gravity; // Gravity
if (m_velocity.y < -m_jumpSpeed) // Jump max accel
m_velocity.y = -m_jumpSpeed;
if (m_velocity.z < -m_jumpSpeed) // Jump max accel
m_velocity.z = -m_jumpSpeed;
}
if (!Config::isNoClipEnabled)
checkCollisions(world);
if (!Config::isFlyModeEnabled && m_velocity.y != 0) {
if (!Config::isFlyModeEnabled && m_velocity.z != 0) {
m_velocity.x *= 0.75f;
m_velocity.z *= 0.75f;
m_velocity.y *= 0.75f;
}
m_x += m_velocity.x;
m_y += m_velocity.y;
m_z += m_velocity.z;
m_camera.setPosition(m_x, m_y - 0.1, m_z);
m_camera.setPosition(m_x, m_y, m_z - 0.1);
Player::setPosition(m_x, m_y, m_z);
if (m_velocity.x != 0 || m_velocity.y != 0 || m_velocity.z != 0)
m_camera.setTargetPosition(pointTargetedX(), pointTargetedY(), pointTargetedZ());
m_velocity.x = 0;
m_velocity.z = 0;
m_velocity.y = 0;
if (Config::isFlyModeEnabled)
m_velocity.y = 0;
m_velocity.z = 0;
}
void ClientPlayer::checkCollisions(const ClientWorld &world) {
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || defined(__ANDROID__)
const float PLAYER_HEIGHT = 1.8;
float eyeheight = m_y + PLAYER_HEIGHT - 1.4;
float eyeheight = m_z + PLAYER_HEIGHT - 1.4;
// testPoint(world, glm::vec3(m_x, m_y, m_z), m_velocity);
testPoint(world, m_x - 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_z - 0.2, m_velocity);
testPoint(world, m_x + 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_z - 0.2, m_velocity);
testPoint(world, m_x - 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_z + 0.2, m_velocity);
testPoint(world, m_x + 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_z + 0.2, m_velocity);
testPoint(world, m_x - 0.2, eyeheight - 0.4, m_z - 0.2, m_velocity);
testPoint(world, m_x + 0.2, eyeheight - 0.4, m_z - 0.2, m_velocity);
testPoint(world, m_x - 0.2, eyeheight - 0.4, m_z + 0.2, m_velocity);
testPoint(world, m_x + 0.2, eyeheight - 0.4, m_z + 0.2, m_velocity);
testPoint(world, m_x - 0.2, m_y - 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_velocity);
testPoint(world, m_x + 0.2, m_y - 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_velocity);
testPoint(world, m_x - 0.2, m_y + 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_velocity);
testPoint(world, m_x + 0.2, m_y + 0.2, eyeheight - PLAYER_HEIGHT - 0.4, m_velocity);
testPoint(world, m_x - 0.2, m_y - 0.2, eyeheight - 0.4, m_velocity);
testPoint(world, m_x + 0.2, m_y - 0.2, eyeheight - 0.4, m_velocity);
testPoint(world, m_x - 0.2, m_y + 0.2, eyeheight - 0.4, m_velocity);
testPoint(world, m_x + 0.2, m_y + 0.2, eyeheight - 0.4, m_velocity);
#else
for (float x = m_x + m_hitbox.x ; x <= m_x + m_hitbox.x + m_hitbox.sizeX + 0.1f ; x += 0.2f) {
for (float y = m_y + m_hitbox.y ; y <= m_y + m_hitbox.y + m_hitbox.sizeY + 0.1f ; y += 0.9f) {
for (float z = m_z + m_hitbox.z ; z <= m_z + m_hitbox.z + m_hitbox.sizeZ + 0.1f ; z += 0.2f) {
for (float z = m_z + m_hitbox.z ; z <= m_z + m_hitbox.z + m_hitbox.sizeZ + 0.1f ; z += 0.9f) {
for (float y = m_y + m_hitbox.y ; y <= m_y + m_hitbox.y + m_hitbox.sizeY + 0.1f ; y += 0.2f) {
for (float x = m_x + m_hitbox.x ; x <= m_x + m_hitbox.x + m_hitbox.sizeX + 0.1f ; x += 0.2f) {
if (x == m_x + m_hitbox.x || x == m_x + m_hitbox.x + m_hitbox.sizeX
|| y == m_y + m_hitbox.y || y == m_y + m_hitbox.y + m_hitbox.sizeY
|| z == m_z + m_hitbox.z || z == m_z + m_hitbox.z + m_hitbox.sizeZ)
@ -178,15 +178,15 @@ bool passable(const ClientWorld &world, float x, float y, float z) {
void ClientPlayer::testPoint(const ClientWorld &world, float x, float y, float z, glm::vec3 &speed) {
// FIXME: Temporary fix, find the real problem!!!
if (x < 0) --x;
if (x < 1) --x;
if (y < 1) --y;
if (z < 0) --z;
if (z < 1) --z;
if(!passable(world, x + speed.x, y, z)) speed.x = 0;
if(!passable(world, x, y, z + speed.z)) speed.z = 0;
if(!passable(world, x, y + speed.y, z)) {
if(speed.y < 0 && m_isJumping) m_isJumping = false;
speed.y = 0;
if(!passable(world, x, y + speed.y, z)) speed.y = 0;
if(!passable(world, x, y, z + speed.z)) {
if(speed.z < 0 && m_isJumping) m_isJumping = false;
speed.z = 0;
}
}

View File

@ -24,7 +24,7 @@
#include "Player.hpp"
Player::Player() {
m_hitbox = gk::FloatBox{-0.2, -1.8, -0.2, 0.4, 1.8, 0.4};
m_hitbox = gk::FloatBox{-0.2, -0.2, -1.8, 0.4, 0.4, 1.8};
}
void Player::serialize(sf::Packet &packet) const {

View File

@ -141,7 +141,7 @@ mod:block {
tiles = "dandelion.png",
hardness = 0.05,
draw_type = 1, -- FIXME: Use string instead
bounding_box = {0.25, 0.0, 0.25, 0.5, 0.5, 0.5},
bounding_box = {0.25, 0.25, 0.0, 0.5, 0.5, 0.5},
}
mod:block {