diff --git a/CMakeLists.txt b/CMakeLists.txt index ebcfd20..554fc2d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ FetchContent_Declare(SFML FetchContent_MakeAvailable(SFML) # Add all source files +# TODO: glob? add_executable(PlatScifi src/main.cpp src/renderdata.h @@ -25,6 +26,7 @@ add_executable(PlatScifi src/worldobjects/redcube.h src/worldobjects/bluecube.h src/worldobjects/stationaryimage.h + src/worldobjects/player.h ) target_link_libraries(PlatScifi PRIVATE sfml-graphics) target_compile_features(PlatScifi PRIVATE cxx_std_17) diff --git a/src/main.cpp b/src/main.cpp index dc6c384..7b362cb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include "assethandler.h" #include "renderer.h" #include "renderdata.h" @@ -9,6 +9,7 @@ #include "worldobjects/redcube.h" // Debugging #include "worldobjects/bluecube.h" #include "worldobjects/stationaryimage.h" +#include "worldobjects/player.h" // SFML Demo int main() { @@ -21,18 +22,49 @@ int main() { AssetHandler assetHandler; Renderer renderer(window, assetHandler); WorldState worldState; + std::set keysPressed; + + // Main world objects + Player* player = new Player(4, 10); + worldState.spawnObject(player); + // Debug: create a red cube, blue cube, and image worldState.spawnObject(new RedCube(0, 0)); - worldState.spawnObject(new BlueCube()); + worldState.spawnObject(new BlueCube(0, 0)); worldState.spawnObject(new StationaryImage(6, 6, 2, 2, "assets/tiv_logo.png")); + // Main game loop while (window.isOpen()) { + // Poll events for (auto event = sf::Event{}; window.pollEvent(event);) { if (event.type == sf::Event::Closed) { + // Close window window.close(); + } else if (event.type == sf::Event::KeyPressed) { + keysPressed.insert(event.key.code); + } else if (event.type == sf::Event::KeyReleased) { + keysPressed.erase(event.key.code); } } + // Use input + if (keysPressed.find(sf::Keyboard::A) != keysPressed.end()) { + player->move(-0.2, 0); + } + if (keysPressed.find(sf::Keyboard::D) != keysPressed.end()) { + player->move(0.2, 0); + } + if (keysPressed.find(sf::Keyboard::W) != keysPressed.end()) { + player->move(0, -0.2); + } + if (keysPressed.find(sf::Keyboard::S) != keysPressed.end()) { + player->move(0, 0.2); + } + if (keysPressed.find(sf::Keyboard::Space) != keysPressed.end()) { + worldState.spawnObject(new BlueCube(player->getLocx(), player->getLocy())); + keysPressed.erase(sf::Keyboard::Space); + } + // Update the world worldState.update(); diff --git a/src/worldobjects/bluecube.h b/src/worldobjects/bluecube.h index ac1dd15..6020344 100644 --- a/src/worldobjects/bluecube.h +++ b/src/worldobjects/bluecube.h @@ -9,7 +9,10 @@ class BlueCube : public WorldObject { double vely = 0.15; public: - BlueCube() : WorldObject() {} + BlueCube(double spawnx, double spawny) : WorldObject() { + locx = spawnx; + locy = spawny; + } // Override the update function UpdateResult update() { diff --git a/src/worldobjects/player.h b/src/worldobjects/player.h new file mode 100644 index 0000000..97350cf --- /dev/null +++ b/src/worldobjects/player.h @@ -0,0 +1,48 @@ +#pragma once + +#include "../worldobject.h" + +// The data for the player +class Player : public WorldObject { +public: + // Constructor + Player(double spawnx, double spawny) : WorldObject() { + locx = spawnx; + locy = spawny; + } + + // Input: movement + // TODO: accelerate instead of move + void move(double deltax, double deltay) { + locx += deltax; + locy += deltay; + } + + double getLocx() { + return locx; + } + + double getLocy() { + return locy; + } + + // Override update: do nothing (yet) + UpdateResult update() { + return UpdateResult::None; + } + + // Override rendering + RenderData getRenderData() { + // TODO: image/animations + return { + RenderType::Rectangle, + coordType, + locx, + locy, + width, + height, + { 255, 0, 0 }, + "" + }; + } +};