aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornathansmithsmith <nathansmith7@mailfence.com>2023-11-04 21:25:01 -0600
committernathansmithsmith <nathansmith7@mailfence.com>2023-11-04 21:25:01 -0600
commitf45d32ca36a0ae85410b3eee61120fa97bf9bd25 (patch)
treed2b199bb12e9e9fe967dca415bf1b7270382774a
parent5627fd8128957710c6f16330b2bc1bc3251c5355 (diff)
Game play feeling great
-rw-r--r--src/cameras.c30
-rw-r--r--src/cameras.h3
-rw-r--r--src/entities/antifaShip.c2
-rw-r--r--src/gameScreen.c81
-rw-r--r--src/gameScreen.h6
-rw-r--r--src/levels/level1.c3
-rw-r--r--src/settings.c6
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
};
}