Fix rendering issues, show player health on screen, prioritize no in quitting on Windows, add ceiling and floor collisions dependent on the map, remove grid from rendering, add some textures from CC0

This commit is contained in:
Safariminer 2025-06-07 14:57:29 -04:00
parent 0ea0eed1cc
commit 497efc6fbf
13 changed files with 82 additions and 24 deletions

View File

@ -36,11 +36,12 @@ Morault::Gameplay::PlayerController::PlayerController(Vector3 position)
camera.projection = CAMERA_PERSPECTIVE; camera.projection = CAMERA_PERSPECTIVE;
rotation = { 1,0,0 }; rotation = { 1,0,0 };
} }
int collfloor = 5; float collfloor = 5;
float collceiling = INFINITY;
float gravity = 0; float gravity = 0;
void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus) void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus, Morault::Maps::Map* map, float renderScale)
{ {
if (focus) { if (focus) {
rotation = Vector3RotateByAxisAngle(rotation, { 0,1,0 }, -GetMouseDelta().x * 0.05 * sensitivityMultiplier); rotation = Vector3RotateByAxisAngle(rotation, { 0,1,0 }, -GetMouseDelta().x * 0.05 * sensitivityMultiplier);
@ -53,17 +54,30 @@ void Morault::Gameplay::PlayerController::UpdatePlayerController(bool focus)
if (IsKeyDown(KEY_A)) camera.position = Vector3Add(camera.position, Vector3Multiply(Vector3RotateByAxisAngle({ rotation.x, 0, rotation.z }, {0,1,0}, DEG2RAD*90), {GetFrameTime(), GetFrameTime(), GetFrameTime()})); if (IsKeyDown(KEY_A)) camera.position = Vector3Add(camera.position, Vector3Multiply(Vector3RotateByAxisAngle({ rotation.x, 0, rotation.z }, {0,1,0}, DEG2RAD*90), {GetFrameTime(), GetFrameTime(), GetFrameTime()}));
if (IsKeyDown(KEY_D)) camera.position = Vector3Add(camera.position, Vector3Multiply(Vector3RotateByAxisAngle({ rotation.x, 0, rotation.z }, { 0,1,0 }, DEG2RAD * -90), { GetFrameTime(), GetFrameTime(), GetFrameTime() })); if (IsKeyDown(KEY_D)) camera.position = Vector3Add(camera.position, Vector3Multiply(Vector3RotateByAxisAngle({ rotation.x, 0, rotation.z }, { 0,1,0 }, DEG2RAD * -90), { GetFrameTime(), GetFrameTime(), GetFrameTime() }));
if (IsKeyPressed(KEY_SPACE)) { if (IsKeyPressed(KEY_SPACE)) {
gravity -= 5; gravity -= 10;
} }
} }
for (int i = 0; i < map->MapTriangles.size(); i++) {
if (CheckCollisionPointTriangle({ camera.position.x / renderScale, camera.position.z / renderScale }, map->MapTriangles[i].a, map->MapTriangles[i].b, map->MapTriangles[i].c)) {
collfloor = map->MapTriangles[i].heightFloor * renderScale + 5;
collceiling = map->MapTriangles[i].heightCeiling * renderScale-2;
}
}
camera.position.y -= gravity*GetFrameTime(); camera.position.y -= gravity*GetFrameTime();
gravity += 10*GetFrameTime(); gravity += 10*GetFrameTime();
if (camera.position.y < collfloor) { if (camera.position.y < collfloor) {
camera.position.y = collfloor; camera.position.y = collfloor;
gravity = 0; gravity = 0;
} }
if (camera.position.y > collceiling) {
camera.position.y = collceiling;
gravity = 0;
}
} }
Morault::Gameplay::PlayerController::~PlayerController() Morault::Gameplay::PlayerController::~PlayerController()

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <iostream> #include <iostream>
#include <raylib.h> #include <raylib.h>
#include "Morault_Map.h"
namespace Morault { namespace Morault {
namespace Gameplay { namespace Gameplay {
typedef enum { typedef enum {
@ -27,7 +27,7 @@ namespace Morault {
Vector3 rotation; Vector3 rotation;
Camera camera; Camera camera;
float sensitivityMultiplier = 0.5; float sensitivityMultiplier = 0.5;
void UpdatePlayerController(bool focus); void UpdatePlayerController(bool focus, Maps::Map *map, float renderScale);
~PlayerController(); ~PlayerController();
}; };
class Player { class Player {

View File

@ -34,16 +34,16 @@ void Morault::Rendering::DrawFloor(Vector2 a, Vector2 b, Vector2 c, int heightFl
rlNormal3f(0, 1, 0); rlNormal3f(0, 1, 0);
rlTexCoord2f(0.0f, 1.0f); rlTexCoord2f(a.x / 128, a.y / 128);
rlVertex3f(a.x * renderScale, heightFloor * renderScale, a.y * renderScale); rlVertex3f(a.x * renderScale, heightFloor * renderScale, a.y * renderScale);
rlTexCoord2f(0.0f, 0.0f); rlTexCoord2f(b.x / 128, b.y / 128);
rlVertex3f(b.x * renderScale, heightFloor * renderScale, b.y * renderScale); rlVertex3f(b.x * renderScale, heightFloor * renderScale, b.y * renderScale);
rlTexCoord2f(1.0f, 0.0f); rlTexCoord2f(c.x / 128, c.y / 128);
rlVertex3f(c.x * renderScale, heightFloor * renderScale, c.y * renderScale); rlVertex3f(c.x * renderScale, heightFloor * renderScale, c.y * renderScale);
rlTexCoord2f(1.0f, 0.0f); rlTexCoord2f(c.x / 128, c.y / 128);
rlVertex3f(c.x * renderScale, heightFloor * renderScale, c.y * renderScale); rlVertex3f(c.x * renderScale, heightFloor * renderScale, c.y * renderScale);
rlEnd(); rlEnd();
@ -61,16 +61,16 @@ void Morault::Rendering::DrawCeiling(Vector2 a, Vector2 b, Vector2 c, int height
rlNormal3f(0, 1, 0); rlNormal3f(0, 1, 0);
rlTexCoord2f(0.0f, 1.0f); rlTexCoord2f(a.x / 128, a.y / 128);
rlVertex3f(a.x * renderScale, heightCeiling * renderScale, a.y * renderScale); rlVertex3f(a.x * renderScale, heightCeiling * renderScale, a.y * renderScale);
rlTexCoord2f(1.0f, 0.0f); rlTexCoord2f(c.x / 128, c.y / 128);
rlVertex3f(c.x * renderScale, heightCeiling * renderScale, c.y * renderScale); rlVertex3f(c.x * renderScale, heightCeiling * renderScale, c.y * renderScale);
rlTexCoord2f(0.0f, 0.0f); rlTexCoord2f(b.x / 128, b.y / 128);
rlVertex3f(b.x * renderScale, heightCeiling * renderScale, b.y * renderScale); rlVertex3f(b.x * renderScale, heightCeiling * renderScale, b.y * renderScale);
rlTexCoord2f(0.0f, 0.0f); rlTexCoord2f(b.x / 128, b.y / 128);
rlVertex3f(b.x * renderScale, heightCeiling * renderScale, b.y * renderScale); rlVertex3f(b.x * renderScale, heightCeiling * renderScale, b.y * renderScale);
rlEnd(); rlEnd();

View File

@ -3,5 +3,5 @@
#include <winuser.h> #include <winuser.h>
bool Morault::Safety::ConfirmQuitting() bool Morault::Safety::ConfirmQuitting()
{ {
return MessageBoxA(NULL, "Are you sure you want to quit?", "ProjectMorault", MB_YESNO) == IDYES; // Windows-specific for now return MessageBoxA(NULL, "Are you sure you want to quit?", "ProjectMorault", MB_YESNO | MB_DEFBUTTON2) == IDYES; // Windows-specific for now
} }

View File

@ -0,0 +1,32 @@
<!-- MANUAL OUTPUTTER -->
<shuman>
<engineinfo> <!-- For Debugging Purposes -->
<engineversion>ProjectMorault DEBUG VERSION Jun 7 2025</engineversion>
<enginecompiler>MSVC 1942</enginecompiler>
</engineinfo>
<triangle>
<a><x>-128</x><y>-128</y></a>
<b><x>128</x><y>128</y></b>
<c><x>128</x><y>-128</y></c>
<wallab>pms:none</wallab>
<wallbc>data/textures/ambientcg/bricks094.png</wallbc>
<wallca>data/textures/ambientcg/bricks094.png</wallca>
<ceiling>data/textures/ambientcg/officeceiling001.png</ceiling>
<floor>data/textures/ambientcg/woodfloor051.png</floor>
<ceilingheight>128</ceilingheight>
<floorheight>0</floorheight>
</triangle>
<triangle>
<a><x>-128</x><y>-128</y></a>
<b><x>-128</x><y>128</y></b>
<c><x>128</x><y>128</y></c>
<wallab>data/textures/ambientcg/bricks094.png</wallab>
<wallbc>data/textures/ambientcg/bricks094.png</wallbc>
<wallca>pms:none</wallca>
<ceiling>data/textures/ambientcg/officeceiling001.png</ceiling>
<floor>data/textures/ambientcg/woodfloor051.png</floor>
<ceilingheight>128</ceilingheight>
<floorheight>0</floorheight>
</triangle>
</shuman>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

View File

@ -74,12 +74,12 @@ int main(int argc, char** argv) {
eState = EDITOR; eState = EDITOR;
EnableCursor(); EnableCursor();
} }
player.controller.UpdatePlayerController(!gamePaused); player.controller.UpdatePlayerController(!gamePaused, map, MORAULT_MAP_RENDER_SCALE);
BeginDrawing(); BeginDrawing();
ClearBackground(BLACK); ClearBackground(BLACK);
BeginMode3D(player.controller.camera); BeginMode3D(player.controller.camera);
DrawGrid(100, 10); // DrawGrid(100, 10);
for (int i = 0; i < map->MapTriangles.size(); i++) { for (int i = 0; i < map->MapTriangles.size(); i++) {
if (map->MapTriangles[i].floorTexture != "pms:none") { if (map->MapTriangles[i].floorTexture != "pms:none") {
@ -125,7 +125,10 @@ int main(int argc, char** argv) {
EndMode3D(); EndMode3D();
if (map->MapTriangles.size() == 0) DrawText("Map is empty, press E to open the map editor!", 0, GetScreenHeight()-94, 30, WHITE);
DrawTexture(std::get<Texture2D>(Morault::Resources::Textures(Morault::Resources::get("data/ui/health.png"))), 0, GetScreenHeight() - 64, WHITE);
DrawText(TextFormat("%i", player.data.hp), 66, GetScreenHeight() - 62, 64, BLACK);
DrawText(TextFormat("%i", player.data.hp), 64, GetScreenHeight() - 64, 64, WHITE);
DrawFPS(0, 0); DrawFPS(0, 0);
EndDrawing(); EndDrawing();
} break; } break;
@ -158,9 +161,9 @@ int main(int argc, char** argv) {
if (IsKeyPressed(KEY_N)) { if (IsKeyPressed(KEY_N)) {
Morault::Maps::MapTriangle tri; Morault::Maps::MapTriangle tri;
tri.a = { -128 + editorOffset.x, -128 + editorOffset.y }; tri.a = { -128 - editorOffset.x, -128 - editorOffset.y };
tri.b = { 128 + editorOffset.x, 128 + editorOffset.y }; tri.b = { 128 - editorOffset.x, 128 - editorOffset.y };
tri.c = { 128 + editorOffset.x,-128 + editorOffset.y }; tri.c = { 128 - editorOffset.x,-128 - editorOffset.y };
tri.floorTexture = "data/textures/test.png"; tri.floorTexture = "data/textures/test.png";
tri.heightFloor = 0; tri.heightFloor = 0;
tri.heightCeiling = 128; tri.heightCeiling = 128;
@ -173,9 +176,9 @@ int main(int argc, char** argv) {
if (IsKeyDown(KEY_LEFT_CONTROL)) { if (IsKeyDown(KEY_LEFT_CONTROL)) {
map->MapTriangles[map->MapTriangles.size() - 1].wallAB = "pms:none"; map->MapTriangles[map->MapTriangles.size() - 1].wallAB = "pms:none";
tri.a = { -128 + editorOffset.x, -128 + editorOffset.y }; tri.a = { -128 - editorOffset.x, -128 - editorOffset.y };
tri.b = { -128 + editorOffset.x, 128 + editorOffset.y }; tri.b = { -128 - editorOffset.x, 128 - editorOffset.y };
tri.c = { 128 + editorOffset.x, 128 + editorOffset.y }; tri.c = { 128 - editorOffset.x, 128 - editorOffset.y };
tri.floorTexture = "data/textures/test.png"; tri.floorTexture = "data/textures/test.png";
tri.heightFloor = 0; tri.heightFloor = 0;
tri.heightCeiling = 128; tri.heightCeiling = 128;
@ -237,6 +240,12 @@ int main(int argc, char** argv) {
} }
} }
} }
if (IsKeyDown(KEY_LEFT_SHIFT) && IsKeyDown(KEY_S) && IsKeyPressed(KEY_DELETE)) {
if (inSelection) {
map->MapTriangles.erase(map->MapTriangles.begin() + selection.sector);
inSelection = false;
}
}
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_O)) { // open if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_O)) { // open
std::cout << "What to open? (empty = cancel) >>> "; std::cout << "What to open? (empty = cancel) >>> ";

View File

@ -31,4 +31,7 @@ Compiling on Windows with Visual Studio 2022 is relatively straight-forward. Sim
First, download [raylib 5.5 built for x64 MSVC from GitHub](https://github.com/raysan5/raylib/releases/download/5.5/raylib-5.5_win64_msvc16.zip). Then, place the contents of the ``include`` folder of the archive within your ``deps/include`` folder. Then, place the contents of the ``lib`` folder of the archive within your ``deps/lib`` folder. First, download [raylib 5.5 built for x64 MSVC from GitHub](https://github.com/raysan5/raylib/releases/download/5.5/raylib-5.5_win64_msvc16.zip). Then, place the contents of the ``include`` folder of the archive within your ``deps/include`` folder. Then, place the contents of the ``lib`` folder of the archive within your ``deps/lib`` folder.
### pugixml 1.15 ### pugixml 1.15
First, download pugixml 1.15 from the GitHub repository at gh:zeux/pugixml. Then, place the contents of the archive's ``src`` folder in your ``deps/include`` folder. First, download pugixml 1.15 from the GitHub repository at gh:zeux/pugixml. Then, place the contents of the archive's ``src`` folder in your ``deps/include`` folder.
## Licensing for game data
Textures that come from AmbientCG are under AmbientCG's license(a.k.a. CC0). The rest, which is custom-made for the game, is all-rights-reserved for now.