#include "player.h" #include "game.h" Player createPlayer() { return (Player){ .position = Vector3Zero(), .direction = (Vector3){0.0, 0.0, 0.0}, .velocity = Vector3Zero(), .camera = (Camera){ .position = (Vector3){0.0, 0.0, 0.0}, .target = Vector3Zero(), .up = (Vector3){0.0, 1.0, 0.0}, .fovy = 100, .projection = CAMERA_PERSPECTIVE }, .cameraAngle = Vector2Zero() }; } // TODO: clean this all up float getHeightOnMap(int x, int y, Model* map) { int v = (y * 1023 + x) * 18; float height = 0.0; float c = 0.0; for (int n = 1; n < 18; n += 3) { height += map->meshes[0].vertices[v + n]; ++c; } return height / c; } // TODO: subpixel hackery // This is only for testing ideas. void idkkk(Player* player, Game* game) { Vector3 position = player->position; Image* map = &game->assets.images[HEIGHT_MAP_IMAGE]; float toMapX = map->width / 1000.0; float toMapY = map->height / 1000.0; int pixelX = roundf(position.x * toMapX); int pixelY = roundf(position.z * toMapY); player->position.y = getHeightOnMap(pixelX, pixelY, &game->heightmap) + 2.0; } // TODO: move magic numbers to settings void updatePlayer(Player* player, Game* game) { Camera* camera = &player->camera; Vector2* cameraAngle = &player->cameraAngle; Settings* settings = &game->settings; // Get mouse speed. Vector2 mouseSpeed = Vector2Scale(GetMouseDelta(), settings->mouseSpeed); mouseSpeed = Vector2Scale(mouseSpeed, 1.0 / (PI * 2.0)); // Update camera angle. *cameraAngle = Vector2Add(*cameraAngle, mouseSpeed); cameraAngle->x = Wrap(cameraAngle->x, -PI, PI); cameraAngle->y = Clamp(cameraAngle->y, -PI / 2.5, PI / 2.5); // Set player direction Matrix matrix = MatrixRotateXYZ( (Vector3){-cameraAngle->y, cameraAngle->x, 0.0}); player->direction = (Vector3){matrix.m2, matrix.m6, matrix.m10}; // Player movement. player->velocity = Vector3Zero(); if (IsKeyDown(settings->forwardKey)) { player->velocity.z += cosf(cameraAngle->x); player->velocity.x += -sinf(cameraAngle->x); } if (IsKeyDown(settings->leftKey)) { player->velocity.z += cosf(cameraAngle->x - (PI / 2.0)); player->velocity.x += -sinf(cameraAngle->x - (PI / 2.0)); } if (IsKeyDown(settings->backwardKey)) { player->velocity.z += -cosf(cameraAngle->x); player->velocity.x += sinf(cameraAngle->x); } if (IsKeyDown(settings->rightKey)) { player->velocity.z += cosf(cameraAngle->x + (PI / 2.0)); player->velocity.x += -sinf(cameraAngle->x + (PI / 2.0)); } player->velocity = Vector3Scale(player->velocity, 10.0); // Apply velocity player->position = Vector3Add( player->position, Vector3Scale(player->velocity, GetFrameTime())); // Apply camera. camera->position = player->position; camera->target = Vector3Add(player->position, player->direction); idkkk(player, game); }