diff options
author | nathansmithsmith <nathansmith7@mailfence.com> | 2023-11-04 21:25:01 -0600 |
---|---|---|
committer | nathansmithsmith <nathansmith7@mailfence.com> | 2023-11-04 21:25:01 -0600 |
commit | f45d32ca36a0ae85410b3eee61120fa97bf9bd25 (patch) | |
tree | d2b199bb12e9e9fe967dca415bf1b7270382774a | |
parent | 5627fd8128957710c6f16330b2bc1bc3251c5355 (diff) |
Game play feeling great
-rw-r--r-- | src/cameras.c | 30 | ||||
-rw-r--r-- | src/cameras.h | 3 | ||||
-rw-r--r-- | src/entities/antifaShip.c | 2 | ||||
-rw-r--r-- | src/gameScreen.c | 81 | ||||
-rw-r--r-- | src/gameScreen.h | 6 | ||||
-rw-r--r-- | src/levels/level1.c | 3 | ||||
-rw-r--r-- | src/settings.c | 6 |
7 files changed, 116 insertions, 15 deletions
diff --git a/src/cameras.c b/src/cameras.c index dc1afd0..ca03b51 100644 --- a/src/cameras.c +++ b/src/cameras.c @@ -1,6 +1,7 @@ #include "cameras.h" #include "game.h" #include "world.h" +#include "entitiesInclude.h" // First person camera indeed. void initFirstPersonCamera(Game * game, Camera3D * camera) { @@ -30,12 +31,37 @@ void initThirdPersonCamera(Game * game, Camera3D * camera) { void updateThirdPersonCamera(Game * game, Camera3D * camera) { Entity * player = getEntityFromWorld(game->world, 0); Vector3 direction = Vector3RotateByQuaternion(THIRD_PERSON_CAMERA_DISTANCE, player->rotation); - camera->position = Vector3Add(player->position, direction); + camera->target = player->position; camera->up = Vector3RotateByQuaternion((Vector3){0.0, 1.0, 0.0}, player->rotation); } +// Zoom camera indeed hehehehehehe. +void initZoomCamera(Game * game, Camera3D * camera) { + *camera = (Camera3D){ + .fovy = 12.0, + .projection = CAMERA_PERSPECTIVE + }; +} + +void updateZoomCamera(Game * game, Camera3D * camera) { + Entity * player = getEntityFromWorld(game->world, 0); + AntifaShip * data = (AntifaShip*)player->data; + + Vector3 direction; + + // Get direction. Aim with ship or target on target entity. + if (data->doAutoTarget) + direction = data->gunTarget; + else + direction = Vector3RotateByQuaternion((Vector3){0.0, 0.0, 1.0}, player->rotation); + + camera->position = Vector3Add(player->position, Vector3Scale(direction, FIRST_PERSON_CAMERA_DISTANCE)); + camera->target = Vector3Add(camera->position, direction); + camera->up = Vector3RotateByQuaternion((Vector3){0.0, 1.0, 0.0}, player->rotation); +} + // KILL THE BUGS!!! void initDebugCamera(Game * game, Camera3D * camera) { *camera = (Camera3D){ @@ -55,12 +81,14 @@ void updateDebugCamera(Game * game, Camera3D * camera) { const CameraInitCb cameraInitCallbacks[CAMERA_COUNT] = { initFirstPersonCamera, initThirdPersonCamera, + initZoomCamera, initDebugCamera }; const CameraCb cameraCallbacks[CAMERA_COUNT] = { updateFirstPersonCamera, updateThirdPersonCamera, + updateZoomCamera, updateDebugCamera }; diff --git a/src/cameras.h b/src/cameras.h index dca91ee..e02a393 100644 --- a/src/cameras.h +++ b/src/cameras.h @@ -7,7 +7,7 @@ #define THIRD_PERSON_CAMERA_DISTANCE (Vector3){0.0, 10.0, -20.0} #define DEBUG_CAMERA_POSITION (Vector3){0.0, 200.0, 100.0} -#define CAMERA_COUNT 3 +#define CAMERA_COUNT 4 // Each camera has a game loop callback and a init callback. typedef void (*CameraInitCb)(Game * game, Camera3D * camera); @@ -19,6 +19,7 @@ extern const CameraCb cameraCallbacks[CAMERA_COUNT]; typedef enum CameraId { FIRST_PERSON_CAMERA, THIRD_PERSON_CAMERA, + ZOOM_CAMERA, DEBUG_CAMERA } CameraId; diff --git a/src/entities/antifaShip.c b/src/entities/antifaShip.c index 5383537..2b98721 100644 --- a/src/entities/antifaShip.c +++ b/src/entities/antifaShip.c @@ -112,7 +112,7 @@ void updateAntifaShipTarget(Game * game, Entity * entity) { // Update target. float speed = ANTIFA_TARGETING_SPEED / aimDistance; data->gunTarget = Vector3Lerp(data->gunTarget, directionToTarget, speed * t); - printf("%f\n", speed); + //printf("%f\n", speed); // Is on target. data->isOnTarget = traceRayToEntity(*targetEntity, (Ray){entity->position, data->gunTarget}).hit; diff --git a/src/gameScreen.c b/src/gameScreen.c index 2d42284..8cb9424 100644 --- a/src/gameScreen.c +++ b/src/gameScreen.c @@ -17,6 +17,8 @@ void initGameScreenGui(GameScreen * gameScreen) { height / 3.0 }; + gameScreen->zoomViewPosition = (Vector2){width - GAME_SCREEN_ZOOM_VIEW_UI_SIZE - 20.0, 10.0}; + // Gyroscope indeed initGyroscope(&gameScreen->gyroscope); @@ -30,12 +32,16 @@ void initGameScreenGui(GameScreen * gameScreen) { void initGameScreen(Game * game, GameScreen * gameScreen) { initGameScreenGui(gameScreen); + // World render. if (game->settings.useWorldRenderTexture) { gameScreen->worldRender = LoadRenderTexture(game->settings.renderWidth, game->settings.renderHeight); gameScreen->usingWorldRenderTexture = true; } else { gameScreen->usingWorldRenderTexture = false; } + + // Zoom view. + gameScreen->zoomViewTexture = LoadRenderTexture(GAME_SCREEN_ZOOM_VIEW_SIZE, GAME_SCREEN_ZOOM_VIEW_SIZE); } void freeGameScreen(GameScreen * gameScreen) { @@ -44,28 +50,33 @@ void freeGameScreen(GameScreen * gameScreen) { if (gameScreen->usingWorldRenderTexture) UnloadRenderTexture(gameScreen->worldRender); -} -void drawCrossHair(float size, float thick, Color color) { - Vector3 center = (Vector3){GetScreenWidth() / 2.0, GetScreenHeight() / 2.0}; + UnloadRenderTexture(gameScreen->zoomViewTexture); +} +void drawCrossHairPosition(Vector2 position, float size, float thick, Color color) { // Left to right. DrawLineEx( - (Vector2){center.x - size, center.y}, - (Vector2){center.x + size, center.y}, + (Vector2){position.x - size, position.y}, + (Vector2){position.x + size, position.y}, thick, color ); // Top to bottom. DrawLineEx( - (Vector2){center.x, center.y - size}, - (Vector2){center.x, center.y + size}, + (Vector2){position.x, position.y - size}, + (Vector2){position.x, position.y + size}, thick, color ); } +void drawCrossHair(float size, float thick, Color color) { + Vector2 center = (Vector2){GetScreenWidth() / 2.0, GetScreenHeight() / 2.0}; + drawCrossHairPosition(center, size, thick, color); +} + void drawGameScreenInfoText(Game * game, GameScreen * gameScreen) { Entity * player = getEntityFromWorld(game->world, 0); @@ -173,6 +184,9 @@ void handleGameScreenInput(Game * game, GameScreen * gameScreen) { gameScreen->mainCamera = THIRD_PERSON_CAMERA; break; case KEY_THREE: + gameScreen->mainCamera = ZOOM_CAMERA; + break; + case KEY_FOUR: gameScreen->mainCamera = DEBUG_CAMERA; break; default: @@ -232,14 +246,61 @@ void gameScreenHandleLevels(Game * game, GameScreen * gameScreen) { void renderWorldGameScreen(Game * game, GameScreen * gameScreen) { BeginMode3D(game->cameras[gameScreen->mainCamera]); - //DrawGrid(50, 25.0); - // Draw world. drawWorld(&game->world, game); EndMode3D(); } +void drawZoomViewGameScreen(Game * game, GameScreen * gameScreen) { + // Update camera. + runCameraUpdate(game, game->cameras, ZOOM_CAMERA); + + // Render onto texture. + BeginTextureMode(gameScreen->zoomViewTexture); + ClearBackground(BLACK); + + BeginMode3D(game->cameras[ZOOM_CAMERA]); + drawWorld(&game->world, game); + EndMode3D(); + + EndTextureMode(); + + // Draw texture. + DrawTexturePro( + gameScreen->zoomViewTexture.texture, + (Rectangle){0.0, 0.0, GAME_SCREEN_ZOOM_VIEW_SIZE, -GAME_SCREEN_ZOOM_VIEW_SIZE}, + (Rectangle){ + gameScreen->zoomViewPosition.x, + gameScreen->zoomViewPosition.y, + GAME_SCREEN_ZOOM_VIEW_UI_SIZE, + GAME_SCREEN_ZOOM_VIEW_UI_SIZE, + }, + (Vector2){0.0, 0.0}, + 0.0, + WHITE + ); + + // Draw cross hair. + float halfSize = GAME_SCREEN_ZOOM_VIEW_UI_SIZE / 2.0; + Vector2 crossHairPosition = Vector2Add(gameScreen->zoomViewPosition, (Vector2){halfSize, halfSize}); + + Entity * player = getEntityFromWorld(game->world, 0); + AntifaShip * data = (AntifaShip*)player->data; + Color color = data->isOnTarget ? RED : BLUE; + + drawCrossHairPosition(crossHairPosition, 4.0, 2.0, color); + + // Draw outline. + DrawRectangleLines( + gameScreen->zoomViewPosition.x, + gameScreen->zoomViewPosition.y, + GAME_SCREEN_ZOOM_VIEW_UI_SIZE, + GAME_SCREEN_ZOOM_VIEW_UI_SIZE, + GREEN + ); +} + void updateGameScreen(Game * game) { GameScreen * gameScreen = &game->gameScreen; @@ -278,6 +339,8 @@ void updateGameScreen(Game * game) { renderWorldGameScreen(game, gameScreen); } + drawZoomViewGameScreen(game, gameScreen); + // GUI. drawGameScreenGui(game); } diff --git a/src/gameScreen.h b/src/gameScreen.h index aa690fa..009ba07 100644 --- a/src/gameScreen.h +++ b/src/gameScreen.h @@ -10,6 +10,9 @@ #define GAME_SCREEN_NEXT_LEVEL_DELAY 2.0 #define GAME_SCREEN_TARGET_INFO_MAX 20 +#define GAME_SCREEN_ZOOM_VIEW_SIZE 60 // Size it renders at. +#define GAME_SCREEN_ZOOM_VIEW_UI_SIZE 150 // Size on screen. + // Gui stuff and shit. typedef struct GameScreen { Vector2 infoTextPosition; @@ -23,6 +26,9 @@ typedef struct GameScreen { double timeAtLevelComplete; int lastLevel; + RenderTexture zoomViewTexture; + Vector2 zoomViewPosition; + RenderTexture worldRender; bool usingWorldRenderTexture; } GameScreen; diff --git a/src/levels/level1.c b/src/levels/level1.c index ef40174..190d606 100644 --- a/src/levels/level1.c +++ b/src/levels/level1.c @@ -21,6 +21,9 @@ void closelevel1(Levels * levels) { } bool updateLevel1(Game * game, Levels * levels) { + if (game->world.entitiesCount == 1) + return true; + return IsKeyDown(KEY_G); } diff --git a/src/settings.c b/src/settings.c index 3e3a178..a383e9f 100644 --- a/src/settings.c +++ b/src/settings.c @@ -3,7 +3,7 @@ void initSettings(Settings * settings) { *settings = (Settings){ .controlMode = KEYBOARD_AND_MOUSE_CONTROL, - .mouseSensitivity = 0.0016, + .mouseSensitivity = 0.0007, .scrollBarSpeed = 10.0, .lockMouse = true, .gamePadNum = 0, @@ -12,11 +12,11 @@ void initSettings(Settings * settings) { .rollStick = 2, .speedStick = 3, .joystickSensitivity = 0.5, - .fps = 0, + .fps = 60.0, .drawFps = true, .renderWidth = 480, .renderHeight = 270, - .useWorldRenderTexture = false + .useWorldRenderTexture = true }; } |