#include #include #include "world.cpp" Texture SpaceshipFusilageTexture; Texture SpaceshipEnginesTexture; Texture AsteroidTexture; void LoadAssets() { SpaceshipFusilageTexture = LoadTexture("./spaceshipFusilage.png"); SpaceshipEnginesTexture = LoadTexture("./spaceshipEngines.png"); } int main(int argc, char const** argv) { int const viewportWidth = 640; int const viewportHeight = 360; Vector2 const viewportOrigin = Vector2{(viewportWidth / 2), (viewportHeight / 2)}; int unsigned const windowFlags = 0; int unsigned const rendererFlags = 0; InitWindow(viewportWidth, viewportHeight, "Quadrants"); HideCursor(); LoadAssets(); Texture nebulaTexture = LoadTexture("./nebula.png"); Texture sunTexture = LoadTexture("./sun.png"); Texture moonTexture = LoadTexture("./moon.png"); Texture asteroidTexture = LoadTexture("./asteroid01.png"); Worldspace world = CreateWorldspace(10); Camera2D camera = {0}; camera.target = viewportOrigin; camera.zoom = 1.0f; GenerateWorldspace(world); SetTargetFPS(60); while (!WindowShouldClose()) { float const scale = (1.0f + (1.0f - camera.zoom)); Vector2 const mousePos = GetMousePosition(); int const mouseWheel = GetMouseWheelMove(); float const lookAtEngageDistance = 32.0f; float const accel = 0.005f; // Relative position checks. if (Vector2Distance(mousePos, viewportOrigin) > lookAtEngageDistance) { float const lerpStep = AngleDifference(world.player.entity.orientation, AngleToPoint(viewportOrigin, mousePos)); world.player.delayedOrientation = WrapAngle(world.player.entity.orientation + (lerpStep * 0.0005f)); world.player.entity.orientation = WrapAngle(world.player.entity.orientation + (lerpStep * 0.2f)); } if (IsKeyDown(KEY_W)) { AddEntityForce(world.player.entity, world.player.entity.orientation, accel); } if (IsKeyDown(KEY_A)) { AddEntityForce(world.player.entity, (world.player.entity.orientation - HALF_PI), accel); } if (IsKeyDown(KEY_S)) { AddEntityForce(world.player.entity, (world.player.entity.orientation + PI), accel); } if (IsKeyDown(KEY_D)) { AddEntityForce(world.player.entity, (world.player.entity.orientation + HALF_PI), accel); } if (IsKeyDown(KEY_SPACE)) { RemoveEntityForce(world.player.entity, accel); } camera.target = Vector2{-mousePos.x, -mousePos.y}; if (mouseWheel) { camera.zoom = CLAMP(camera.zoom - (((float)mouseWheel) * 0.05f), 0.5f, 1.5f); } EntityUpdateInfo const updateInfo = UpdateEntity(world.player.entity); if (updateInfo.hasMoved) { Vector2 const nebulaParallaxIncrement = (world.nebulaParallaxScroll + (world.player.entity.speed * 0.005f)); world.nebulaParallaxScroll.x = wrap(nebulaParallaxIncrement.x, 0.0f, ((float)nebulaTexture.width)); world.nebulaParallaxScroll.y = wrap(nebulaParallaxIncrement.y, 0.0f, ((float)nebulaTexture.height)); if (updateInfo.hasPassedQuadrant) { GenerateWorldspace(world); } } BeginDrawing(); { ClearBackground(BLACK); BeginMode2D(camera); { Vector2 const quadrantOffsets[] = { {-QUADRANT_SIZE, -QUADRANT_SIZE}, {0.0f, -QUADRANT_SIZE}, {QUADRANT_SIZE, -QUADRANT_SIZE}, {-QUADRANT_SIZE, 0.0f}, {0.0f, 0.0f}, {QUADRANT_SIZE, 0.0f}, {-QUADRANT_SIZE, QUADRANT_SIZE}, {0.0f, QUADRANT_SIZE}, {QUADRANT_SIZE, QUADRANT_SIZE} }; // DrawTextureQuad(nebulaTexture, Vector2{1, 1}, world.nebulaParallaxScroll, Rectangle{0, 0, viewportWidth, viewportHeight}, RED); for (size_t i = 0; i < 9; i += 1) { Worldspace::Quadrant const* quadrant = (&world.loadedQuadrantMap[i]); Vector2 const quadrantOffset = (viewportOrigin + quadrantOffsets[i]); for (size_t j = 0; j < quadrant->starCount; j += 1) { DrawCircleV(((quadrantOffset + quadrant->stars[j]) - world.player.entity.localPosition), 1.0f, WHITE); } for (size_t j = 0; j < quadrant->orbitalCount; j += 1) { Worldspace::Orbital const quadrantOrbital = quadrant->orbitals[j]; DrawTextureEx( asteroidTexture, ((quadrantOffset + quadrantOrbital.localPosition) - world.player.entity.localPosition), (quadrantOrbital.orientation * RAD2DEG), quadrantOrbital.scale, WHITE ); } } // Draw player. DrawTexturePro( SpaceshipEnginesTexture, (Rectangle){0, 0, ((float)SpaceshipEnginesTexture.width), ((float)SpaceshipEnginesTexture.height)}, (Rectangle){viewportOrigin.x, viewportOrigin.y, ((float)SpaceshipEnginesTexture.width), ((float)SpaceshipEnginesTexture.height)}, (Vector2){(float)(SpaceshipEnginesTexture.width / 2), (float)(SpaceshipEnginesTexture.height / 2)}, (world.player.delayedOrientation * RAD2DEG), WHITE ); DrawTexturePro( SpaceshipFusilageTexture, (Rectangle){0, 0, (float)(SpaceshipFusilageTexture.width), (float)(SpaceshipFusilageTexture.height)}, (Rectangle){viewportOrigin.x, viewportOrigin.y, ((float)SpaceshipFusilageTexture.width), ((float)SpaceshipFusilageTexture.height)}, (Vector2){(float)(SpaceshipFusilageTexture.width / 2), (float)(SpaceshipFusilageTexture.height / 2)}, (world.player.entity.orientation * RAD2DEG), WHITE ); } EndMode2D(); // Draw UI. DrawCircleLines(((int)mousePos.x), ((int)mousePos.y), 10.0f, WHITE); DrawText(TextFormat("Scale: %f", scale), 0, 0, 22, WHITE); } EndDrawing(); } CloseWindow(); return 0; }