From c1baadc75588302423828827a25dcab029171cff Mon Sep 17 00:00:00 2001 From: mitchellhansen Date: Wed, 18 Jan 2023 16:32:11 -0800 Subject: [PATCH] rendering --- .gitignore | 3 + Bird.cpp | 58 ++++----- Bird.h | 60 ++++----- CMakeLists.txt | 25 ++-- Pipe.cpp | 76 ++++++------ Pipe.h | 66 +++++----- main.cpp | 325 ++++++++++++++++++++++++++----------------------- 7 files changed, 326 insertions(+), 287 deletions(-) diff --git a/.gitignore b/.gitignore index b06e864..db3d68f 100644 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,6 @@ FakesAssemblies/ GeneratedArtifacts/ _Pvt_Extensions/ ModelManifest.xml + +cmake-build-debug/* +.idea/* \ No newline at end of file diff --git a/Bird.cpp b/Bird.cpp index cb4266a..8f94828 100644 --- a/Bird.cpp +++ b/Bird.cpp @@ -1,29 +1,29 @@ -#include -#include "Bird.h" - - -Bird::Bird(float x, float y, const std::shared_ptr> texture_list) : position(x, y), texture_list(texture_list), momentum(1.0) -{ - sprite = sf::Sprite(texture_list->at(0)); - sprite.setPosition(position); -} - -void Bird::impulse(float p) { - momentum = -p; -} - -void Bird::tick(float step) { - momentum += gravity * step; // Impart gravity - position.y += momentum; - sprite.setPosition(position); -} - -void Bird::draw(sf::RenderTarget &target, sf::RenderStates states) const { - target.draw(sprite, states); -} - -bool Bird::collides(sf::FloatRect bounds) -{ - return sprite.getGlobalBounds().intersects(bounds); -} - +//#include +//#include "Bird.h" +// +// +//Bird::Bird(float x, float y, const std::shared_ptr> texture_list) : position(x, y), texture_list(texture_list), momentum(1.0) +//{ +// sprite = sf::Sprite(texture_list->at(0)); +// sprite.setPosition(position); +//} +// +//void Bird::impulse(float p) { +// momentum = -p; +//} +// +//void Bird::tick(float step) { +// momentum += gravity * step; // Impart gravity +// position.y += momentum; +// sprite.setPosition(position); +//} +// +//void Bird::draw(sf::RenderTarget &target, sf::RenderStates states) const { +// target.draw(sprite, states); +//} +// +//bool Bird::collides(sf::FloatRect bounds) +//{ +// return sprite.getGlobalBounds().intersects(bounds); +//} +// diff --git a/Bird.h b/Bird.h index 742e069..9ed4342 100644 --- a/Bird.h +++ b/Bird.h @@ -1,30 +1,30 @@ -#ifndef FLOPPY_BIRD_BIRD_H -#define FLOPPY_BIRD_BIRD_H - -#include -#include -#include -#include - -const float gravity = 9.8; - -class Bird : public sf::Drawable { - - sf::Sprite sprite; - std::shared_ptr> texture_list; - - sf::Vector2f position; - float momentum; - -public: - Bird(float x, float y, const std::shared_ptr> texture_list); - - void impulse(float p); - void tick(float step); - bool collides(sf::FloatRect bounds); - - virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; -}; - - -#endif //FLOPPY_BIRD_BIRD_H +//#ifndef FLOPPY_BIRD_BIRD_H +//#define FLOPPY_BIRD_BIRD_H +// +//#include +//#include +//#include +//#include +// +//const float gravity = 9.8; +// +//class Bird : public sf::Drawable { +// +// sf::Sprite sprite; +// std::shared_ptr> texture_list; +// +// sf::Vector2f position; +// float momentum; +// +//public: +// Bird(float x, float y, const std::shared_ptr> texture_list); +// +// void impulse(float p); +// void tick(float step); +// bool collides(sf::FloatRect bounds); +// +// virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; +//}; +// +// +//#endif //FLOPPY_BIRD_BIRD_H diff --git a/CMakeLists.txt b/CMakeLists.txt index 8cf38a5..132a0f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,16 +6,20 @@ set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) set(PNAME floppy-bird) project(${PNAME}) -# Set up variables, and find SFML -set(SFML_ROOT root CACHE STRING "User specified path") -set(SFML_COMPONENTS graphics window system network audio) -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/" ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}) -find_package(SFML 2.5 COMPONENTS ${SFML_COMPONENTS} REQUIRED) -message(STATUS "SFML found: ${SFML_FOUND}") +# Add Corrade as a subproject +add_subdirectory(corrade EXCLUDE_FROM_ALL) + +# Add Magnum as a subproject, enable Sdl2Application +set(MAGNUM_WITH_SDL2APPLICATION ON CACHE BOOL "" FORCE) +add_subdirectory(magnum EXCLUDE_FROM_ALL) + +find_package(Magnum REQUIRED GL Sdl2Application) +message(STATUS "Magnum found: ${MAGNUM_FOUND}") + +set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON) -# Include the directories for the main program, GL, CL and SFML's headers -include_directories(${SFML_INCLUDE_DIR}) include_directories(include) # Set the sources, allows VS to filter them properly @@ -24,6 +28,11 @@ file(GLOB HEADERS "*.h") add_executable(${PNAME} ${SOURCES} Bird.cpp Bird.h Pipe.cpp Pipe.h) +target_link_libraries(${PNAME} PRIVATE + Magnum::Application + Magnum::GL + Magnum::Magnum) + # Link CL, GL, and SFML target_link_libraries (${PNAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES}) diff --git a/Pipe.cpp b/Pipe.cpp index a156f8c..d5df9ed 100644 --- a/Pipe.cpp +++ b/Pipe.cpp @@ -1,38 +1,38 @@ -#include "Pipe.h" - -#include - -Pipe::Pipe(float x, float y, - std::shared_ptr pipe_top_texture_s, - std::shared_ptr pipe_shaft_texture_s, - std::shared_ptr pipe_shaft_shader_s) : - position(x, y), - pipe_top_texture(std::move(pipe_top_texture_s)), - pipe_shaft_texture(std::move(pipe_shaft_texture_s)), - pipe_shaft_shader(std::move(pipe_shaft_shader_s)), - momentum(1.0) -{ - pipe_top = sf::Sprite(*pipe_top_texture); - pipe_shaft = sf::Sprite(*pipe_shaft_texture); - - pipe_top.setPosition(position); -} - -void Pipe::tick(float step, float speed) { - position.x += step * speed; - pipe_top.setPosition(position); - - auto pos = pipe_top.getPosition(); - pos.y += 25; - pipe_shaft.setPosition(pos); -} - -void Pipe::draw(sf::RenderTarget &target, sf::RenderStates states) const{ - states.shader = &*pipe_shaft_shader; - target.draw(pipe_top, states); - target.draw(pipe_shaft, states); -} - -bool Pipe::collides(sf::FloatRect bounds) { - return false; -} +//#include "Pipe.h" +// +//#include +// +//Pipe::Pipe(float x, float y, +// std::shared_ptr pipe_top_texture_s, +// std::shared_ptr pipe_shaft_texture_s, +// std::shared_ptr pipe_shaft_shader_s) : +// position(x, y), +// pipe_top_texture(std::move(pipe_top_texture_s)), +// pipe_shaft_texture(std::move(pipe_shaft_texture_s)), +// pipe_shaft_shader(std::move(pipe_shaft_shader_s)), +// momentum(1.0) +//{ +// pipe_top = sf::Sprite(*pipe_top_texture); +// pipe_shaft = sf::Sprite(*pipe_shaft_texture); +// +// pipe_top.setPosition(position); +//} +// +//void Pipe::tick(float step, float speed) { +// position.x += step * speed; +// pipe_top.setPosition(position); +// +// auto pos = pipe_top.getPosition(); +// pos.y += 25; +// pipe_shaft.setPosition(pos); +//} +// +//void Pipe::draw(sf::RenderTarget &target, sf::RenderStates states) const{ +// states.shader = &*pipe_shaft_shader; +// target.draw(pipe_top, states); +// target.draw(pipe_shaft, states); +//} +// +//bool Pipe::collides(sf::FloatRect bounds) { +// return false; +//} diff --git a/Pipe.h b/Pipe.h index 6cbca3b..8f02b05 100644 --- a/Pipe.h +++ b/Pipe.h @@ -1,33 +1,33 @@ -#ifndef FLOPPY_BIRD_PIPE_H -#define FLOPPY_BIRD_PIPE_H - - -#include -#include -#include -#include - -class Pipe : public sf::Drawable { - - sf::Sprite pipe_top; - sf::Sprite pipe_shaft; - - std::shared_ptr pipe_top_texture; - std::shared_ptr pipe_shaft_texture; - - std::shared_ptr pipe_shaft_shader; - - sf::Vector2f position; - float momentum; - -public: - Pipe(float x, float y, std::shared_ptr pipe_top_texture, std::shared_ptr pipe_shaft_texture, std::shared_ptr shader); - - void tick(float step, float speed); - bool collides(sf::FloatRect bounds); - - virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; -}; - - -#endif //FLOPPY_BIRD_PIPE_H +//#ifndef FLOPPY_BIRD_PIPE_H +//#define FLOPPY_BIRD_PIPE_H +// +// +//#include +//#include +//#include +//#include +// +//class Pipe : public sf::Drawable { +// +// sf::Sprite pipe_top; +// sf::Sprite pipe_shaft; +// +// std::shared_ptr pipe_top_texture; +// std::shared_ptr pipe_shaft_texture; +// +// std::shared_ptr pipe_shaft_shader; +// +// sf::Vector2f position; +// float momentum; +// +//public: +// Pipe(float x, float y, std::shared_ptr pipe_top_texture, std::shared_ptr pipe_shaft_texture, std::shared_ptr shader); +// +// void tick(float step, float speed); +// bool collides(sf::FloatRect bounds); +// +// virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; +//}; +// +// +//#endif //FLOPPY_BIRD_PIPE_H diff --git a/main.cpp b/main.cpp index 146e1d7..3257d81 100644 --- a/main.cpp +++ b/main.cpp @@ -1,17 +1,47 @@ -#include -#include #include #include #include #include #include "Bird.h" #include "Pipe.h" +#include "Magnum/GL/Renderer.h" +#include "Magnum/Math/Color.h" #ifdef linux #elif defined _WIN32 #elif defined TARGET_OS_MAC #endif +#include +#include + +using namespace Magnum; + +class MyApplication: public Platform::Application { +public: + explicit MyApplication(const Arguments& arguments); + +private: + void drawEvent() override; +}; + +MyApplication::MyApplication(const Arguments& arguments): Platform::Application{arguments} { + /* TODO: Add your initialization code here */ +} + +void MyApplication::drawEvent() { + + Color4 r; + GL::Renderer::setClearColor(Color4::red()); + GL::defaultFramebuffer.clear(GL::FramebufferClear::Color); + + + + swapBuffers(); +} + +MAGNUM_APPLICATION_MAIN(MyApplication) + const float g = 7.8; const int WINDOW_X = 600; const int WINDOW_Y = 800; @@ -29,151 +59,148 @@ float elap_time() { std::chrono::duration elapsed_time = now - start; return static_cast(elapsed_time.count()); } - -int main() -{ - std::mt19937 rng(time(NULL)); - std::uniform_int_distribution rgen(100, 400); - - int pipe_dist = 200; - - sf::RenderWindow window(sf::VideoMode(WINDOW_X, WINDOW_Y), "flappy"); - - std::shared_ptr> texture_list = std::make_shared>(); - for (int i = 0; i < 4; i++) { - sf::Texture t; - t.loadFromFile("../Assets/bird.png", sf::IntRect(0, i*12, 34, 24)); - texture_list->push_back(t); - } - - // Init flappy - Bird bird(WINDOW_X/2, WINDOW_Y/2, texture_list); - - std::list pipes; - - // Init world - sf::Texture background = sf::Texture(); background.loadFromFile("../Assets/sky.png"); - sf::Sprite background_sprite = sf::Sprite(background); background_sprite.setPosition(0, 0); background_sprite.setScale(8, 8); - sf::Texture land = sf::Texture(); land.loadFromFile("../Assets/land.png"); - sf::Sprite land_sprite = sf::Sprite(land); land_sprite.setPosition(0, WINDOW_Y - WINDOW_Y / 10); land_sprite.setScale(3, 2); - sf::Texture pipe_up, pipe_down = sf::Texture(); pipe_down.loadFromFile("../Assets/pipe-down.png"); pipe_up.loadFromFile("../Assets/pipe-up.png"); - sf::Sprite pipe_up_sprite = sf::Sprite(pipe_up); sf::Sprite pipe_down_sprite = sf::Sprite(pipe_down); - sf::Texture pipe_shaft = sf::Texture(); pipe_shaft.loadFromFile("../Assets/pipe.png"); - sf::Sprite pipe_shaft_sprite = sf::Sprite(pipe_shaft); - - double momentum = 0; - float step_size = 0.005f; - double frame_time = 0.0, elapsed_time = 0.0, delta_time = 0.0, accumulator_time = 0.0, current_time = 0.0; - float speed = 250; - - std::shared_ptr shader = std::make_shared(); - if (!shader->loadFromFile("/home/mrh/source/floppy-bird/Assets/shaders/pipe_shader.vert", "/home/mrh/source/floppy-bird/Assets/shaders/pipe_shader.frag")) - { - std::cout << "asodijfoqijwef" << std::endl; - } - - while (window.isOpen()) - { - sf::Event event; // Handle input - while (window.pollEvent(event)) { - if (event.type == sf::Event::Closed) - window.close(); - if (event.type == sf::Event::MouseWheelScrolled) - if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) - speed += event.mouseWheelScroll.delta * 20; - if(event.type == sf::Event::KeyPressed) - if (event.key.code == sf::Keyboard::Space) - bird.impulse(3.0); - if (event.type == sf::Event::MouseButtonPressed) { - if (event.mouseButton.button == sf::Mouse::Right) - pipe_dist -= 10; - if (event.mouseButton.button == sf::Mouse::Middle) - pipe_dist += 10; - if (event.mouseButton.button == sf::Mouse::Left) - bird.impulse(3.0); - } - } - - elapsed_time = elap_time(); // Handle time - delta_time = elapsed_time - current_time; - current_time = elapsed_time; - if (delta_time > 0.02f) { - delta_time = 0.02f; - } - accumulator_time += delta_time; - - while ((accumulator_time - step_size) >= step_size) { // While the frame has sim time, update - accumulator_time -= step_size; - - if (pipe_down_sprite.getPosition().x < -pipe_down_sprite.getGlobalBounds().width) { - pipe_down_sprite.setPosition(WINDOW_X, rgen(rng)); - pipe_up_sprite.setPosition(WINDOW_X, pipe_down_sprite.getPosition().y + pipe_dist); - - pipes.emplace_back(100, 100, std::make_shared(pipe_up), std::make_shared(pipe_shaft), shader); - std::cout << "added one" << std::endl; - } - else { - pipe_up_sprite.setPosition(pipe_up_sprite.getPosition().x - step_size * speed, pipe_up_sprite.getPosition().y); - pipe_down_sprite.setPosition(pipe_down_sprite.getPosition().x - step_size * speed, pipe_down_sprite.getPosition().y); - } - if (background_sprite.getPosition().x + background_sprite.getGlobalBounds().width < WINDOW_X) { - background_sprite.setPosition(0, 0); - } - else - background_sprite.setPosition(background_sprite.getPosition().x - step_size * (speed - 100), background_sprite.getPosition().y); - if (land_sprite.getPosition().x + 10 + land_sprite.getGlobalBounds().width < WINDOW_X) - land_sprite.setPosition(14, land_sprite.getPosition().y); - else - land_sprite.setPosition(land_sprite.getPosition().x - step_size * speed, land_sprite.getPosition().y); - - // Check collisions - if (bird.collides(pipe_up_sprite.getGlobalBounds()) || - bird.collides(pipe_down_sprite.getGlobalBounds()) || - bird.collides(land_sprite.getGlobalBounds()) - ) - { - //std::cout << "dead!!!!!!!!" << std::endl; - } - - bird.tick(step_size); - for (auto pipe = pipes.begin(); pipe != pipes.end(); ++pipe) - { - pipe->tick(step_size, speed); - } - } - - window.draw(background_sprite, &*shader); // Render - window.draw(land_sprite); - window.draw(bird); - window.draw(pipe_up_sprite); - window.draw(pipe_down_sprite); - - for (auto ptr = pipes.begin(); ptr != pipes.end(); ++ptr) - { - window.draw(*ptr); - } - - pipe_shaft_sprite.setPosition(pipe_up_sprite.getPosition()); // Render the bottom pipe - int y_pos = pipe_up_sprite.getPosition().y + pipe_up_sprite.getGlobalBounds().height; - while (y_pos < WINDOW_Y) { - pipe_shaft_sprite.setPosition(pipe_shaft_sprite.getPosition().x, y_pos); - y_pos++; - window.draw(pipe_shaft_sprite); - } - - y_pos = pipe_down_sprite.getPosition().y; // Render the top pipe - while (y_pos > 0) { - pipe_shaft_sprite.setPosition(pipe_shaft_sprite.getPosition().x, y_pos); - y_pos--; - window.draw(pipe_shaft_sprite); - } - - window.display(); - - - - } - return 0; - -} +// +//int main() +//{ +// std::mt19937 rng(time(NULL)); +// std::uniform_int_distribution rgen(100, 400); +// +// int pipe_dist = 200; + + //sf::RenderWindow window(sf::VideoMode(WINDOW_X, WINDOW_Y), "flappy"); + +// std::shared_ptr> texture_list = std::make_shared>(); +// for (int i = 0; i < 4; i++) { +// sf::Texture t; +// t.loadFromFile("../Assets/bird.png", sf::IntRect(0, i*12, 34, 24)); +// texture_list->push_back(t); +// } +// +// // Init flappy +// Bird bird(WINDOW_X/2, WINDOW_Y/2, texture_list); +// +// std::list pipes; +// +// // Init world +// sf::Texture background = sf::Texture(); background.loadFromFile("../Assets/sky.png"); +// sf::Sprite background_sprite = sf::Sprite(background); background_sprite.setPosition(0, 0); background_sprite.setScale(8, 8); +// sf::Texture land = sf::Texture(); land.loadFromFile("../Assets/land.png"); +// sf::Sprite land_sprite = sf::Sprite(land); land_sprite.setPosition(0, WINDOW_Y - WINDOW_Y / 10); land_sprite.setScale(3, 2); +// sf::Texture pipe_up, pipe_down = sf::Texture(); pipe_down.loadFromFile("../Assets/pipe-down.png"); pipe_up.loadFromFile("../Assets/pipe-up.png"); +// sf::Sprite pipe_up_sprite = sf::Sprite(pipe_up); sf::Sprite pipe_down_sprite = sf::Sprite(pipe_down); +// sf::Texture pipe_shaft = sf::Texture(); pipe_shaft.loadFromFile("../Assets/pipe.png"); +// sf::Sprite pipe_shaft_sprite = sf::Sprite(pipe_shaft); +// +// double momentum = 0; +// float step_size = 0.005f; +// double frame_time = 0.0, elapsed_time = 0.0, delta_time = 0.0, accumulator_time = 0.0, current_time = 0.0; +// float speed = 250; +// +// std::shared_ptr shader = std::make_shared(); +// if (!shader->loadFromFile("/home/mrh/source/floppy-bird/Assets/shaders/pipe_shader.vert", "/home/mrh/source/floppy-bird/Assets/shaders/pipe_shader.frag")) +// { +// std::cout << "asodijfoqijwef" << std::endl; +// } +// +// while (window.isOpen()) +// { +// sf::Event event; // Handle input +// while (window.pollEvent(event)) { +// if (event.type == sf::Event::Closed) +// window.close(); +// if (event.type == sf::Event::MouseWheelScrolled) +// if (event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) +// speed += event.mouseWheelScroll.delta * 20; +// if(event.type == sf::Event::KeyPressed) +// if (event.key.code == sf::Keyboard::Space) +// bird.impulse(3.0); +// if (event.type == sf::Event::MouseButtonPressed) { +// if (event.mouseButton.button == sf::Mouse::Right) +// pipe_dist -= 10; +// if (event.mouseButton.button == sf::Mouse::Middle) +// pipe_dist += 10; +// if (event.mouseButton.button == sf::Mouse::Left) +// bird.impulse(3.0); +// } +// } +// +// elapsed_time = elap_time(); // Handle time +// delta_time = elapsed_time - current_time; +// current_time = elapsed_time; +// if (delta_time > 0.02f) { +// delta_time = 0.02f; +// } +// accumulator_time += delta_time; +// +// while ((accumulator_time - step_size) >= step_size) { // While the frame has sim time, update +// accumulator_time -= step_size; +// +// if (pipe_down_sprite.getPosition().x < -pipe_down_sprite.getGlobalBounds().width) { +// pipe_down_sprite.setPosition(WINDOW_X, rgen(rng)); +// pipe_up_sprite.setPosition(WINDOW_X, pipe_down_sprite.getPosition().y + pipe_dist); +// +// pipes.emplace_back(100, 100, std::make_shared(pipe_up), std::make_shared(pipe_shaft), shader); +// std::cout << "added one" << std::endl; +// } +// else { +// pipe_up_sprite.setPosition(pipe_up_sprite.getPosition().x - step_size * speed, pipe_up_sprite.getPosition().y); +// pipe_down_sprite.setPosition(pipe_down_sprite.getPosition().x - step_size * speed, pipe_down_sprite.getPosition().y); +// } +// if (background_sprite.getPosition().x + background_sprite.getGlobalBounds().width < WINDOW_X) { +// background_sprite.setPosition(0, 0); +// } +// else +// background_sprite.setPosition(background_sprite.getPosition().x - step_size * (speed - 100), background_sprite.getPosition().y); +// if (land_sprite.getPosition().x + 10 + land_sprite.getGlobalBounds().width < WINDOW_X) +// land_sprite.setPosition(14, land_sprite.getPosition().y); +// else +// land_sprite.setPosition(land_sprite.getPosition().x - step_size * speed, land_sprite.getPosition().y); +// +// // Check collisions +// if (bird.collides(pipe_up_sprite.getGlobalBounds()) || +// bird.collides(pipe_down_sprite.getGlobalBounds()) || +// bird.collides(land_sprite.getGlobalBounds()) +// ) +// { +// //std::cout << "dead!!!!!!!!" << std::endl; +// } +// +// bird.tick(step_size); +// for (auto pipe = pipes.begin(); pipe != pipes.end(); ++pipe) +// { +// pipe->tick(step_size, speed); +// } +// } +// +// window.draw(background_sprite, &*shader); // Render +// window.draw(land_sprite); +// window.draw(bird); +// window.draw(pipe_up_sprite); +// window.draw(pipe_down_sprite); +// +// for (auto ptr = pipes.begin(); ptr != pipes.end(); ++ptr) +// { +// window.draw(*ptr); +// } +// +// pipe_shaft_sprite.setPosition(pipe_up_sprite.getPosition()); // Render the bottom pipe +// int y_pos = pipe_up_sprite.getPosition().y + pipe_up_sprite.getGlobalBounds().height; +// while (y_pos < WINDOW_Y) { +// pipe_shaft_sprite.setPosition(pipe_shaft_sprite.getPosition().x, y_pos); +// y_pos++; +// window.draw(pipe_shaft_sprite); +// } +// +// y_pos = pipe_down_sprite.getPosition().y; // Render the top pipe +// while (y_pos > 0) { +// pipe_shaft_sprite.setPosition(pipe_shaft_sprite.getPosition().x, y_pos); +// y_pos--; +// window.draw(pipe_shaft_sprite); +// } +// +// window.display(); +// } +// return 0; +// +//}