diff --git a/README.de.md b/README.de.md index 6b3d0d6..274cee6 100644 --- a/README.de.md +++ b/README.de.md @@ -1,40 +1,41 @@ # ParadiSO - eine minimale 2D-Grafikengine -**ParadiSO** wurde als stark abgespeckte 2D-Version meiner `pixwerx`-Engine konzipiert. *ParadiSO* verfolgt einen minimalistischen Ansatz f�r 2D-Grafik zu Bildungszwecken. Es verwendet modernes C++ und ein datengetriebenes Design, jedoch keine ECS (Entity Component System). +**ParadiSO** wurde als stark abgespeckte 2D-Version meiner `pixwerx`-Engine konzipiert. _ParadiSO_ verfolgt einen minimalistischen Ansatz für 2D-Grafik zu Bildungszwecken. Es verwendet modernes C++ und ein datengetriebenes Design, jedoch keine ECS (Entity Component System). ## Bildungszwecke -Einige Argumente f�r seinen Bildungsaspekt: +Einige Argumente für seinen Bildungsaspekt: -- Kombination verschiedener Konzepte und Paradigmen zur Erstellung ausdrucksstarker, aber knappen Codes -- Stark von Rust-Code inspiriert -- F�r den mathematischen Code wird eine sofortige Auswertung verwendet (keine Expression-Templates), jedoch mit der Verwendung von `constexpr`, um eventuelle Performance-Overheads auszugleichen und optimale Vektorisierung zu erreichen. -- Versteckt alte `C`-APIs hinter einer modernisierten Fassade -- Es lehnt sich stark an die STL und ihre Algorithmen an +- Kombination verschiedener Konzepte und Paradigmen zur Erstellung ausdrucksstarker, aber knappen Codes +- Stark von Rust-Code inspiriert +- Für den mathematischen Code wird eine sofortige Auswertung verwendet (keine Expression-Templates), jedoch mit der Verwendung von `constexpr`, um eventuelle Performance-Overheads auszugleichen und optimale Vektorisierung zu erreichen. +- Versteckt alte `C`-APIs hinter einer modernisierten Fassade +- Es lehnt sich stark an die STL und ihre Algorithmen an ## Minimalistisch -Da diese Engine einige Muster und Designkonzepte zeigen soll, versucht sie, unn�tigen Ballast zu vermeiden. +Da diese Engine einige Muster und Designkonzepte zeigen soll, versucht sie, unnötigen Ballast zu vermeiden. -## Abh�ngigkeiten +## Abhängigkeiten -ParadiSO wird mit den notwendigen Komponenten geliefert. Diese sollte jedoch hier erw�hnt werden: +ParadiSO wird mit den notwendigen Komponenten geliefert. Diese sollte jedoch hier erwähnt werden: -- [GLFW 3.3.8](https://github.com/glfw/glfw) -- [GLAD](https://github.com/Dav1dde/glad) -- [STB image](https://github.com/nothings/stb) +- [GLFW 3.3.8](https://github.com/glfw/glfw) +- [GLAD](https://github.com/Dav1dde/glad) +- [STB image](https://github.com/nothings/stb) ## Toolchains ParadiSO kann auf verschiedenen Plattformen gebaut werden -- Windows (Visual Studio Build Tools 2022) -- MacOS (clang 14 or later) -- Linux (clang 14 or later, gcc 13.2.1) +- Windows (Visual Studio Build Tools 2022) +- MacOS (clang 14 or later) +- Linux (clang 14 or later, gcc 13.2.1) Andere Kombinationen sind möglich aber nicht getestet. -## Beitr�ge +## Beiträge -* [Tim G�tzelmann](https://code.technotecture.net/Timeplex) Windows Build -* [Robin Rottst�dt](https://code.technotecture.net/robin_rottstaedt) Flappy Bird Clone, Bitmap Loader \ No newline at end of file +- [Tim Götzelmann](https://code.technotecture.net/Timeplex) Windows Build +- [Robin Rottstädt](https://code.technotecture.net/robin_rottstaedt) Flappy Bird Clone, Bitmap Loader +- [brxxh](https://code.technotecture.net/brxxh) Flappy Bird Clone diff --git a/README.md b/README.md index 6f3f006..07828bc 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,41 @@ # ParadiSO - a minimal 2D graphics engine -**ParadiSO** was conceived as a heavily stripped down 2D version of my `pixwerx` engine. *ParadiSO* mimics a minimalistic approach to 2D graphics for educational purposes. It uses modern C++ and a data-driven design, but no ECS. +**ParadiSO** was conceived as a heavily stripped down 2D version of my `pixwerx` engine. _ParadiSO_ mimics a minimalistic approach to 2D graphics for educational purposes. It uses modern C++ and a data-driven design, but no ECS. ## Educational Some arguments for its educational side: -* mix and match of various concepts and paradigms to write expressive but concise code -* heavily inspired by Rust code -* math code is eager evaluation but `constexpr` to compensate overheads -* hides old-style `C` APIs behind a renovated facade -* it leans heavily on the STL and its algorithms +- mix and match of various concepts and paradigms to write expressive but concise code +- heavily inspired by Rust code +- math code is eager evaluation but `constexpr` to compensate overheads +- hides old-style `C` APIs behind a renovated facade +- it leans heavily on the STL and its algorithms ## Minimal -Because this engine should show some patterns and design concepts it tries to avoid adding unnecessary bloat. +Because this engine should show some patterns and design concepts it tries to avoid adding unnecessary bloat. ## Dependencies ParadiSO comes with batteries included. However, it should be mentioned here: -- [GLFW 3.3.8](https://github.com/glfw/glfw) -- [GLAD](https://github.com/Dav1dde/glad) -- [STB image](https://github.com/nothings/stb) +- [GLFW 3.3.8](https://github.com/glfw/glfw) +- [GLAD](https://github.com/Dav1dde/glad) +- [STB image](https://github.com/nothings/stb) ## Toolchains ParadiSO is being developed to work on all major desktop systems. -- Windows (Visual Studio Build Tools 2022) -- MacOS (clang 14 or later) -- Linux (clang 14 or later, gcc 13.2.1) +- Windows (Visual Studio Build Tools 2022) +- MacOS (clang 14 or later) +- Linux (clang 14 or later, gcc 13.2.1) Other combinations might work but are untested. - ## Contributors -* [Tim Götzelmann](https://code.technotecture.net/Timeplex) Windows Build -* [Robin Rottstädt](https://code.technotecture.net/robin_rottstaedt) Flappy Bird Clone, Bitmap Loader \ No newline at end of file +- [Tim Götzelmann](https://code.technotecture.net/Timeplex) Windows Build +- [Robin Rottstädt](https://code.technotecture.net/robin_rottstaedt) Flappy Bird Clone, Bitmap Loader +- [brxxh](https://code.technotecture.net/brxxh) Flappy Bird Clone diff --git a/examples/quickwings/assets/background-day.png b/examples/quickwings/assets/background-day.png index afcb5ec..f9ed139 100644 Binary files a/examples/quickwings/assets/background-day.png and b/examples/quickwings/assets/background-day.png differ diff --git a/examples/quickwings/assets/base.png b/examples/quickwings/assets/base.png index c374f2b..2ba45d3 100644 Binary files a/examples/quickwings/assets/base.png and b/examples/quickwings/assets/base.png differ diff --git a/examples/quickwings/assets/blank.png b/examples/quickwings/assets/blank.png new file mode 100644 index 0000000..5c1b88f Binary files /dev/null and b/examples/quickwings/assets/blank.png differ diff --git a/examples/quickwings/assets/gameover.png b/examples/quickwings/assets/gameover.png new file mode 100644 index 0000000..b1df7f5 Binary files /dev/null and b/examples/quickwings/assets/gameover.png differ diff --git a/examples/quickwings/assets/message.png b/examples/quickwings/assets/message.png new file mode 100644 index 0000000..9243ab5 Binary files /dev/null and b/examples/quickwings/assets/message.png differ diff --git a/examples/quickwings/quickwings.cpp b/examples/quickwings/quickwings.cpp index cd25735..6146f12 100644 --- a/examples/quickwings/quickwings.cpp +++ b/examples/quickwings/quickwings.cpp @@ -1,7 +1,7 @@ /** * paradiso - Paradigmen der Softwareentwicklung * - * (c) Copyright 2023 Hartmut Seichter, Robin Rottstädt + * (c) Copyright 2023 Hartmut Seichter, Robin Rottstädt, brxxh (Hannes Brothuhn) * */ @@ -38,22 +38,22 @@ struct Background { paradiso::BitmapIO::get().load("background-day.png"); backgroundLeft = paradiso::Sprite{ .bitmap = backgroundImage, - .pivot = paradiso::Vector2::make(0.0f, 0.0f), - .scale = paradiso::Vector2::make(1.01f, 1.0f)}; + .pivot = {paradiso::Vector2::make(0.0f, 0.16f)}, + .scale = {paradiso::Vector2::make(1.01f, 1.3f)}}; backgroundRight = paradiso::Sprite{ .bitmap = backgroundImage, - .pivot = paradiso::Vector2::make(2.0f, 0.0f), - .scale = paradiso::Vector2::make(1.01f, 1.0f)}; + .pivot = {paradiso::Vector2::make(2.018f, 0.16f)}, + .scale = {paradiso::Vector2::make(1.01f, 1.3f)}}; auto grassImage = paradiso::BitmapIO::get().load("base.png"); grassLeft = paradiso::Sprite{ .bitmap = grassImage, - .pivot = paradiso::Vector2::make(0.0f, -1.0f), - .scale = paradiso::Vector2::make(1.0f, 0.33333f)}; + .pivot = {paradiso::Vector2::make(0.0f, -1.0f)}, + .scale = {paradiso::Vector2::make(1.0f, 0.33333f)}}; grassRight = paradiso::Sprite{ .bitmap = grassImage, - .pivot = paradiso::Vector2::make(2.0f, -1.0f), - .scale = paradiso::Vector2::make(1.0f, 0.33333f)}; + .pivot = {paradiso::Vector2::make(2.0f, -1.0f)}, + .scale = {paradiso::Vector2::make(1.0f, 0.33333f)}}; } void draw(const paradiso::Shader& shader) { @@ -61,7 +61,7 @@ struct Background { if (sprite->pivot.x() <= -2.0f) { sprite->pivot.x() += 4.0f; } - sprite->pivot.x() -= 0.001f; + sprite->pivot.x() -= 0.002f; shader.set_uniform("pivot", sprite->pivot); shader.set_uniform("scale", sprite->scale); shader.set_uniform("rotation", sprite->rotation); @@ -79,23 +79,23 @@ struct Grass { paradiso::Sprite* scrolling[2] = {&grassLeft, &grassRight}; Grass() { - auto grassImage = paradiso::BitmapIO::get().load(std::string("base.png")); + auto grassImage = paradiso::BitmapIO::get().load("base.png"); grassLeft = paradiso::Sprite{ .bitmap = grassImage, - .pivot = paradiso::Vector2::make(0.0f, -0.9f), - .scale = paradiso::Vector2::make(1.0f, 0.33333f)}; + .pivot = {paradiso::Vector2::make(1.0f, -0.9f)}, + .scale = {paradiso::Vector2::make(2.0f, 0.33333f)}}; grassRight = paradiso::Sprite{ .bitmap = grassImage, - .pivot = paradiso::Vector2::make(2.0f, -0.9f), - .scale = paradiso::Vector2::make(1.0f, 0.33333f)}; + .pivot = {paradiso::Vector2::make(1.0f, -0.9f)}, + .scale = {paradiso::Vector2::make(2.6f, 0.33333f)}}; } void draw(const paradiso::Shader& shader) { for (auto sprite : scrolling) { - if (sprite->pivot.x() <= -2.0f) { - sprite->pivot.x() += 4.0f; + if (sprite->pivot.x() <= -1.0f) { + sprite->pivot.x() += 2.0f; } - sprite->pivot.x() -= 0.035f; + sprite->pivot.x() -= 0.03f; shader.set_uniform("pivot", sprite->pivot); shader.set_uniform("scale", sprite->scale); shader.set_uniform("rotation", sprite->rotation); @@ -106,6 +106,7 @@ struct Grass { paradiso::Renderer renderer{}; }; + struct QuickWings { paradiso::Renderer renderer1{}; @@ -118,10 +119,10 @@ struct QuickWings { unsigned int flapCounter = 0; // How many ticks since last flap float velocity = 0.0f; - const float max_velocity = 0.05f; + const float max_velocity = 0.04f; const float gravity = -0.004f; - const float move_up_velocity = 0.0055f; + const float move_up_velocity = 0.04f; bool move_up = false; bool paused = true; @@ -129,30 +130,30 @@ struct QuickWings { const float max_pos = 0.95f; const float min_pos = -0.5f; - float pos = 0.0f; + float pos = 0.34f; float rotation = 0.0f; QuickWings() { - float scaleh = 0.07f; - float scalew = scaleh * 1.416666666666667f; + float scaleh = 0.08f; + float scalew = 0.158f; birds = { paradiso::Sprite{ .bitmap = paradiso::BitmapIO::get().load("yellowbird-downflap.png"), - .pivot = paradiso::Vector2::make(0.0f, 0.0f), - .scale = paradiso::Vector2::make(scalew, scaleh)}, + .pivot = {paradiso::Vector2::make(0.0f, 0.0f)}, + .scale = {paradiso::Vector2::make(scalew, scaleh)}}, paradiso::Sprite{ .bitmap = paradiso::BitmapIO::get().load("yellowbird-midflap.png"), - .pivot = paradiso::Vector2::make(0.0f, 0.0f), - .scale = paradiso::Vector2::make(scalew, scaleh)}, + .pivot = {paradiso::Vector2::make(0.0f, 0.0f)}, + .scale = {paradiso::Vector2::make(scalew, scaleh)}}, paradiso::Sprite{ .bitmap = paradiso::BitmapIO::get().load("yellowbird-upflap.png"), - .pivot = paradiso::Vector2::make(0.0f, 0.0f), - .scale = paradiso::Vector2::make(scalew, scaleh)}}; + .pivot = {paradiso::Vector2::make(0.0f, 0.0f)}, + .scale = {paradiso::Vector2::make(scalew, scaleh)}}}; } void draw(const paradiso::Shader& shader) { @@ -185,6 +186,7 @@ struct QuickWings { } void update() { + // Stop game if (paused) return; @@ -213,7 +215,7 @@ struct QuickWings { } // Update rotation - rotation = velocity * 15.0f; + rotation = velocity * 10.0f; } // keyboard handler @@ -231,6 +233,30 @@ struct QuickWings { } }; +/* +TODO: finish this + +struct Message { + paradiso::Sprite messageSprite; + paradiso::Renderer renderer{}; + + Message() { + auto messageImage = paradiso::BitmapIO::get().load("message.png"); + messageSprite = paradiso::Sprite{ + .bitmap = messageImage, + .pivot = {paradiso::Vector2::make(0.0f, 0.0f)}, + .scale = {paradiso::Vector2::make(0.8f, 0.8f)} + }; + }; + + void draw(const paradiso::Shader& shader) { + shader.set_uniform("pivot", messageSprite.pivot); + shader.set_uniform("scale", messageSprite.scale); + renderer.draw(messageSprite, shader); + } +}; +*/ + auto main() -> int { // Ausgabefenster ... sieht aus als wäre es auf dem Stack @@ -274,9 +300,9 @@ auto main() -> int { paradiso::BitmapIO::get().set_path("assets"); // Load + //* auto message = Message{}; auto background = Background{}; auto grass = Grass{}; - auto quickwingsapp = QuickWings{}; // timer @@ -298,6 +324,7 @@ auto main() -> int { // Draw background.draw(shader); grass.draw(shader); + //* message.draw(shader); quickwingsapp.draw(shader); // wait for frame rate