diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 713b59e..9d4c49a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,3 +1,3 @@ add_subdirectory(simple) add_subdirectory(pong) -add_subdirectory(tappyplane) +add_subdirectory(quickwings) \ No newline at end of file diff --git a/examples/quickwings/CMakeLists.txt b/examples/quickwings/CMakeLists.txt new file mode 100644 index 0000000..5ac3667 --- /dev/null +++ b/examples/quickwings/CMakeLists.txt @@ -0,0 +1,23 @@ +set(quickwings_srcs quickwings.cpp) +set(quickwings_assets + assets/background-day.png + assets/base.png + assets/pipe-green.png + assets/yellowbird-downflap.png + assets/yellowbird-midflap.png + assets/yellowbird-upflap.png + ) + +set_source_files_properties(${quickwings_assets} PROPERTIES HEADER_FILE_ONLY TRUE) + +add_executable(quickwings ${quickwings_srcs} ${quickwings_assets}) + +target_link_libraries(quickwings paradiso_core) + +# +# copy files to bin/../assets folder +# +add_custom_command(TARGET quickwings POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_CURRENT_SOURCE_DIR}/assets/ + $/assets) diff --git a/examples/quickwings/assets/background-day.png b/examples/quickwings/assets/background-day.png new file mode 100644 index 0000000..f9ed139 Binary files /dev/null and b/examples/quickwings/assets/background-day.png differ diff --git a/examples/quickwings/assets/base.png b/examples/quickwings/assets/base.png new file mode 100644 index 0000000..26fa391 Binary files /dev/null and b/examples/quickwings/assets/base.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/assets/pipe-green.png b/examples/quickwings/assets/pipe-green.png new file mode 100644 index 0000000..4664401 Binary files /dev/null and b/examples/quickwings/assets/pipe-green.png differ diff --git a/examples/tappyplane/assets/Font/kenvector_future.ttf b/examples/quickwings/assets/tappybird/Font/kenvector_future.ttf similarity index 100% rename from examples/tappyplane/assets/Font/kenvector_future.ttf rename to examples/quickwings/assets/tappybird/Font/kenvector_future.ttf diff --git a/examples/tappyplane/assets/Font/kenvector_future_thin.ttf b/examples/quickwings/assets/tappybird/Font/kenvector_future_thin.ttf similarity index 100% rename from examples/tappyplane/assets/Font/kenvector_future_thin.ttf rename to examples/quickwings/assets/tappybird/Font/kenvector_future_thin.ttf diff --git a/examples/tappyplane/assets/PNG/Letters/letterA.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterA.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterA.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterA.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterB.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterB.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterB.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterB.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterC.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterC.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterC.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterC.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterD.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterD.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterD.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterD.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterE.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterE.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterE.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterE.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterF.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterF.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterF.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterF.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterG.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterG.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterG.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterG.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterH.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterH.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterH.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterH.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterI.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterI.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterI.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterI.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterJ.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterJ.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterJ.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterJ.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterK.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterK.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterK.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterK.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterL.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterL.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterL.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterL.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterM.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterM.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterM.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterM.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterN.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterN.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterN.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterN.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterO.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterO.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterO.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterO.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterP.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterP.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterP.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterP.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterQ.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterQ.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterQ.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterQ.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterR.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterR.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterR.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterR.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterS.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterS.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterS.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterS.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterT.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterT.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterT.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterT.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterU.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterU.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterU.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterU.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterV.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterV.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterV.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterV.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterW.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterW.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterW.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterW.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterX.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterX.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterX.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterX.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterY.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterY.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterY.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterY.png diff --git a/examples/tappyplane/assets/PNG/Letters/letterZ.png b/examples/quickwings/assets/tappybird/PNG/Letters/letterZ.png similarity index 100% rename from examples/tappyplane/assets/PNG/Letters/letterZ.png rename to examples/quickwings/assets/tappybird/PNG/Letters/letterZ.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number0.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number0.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number0.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number0.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number1.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number1.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number1.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number1.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number2.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number2.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number2.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number2.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number3.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number3.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number3.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number3.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number4.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number4.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number4.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number4.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number5.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number5.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number5.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number5.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number6.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number6.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number6.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number6.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number7.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number7.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number7.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number7.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number8.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number8.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number8.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number8.png diff --git a/examples/tappyplane/assets/PNG/Numbers/number9.png b/examples/quickwings/assets/tappybird/PNG/Numbers/number9.png similarity index 100% rename from examples/tappyplane/assets/PNG/Numbers/number9.png rename to examples/quickwings/assets/tappybird/PNG/Numbers/number9.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeBlue1.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeBlue1.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeBlue1.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeBlue1.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeBlue2.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeBlue2.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeBlue2.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeBlue2.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeBlue3.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeBlue3.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeBlue3.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeBlue3.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeGreen1.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeGreen1.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeGreen1.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeGreen1.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeGreen2.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeGreen2.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeGreen2.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeGreen2.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeGreen3.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeGreen3.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeGreen3.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeGreen3.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeRed1.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeRed1.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeRed1.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeRed1.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeRed2.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeRed2.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeRed2.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeRed2.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeRed3.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeRed3.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeRed3.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeRed3.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeYellow1.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeYellow1.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeYellow1.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeYellow1.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeYellow2.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeYellow2.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeYellow2.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeYellow2.png diff --git a/examples/tappyplane/assets/PNG/Planes/planeYellow3.png b/examples/quickwings/assets/tappybird/PNG/Planes/planeYellow3.png similarity index 100% rename from examples/tappyplane/assets/PNG/Planes/planeYellow3.png rename to examples/quickwings/assets/tappybird/PNG/Planes/planeYellow3.png diff --git a/examples/tappyplane/assets/PNG/UI/UIbg.png b/examples/quickwings/assets/tappybird/PNG/UI/UIbg.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/UIbg.png rename to examples/quickwings/assets/tappybird/PNG/UI/UIbg.png diff --git a/examples/tappyplane/assets/PNG/UI/buttonLarge.png b/examples/quickwings/assets/tappybird/PNG/UI/buttonLarge.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/buttonLarge.png rename to examples/quickwings/assets/tappybird/PNG/UI/buttonLarge.png diff --git a/examples/tappyplane/assets/PNG/UI/buttonSmall.png b/examples/quickwings/assets/tappybird/PNG/UI/buttonSmall.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/buttonSmall.png rename to examples/quickwings/assets/tappybird/PNG/UI/buttonSmall.png diff --git a/examples/tappyplane/assets/PNG/UI/medalBronze.png b/examples/quickwings/assets/tappybird/PNG/UI/medalBronze.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/medalBronze.png rename to examples/quickwings/assets/tappybird/PNG/UI/medalBronze.png diff --git a/examples/tappyplane/assets/PNG/UI/medalGold.png b/examples/quickwings/assets/tappybird/PNG/UI/medalGold.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/medalGold.png rename to examples/quickwings/assets/tappybird/PNG/UI/medalGold.png diff --git a/examples/tappyplane/assets/PNG/UI/medalSilver.png b/examples/quickwings/assets/tappybird/PNG/UI/medalSilver.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/medalSilver.png rename to examples/quickwings/assets/tappybird/PNG/UI/medalSilver.png diff --git a/examples/tappyplane/assets/PNG/UI/tap.png b/examples/quickwings/assets/tappybird/PNG/UI/tap.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/tap.png rename to examples/quickwings/assets/tappybird/PNG/UI/tap.png diff --git a/examples/tappyplane/assets/PNG/UI/tapLeft.png b/examples/quickwings/assets/tappybird/PNG/UI/tapLeft.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/tapLeft.png rename to examples/quickwings/assets/tappybird/PNG/UI/tapLeft.png diff --git a/examples/tappyplane/assets/PNG/UI/tapRight.png b/examples/quickwings/assets/tappybird/PNG/UI/tapRight.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/tapRight.png rename to examples/quickwings/assets/tappybird/PNG/UI/tapRight.png diff --git a/examples/tappyplane/assets/PNG/UI/tapTick.png b/examples/quickwings/assets/tappybird/PNG/UI/tapTick.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/tapTick.png rename to examples/quickwings/assets/tappybird/PNG/UI/tapTick.png diff --git a/examples/tappyplane/assets/PNG/UI/textGameOver.png b/examples/quickwings/assets/tappybird/PNG/UI/textGameOver.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/textGameOver.png rename to examples/quickwings/assets/tappybird/PNG/UI/textGameOver.png diff --git a/examples/tappyplane/assets/PNG/UI/textGetReady.png b/examples/quickwings/assets/tappybird/PNG/UI/textGetReady.png similarity index 100% rename from examples/tappyplane/assets/PNG/UI/textGetReady.png rename to examples/quickwings/assets/tappybird/PNG/UI/textGetReady.png diff --git a/examples/tappyplane/assets/PNG/background.png b/examples/quickwings/assets/tappybird/PNG/background.png similarity index 100% rename from examples/tappyplane/assets/PNG/background.png rename to examples/quickwings/assets/tappybird/PNG/background.png diff --git a/examples/tappyplane/assets/PNG/groundDirt.png b/examples/quickwings/assets/tappybird/PNG/groundDirt.png similarity index 100% rename from examples/tappyplane/assets/PNG/groundDirt.png rename to examples/quickwings/assets/tappybird/PNG/groundDirt.png diff --git a/examples/tappyplane/assets/PNG/groundGrass.png b/examples/quickwings/assets/tappybird/PNG/groundGrass.png similarity index 100% rename from examples/tappyplane/assets/PNG/groundGrass.png rename to examples/quickwings/assets/tappybird/PNG/groundGrass.png diff --git a/examples/tappyplane/assets/PNG/groundIce.png b/examples/quickwings/assets/tappybird/PNG/groundIce.png similarity index 100% rename from examples/tappyplane/assets/PNG/groundIce.png rename to examples/quickwings/assets/tappybird/PNG/groundIce.png diff --git a/examples/tappyplane/assets/PNG/groundRock.png b/examples/quickwings/assets/tappybird/PNG/groundRock.png similarity index 100% rename from examples/tappyplane/assets/PNG/groundRock.png rename to examples/quickwings/assets/tappybird/PNG/groundRock.png diff --git a/examples/tappyplane/assets/PNG/groundSnow.png b/examples/quickwings/assets/tappybird/PNG/groundSnow.png similarity index 100% rename from examples/tappyplane/assets/PNG/groundSnow.png rename to examples/quickwings/assets/tappybird/PNG/groundSnow.png diff --git a/examples/tappyplane/assets/PNG/puffLarge.png b/examples/quickwings/assets/tappybird/PNG/puffLarge.png similarity index 100% rename from examples/tappyplane/assets/PNG/puffLarge.png rename to examples/quickwings/assets/tappybird/PNG/puffLarge.png diff --git a/examples/tappyplane/assets/PNG/puffSmall.png b/examples/quickwings/assets/tappybird/PNG/puffSmall.png similarity index 100% rename from examples/tappyplane/assets/PNG/puffSmall.png rename to examples/quickwings/assets/tappybird/PNG/puffSmall.png diff --git a/examples/tappyplane/assets/PNG/rock.png b/examples/quickwings/assets/tappybird/PNG/rock.png similarity index 100% rename from examples/tappyplane/assets/PNG/rock.png rename to examples/quickwings/assets/tappybird/PNG/rock.png diff --git a/examples/tappyplane/assets/PNG/rockDown.png b/examples/quickwings/assets/tappybird/PNG/rockDown.png similarity index 100% rename from examples/tappyplane/assets/PNG/rockDown.png rename to examples/quickwings/assets/tappybird/PNG/rockDown.png diff --git a/examples/tappyplane/assets/PNG/rockGrass.png b/examples/quickwings/assets/tappybird/PNG/rockGrass.png similarity index 100% rename from examples/tappyplane/assets/PNG/rockGrass.png rename to examples/quickwings/assets/tappybird/PNG/rockGrass.png diff --git a/examples/tappyplane/assets/PNG/rockGrassDown.png b/examples/quickwings/assets/tappybird/PNG/rockGrassDown.png similarity index 100% rename from examples/tappyplane/assets/PNG/rockGrassDown.png rename to examples/quickwings/assets/tappybird/PNG/rockGrassDown.png diff --git a/examples/tappyplane/assets/PNG/rockIce.png b/examples/quickwings/assets/tappybird/PNG/rockIce.png similarity index 100% rename from examples/tappyplane/assets/PNG/rockIce.png rename to examples/quickwings/assets/tappybird/PNG/rockIce.png diff --git a/examples/tappyplane/assets/PNG/rockIceDown.png b/examples/quickwings/assets/tappybird/PNG/rockIceDown.png similarity index 100% rename from examples/tappyplane/assets/PNG/rockIceDown.png rename to examples/quickwings/assets/tappybird/PNG/rockIceDown.png diff --git a/examples/tappyplane/assets/PNG/rockSnow.png b/examples/quickwings/assets/tappybird/PNG/rockSnow.png similarity index 100% rename from examples/tappyplane/assets/PNG/rockSnow.png rename to examples/quickwings/assets/tappybird/PNG/rockSnow.png diff --git a/examples/tappyplane/assets/PNG/rockSnowDown.png b/examples/quickwings/assets/tappybird/PNG/rockSnowDown.png similarity index 100% rename from examples/tappyplane/assets/PNG/rockSnowDown.png rename to examples/quickwings/assets/tappybird/PNG/rockSnowDown.png diff --git a/examples/tappyplane/assets/PNG/starBronze.png b/examples/quickwings/assets/tappybird/PNG/starBronze.png similarity index 100% rename from examples/tappyplane/assets/PNG/starBronze.png rename to examples/quickwings/assets/tappybird/PNG/starBronze.png diff --git a/examples/tappyplane/assets/PNG/starGold.png b/examples/quickwings/assets/tappybird/PNG/starGold.png similarity index 100% rename from examples/tappyplane/assets/PNG/starGold.png rename to examples/quickwings/assets/tappybird/PNG/starGold.png diff --git a/examples/tappyplane/assets/PNG/starSilver.png b/examples/quickwings/assets/tappybird/PNG/starSilver.png similarity index 100% rename from examples/tappyplane/assets/PNG/starSilver.png rename to examples/quickwings/assets/tappybird/PNG/starSilver.png diff --git a/examples/tappyplane/assets/Spritesheet/planes.png b/examples/quickwings/assets/tappybird/Spritesheet/planes.png similarity index 100% rename from examples/tappyplane/assets/Spritesheet/planes.png rename to examples/quickwings/assets/tappybird/Spritesheet/planes.png diff --git a/examples/tappyplane/assets/Spritesheet/planes.xml b/examples/quickwings/assets/tappybird/Spritesheet/planes.xml similarity index 100% rename from examples/tappyplane/assets/Spritesheet/planes.xml rename to examples/quickwings/assets/tappybird/Spritesheet/planes.xml diff --git a/examples/tappyplane/assets/Spritesheet/sheet.png b/examples/quickwings/assets/tappybird/Spritesheet/sheet.png similarity index 100% rename from examples/tappyplane/assets/Spritesheet/sheet.png rename to examples/quickwings/assets/tappybird/Spritesheet/sheet.png diff --git a/examples/tappyplane/assets/Spritesheet/sheet.xml b/examples/quickwings/assets/tappybird/Spritesheet/sheet.xml similarity index 100% rename from examples/tappyplane/assets/Spritesheet/sheet.xml rename to examples/quickwings/assets/tappybird/Spritesheet/sheet.xml diff --git a/examples/tappyplane/assets/Vector/vector.svg b/examples/quickwings/assets/tappybird/Vector/vector.svg similarity index 100% rename from examples/tappyplane/assets/Vector/vector.svg rename to examples/quickwings/assets/tappybird/Vector/vector.svg diff --git a/examples/tappyplane/assets/Vector/vector.swf b/examples/quickwings/assets/tappybird/Vector/vector.swf similarity index 100% rename from examples/tappyplane/assets/Vector/vector.swf rename to examples/quickwings/assets/tappybird/Vector/vector.swf diff --git a/examples/tappyplane/assets/license.txt b/examples/quickwings/assets/tappybird/license.txt similarity index 100% rename from examples/tappyplane/assets/license.txt rename to examples/quickwings/assets/tappybird/license.txt diff --git a/examples/tappyplane/assets/preview.png b/examples/quickwings/assets/tappybird/preview.png similarity index 100% rename from examples/tappyplane/assets/preview.png rename to examples/quickwings/assets/tappybird/preview.png diff --git a/examples/tappyplane/assets/sample.png b/examples/quickwings/assets/tappybird/sample.png similarity index 99% rename from examples/tappyplane/assets/sample.png rename to examples/quickwings/assets/tappybird/sample.png index 5532803..efccaf4 100644 Binary files a/examples/tappyplane/assets/sample.png and b/examples/quickwings/assets/tappybird/sample.png differ diff --git a/examples/quickwings/assets/yellowbird-downflap.png b/examples/quickwings/assets/yellowbird-downflap.png new file mode 100644 index 0000000..e9e1c77 Binary files /dev/null and b/examples/quickwings/assets/yellowbird-downflap.png differ diff --git a/examples/quickwings/assets/yellowbird-midflap.png b/examples/quickwings/assets/yellowbird-midflap.png new file mode 100644 index 0000000..2ca3c2d Binary files /dev/null and b/examples/quickwings/assets/yellowbird-midflap.png differ diff --git a/examples/quickwings/assets/yellowbird-upflap.png b/examples/quickwings/assets/yellowbird-upflap.png new file mode 100644 index 0000000..2f693da Binary files /dev/null and b/examples/quickwings/assets/yellowbird-upflap.png differ diff --git a/examples/quickwings/quickwings.cpp b/examples/quickwings/quickwings.cpp new file mode 100644 index 0000000..dd51112 --- /dev/null +++ b/examples/quickwings/quickwings.cpp @@ -0,0 +1,546 @@ +/** + * paradiso - Paradigmen der Softwareentwicklung + * + * (c) Copyright 2023-2025 Hartmut Seichter and Contributors + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// TODO remove all hard coded 'magic' values! + +// TODO - remove global variables +const int frame_rate = 60; +bool game_over = false; +float risky_pos_x; +float risky_pos_max_x; +float risky_pos_bottom_y; +float risky_pos_top_y; +float risky_pos_bottom_max_y; +float risky_pos_top_max_y; + +struct Background { + paradiso::Sprite backgroundLeft; + paradiso::Sprite backgroundRight; + paradiso::Sprite grassLeft; + paradiso::Sprite grassRight; + + paradiso::Sprite* scrolling[2] = {&backgroundLeft, &backgroundRight}; + + paradiso::Renderer renderer{}; + + // TODO no constructors in rule of zero + Background() { + auto backgroundImage = + paradiso::BitmapIO::get().load("background-day.png"); + backgroundLeft = paradiso::Sprite{ + .bitmap = backgroundImage, + .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.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)}}; + grassRight = paradiso::Sprite{ + .bitmap = grassImage, + .pivot = {paradiso::Vector2::make(2.0f, -1.0f)}, + .scale = {paradiso::Vector2::make(1.0f, 0.33333f)}}; + } + + void draw(const paradiso::Shader& shader) { + for (auto sprite : scrolling) { + if (game_over == false) { + if (sprite->pivot.x() <= -2.0f) { + sprite->pivot.x() += 4.0f; + } + sprite->pivot.x() -= 0.002f; + } + shader.set_uniform("pivot", sprite->pivot); + shader.set_uniform("scale", sprite->scale); + shader.set_uniform("rotation", sprite->rotation); + renderer.draw(*sprite, shader); + } + } +}; + +struct Pipe { + paradiso::Sprite pipe_top{}; + paradiso::Sprite pipe_bottom{}; + + paradiso::Renderer renderer1{}; + paradiso::Renderer renderer2{}; + + bool paused = false; + + int pipe_spawn_rand_int = rand() % 80 + 15; + float pipe_spawn_rand = float(pipe_spawn_rand_int) / 100; + + bool pos_reset = false; + + // TODO no constructors in rule of zero + + Pipe() { + auto pipe_image = paradiso::BitmapIO::get().load("pipe-green.png"); + + pipe_top = paradiso::Sprite{ + .bitmap = pipe_image, + .pivot = {paradiso::Vector2::make(1.4f, + pipe_spawn_rand + 1.0f)}, + .scale = {paradiso::Vector2::make( + ((500.0f - (500.0f - 52.0f)) / 500.0f) * 2.25f, + ((700.0f - (700.0f - 320.0f)) / 700.0f) * 2.25f)}, + .rotation = 3.1415926f}; + pipe_bottom = paradiso::Sprite{ + .bitmap = pipe_image, + .pivot = {paradiso::Vector2::make(1.4f, + pipe_spawn_rand - 1.5f)}, + .scale = {paradiso::Vector2::make( + ((500.0f - (500.0f - 52.0f)) / 500.0f) * 2.25f, + ((700.0f - (700.0f - 320.0f)) / 700.0f) * 2.25f)}}; + + paused = true; + } + + void update() { + + // TODO improve state handling + + if (game_over == true) { + paused = true; + } + + if (paused == true) { + return; + } else { + pipe_spawn_rand_int = rand() % 80 + 15; + pipe_spawn_rand = float(pipe_spawn_rand_int) / 100; + + pipe_top.pivot.x() -= 0.02f; + pipe_bottom.pivot.x() -= 0.02f; + + risky_pos_x = pipe_top.pivot.x(); + risky_pos_max_x = pipe_top.pivot.x() + + ((500.0f - (500.0f - 52.0f)) / 500.0f) * 2.25f; + + risky_pos_top_y = pipe_top.pivot.y(); + risky_pos_top_max_y = pipe_top.pivot.y() + 10.0f; + + risky_pos_bottom_y = pipe_bottom.pivot.y(); + risky_pos_bottom_max_y = pipe_bottom.pivot.y() - 10.0f; + + if (pipe_top.pivot.x() <= -1.4f || pipe_bottom.pivot.x() <= -1.4f) { + pos_reset = true; + + if (pos_reset == true) { + pipe_top.pivot.y() = pipe_spawn_rand + 1.0f; + pipe_bottom.pivot.y() = pipe_spawn_rand - 1.5; + + pos_reset = false; + } + + pipe_top.pivot.x() = 1.4f; + pipe_bottom.pivot.x() = 1.4f; + } + } + } + + void draw(const paradiso::Shader& shader) { + shader.set_uniform("pivot", pipe_bottom.pivot); + shader.set_uniform("scale", pipe_bottom.scale); + renderer1.draw(pipe_bottom, shader); + + shader.set_uniform("pivot", pipe_top.pivot); + shader.set_uniform("scale", pipe_top.scale); + shader.set_uniform("rotation", pipe_top.rotation); + renderer1.draw(pipe_top, shader); + } +}; + +struct Grass { + paradiso::Sprite grassLeft; + paradiso::Sprite grassRight; + paradiso::Sprite* scrolling[2] = {&grassLeft, &grassRight}; + + paradiso::Renderer renderer1{}; + paradiso::Renderer renderer2{}; + + // TODO no constructors in rule of zero + Grass() { + 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( + ((500.0f - (500.0f - 504.0f)) / 500.0f) * 2.25f, + ((700.0f - (700.0f - 112.0f)) / 700.0f) * 2.25f)}}; + grassRight = paradiso::Sprite{ + .bitmap = grassImage, + .pivot = {paradiso::Vector2::make(1.002f, -0.9f)}, + .scale = {paradiso::Vector2::make( + ((500.0f - (500.0f - 504.0f)) / 500.0f) * 2.25f, + ((700.0f - (700.0f - 112.0f)) / 700.0f) * 2.25f)}}; + } + + void draw(const paradiso::Shader& shader) { + if (game_over == false) { + grassLeft.pivot.x() -= 0.02f; + grassRight.pivot.x() -= 0.02f; + + if (grassRight.pivot.x() <= 0.0f) { + grassLeft.pivot.x() = 1.002f; + } + if (grassRight.pivot.x() <= -1.002f) { + grassRight.pivot.x() = 1.002f; + } + } + + shader.set_uniform("pivot", grassLeft.pivot); + shader.set_uniform("scale", grassLeft.scale); + shader.set_uniform("rotation", grassLeft.rotation); + + shader.set_uniform("pivot", grassRight.pivot); + shader.set_uniform("scale", grassRight.scale); + shader.set_uniform("rotation", grassRight.rotation); + + renderer1.draw(grassLeft, shader); + renderer2.draw(grassRight, shader); + } +}; + +struct QuickWings { + paradiso::Renderer renderer1{}; + paradiso::Renderer renderer2{}; + paradiso::Renderer renderer3{}; + + std::array birds; + unsigned int flap = 0; + unsigned int flapSpeed = 15; // How many ticks per flap + unsigned int flapCounter = 0; // How many ticks since last flap + + float velocity = 0.0f; + const float max_velocity = 0.02f; + + const float gravity = -0.002f; + const float move_up_velocity = 0.02f; + + bool move_up = false; + bool paused = true; + + const float max_pos = 0.95f; + const float min_pos = -0.5f; + + float pos = 0.34f; + + float rotation = 0.0f; + + int collision_counter = 0; + + // TODO no constructors in rule of zero + QuickWings() { + 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)}}, + paradiso::Sprite{ + .bitmap = + paradiso::BitmapIO::get().load("yellowbird-midflap.png"), + .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)}}}; + } + + void draw(const paradiso::Shader& shader) { + // Update flap state + if (flapCounter < flapSpeed) { + flapCounter++; + } else { + flapCounter = 0; + flap = (flap + 1) % birds.size(); + } + + auto bird = birds[flap]; + bird.pivot.y() = pos; + bird.rotation = rotation; + shader.set_uniform("pivot", bird.pivot); + shader.set_uniform("scale", bird.scale); + shader.set_uniform("rotation", bird.rotation); + + switch (flap) { + case 0: + renderer1.draw(bird, shader); + break; + case 1: + renderer2.draw(bird, shader); + break; + case 2: + renderer3.draw(bird, shader); + break; + } + } + + void update() { + + if (game_over == true) { + paused = true; + } + + // Stop game + if (paused) { + return; + } else { + // Apply gravity + velocity += gravity; + + if (move_up) + velocity += move_up_velocity - gravity; + + // Cap velocity + if (velocity > max_velocity) + velocity = max_velocity; + if (velocity < -max_velocity) + velocity = -max_velocity; + + // Cap position + pos += velocity; + if (pos < min_pos) { + pos = min_pos; + velocity = 0.0f; + game_over = true; + } + if (pos > max_pos) { + pos = max_pos; + velocity = 0.0f; + game_over = true; + } + + // Update rotation + rotation = velocity * 10.0f; + } + + float final_risky_pos_top_y = risky_pos_top_y - 1.06f; + float final_risky_pos_bottom_y = risky_pos_bottom_y + 1.06f; + + if (risky_pos_x - 0.3f <= 0.0f && risky_pos_max_x >= 0.0f) { + if (pos >= final_risky_pos_top_y && pos <= risky_pos_top_max_y) { + game_over = true; + } + if (pos <= final_risky_pos_bottom_y && + pos >= risky_pos_bottom_max_y) { + if (collision_counter == 0) { + collision_counter++; + } else { + collision_counter = 2; + } + + if (collision_counter == 2) { + game_over = true; + } + } + } + } + + // keyboard handler + void on_keyboard(const paradiso::Window::KeyboardInputStack& input) { + if (input.size()) { + paused = false; + + if (paused == false) { + bool pressed_up = + input.top().key == ' ' || input.top().key == 'W'; + + if (input.top().action == 1 && pressed_up) { + move_up = true; + } else if (input.top().action == 0 && pressed_up) { + move_up = false; + } + } else { + return; + } + } + } +}; + +struct Message { + paradiso::Sprite messageSprite; + paradiso::Renderer renderer{}; + bool start = false; + float pos = 100.0f; + + 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); + } + + void update() { + if (start == true) { + messageSprite.pivot.y() = pos; + } + } + + void on_keyboard(const paradiso::Window::KeyboardInputStack& input) { + if (input.size()) { + start = true; + } + } +}; + +struct GameOverMessage { + paradiso::Sprite messageSprite; + paradiso::Renderer renderer{}; + + GameOverMessage() { + auto messageImage = paradiso::BitmapIO::get().load("gameover.png"); + messageSprite = paradiso::Sprite{ + .bitmap = messageImage, + .pivot = {paradiso::Vector2::make(0.0f, 0.4f)}, + .scale = {paradiso::Vector2::make( + ((500.0f - (500.0f - 192.0f)) / 500.0f) * 2.25f, + ((700.0f - (700.0f - 42.0f)) / 700.0f) * 2.25f)}}; + }; + + 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 { + std::srand(std::time(nullptr)); + + // Ausgabefenster ... sieht aus als wäre es auf dem Stack + auto window = paradiso::Window(); + + auto size = paradiso::Size{.width = 500, .height = 700}; + + /* + window.set_resizecallback([](auto& w) -> void { + w.set_size(paradiso::Size{.width = 405, .height = 720}); + }); + +*/ + window + .set_size(size) // ... Grösse + .set_position(paradiso::Point{.x = 1920 / 2 - 500 / 2, + .y = 1080 / 2 - 700 / 2}) // ... Position + .set_title("PardiSO.FlappyBird") // ... Titel + .set_visible(true); // ... und jetzt anzeigen! + + // der Fenster Kontext + auto ctx = paradiso::Context{}; + + // ein Shader (Schattierungsprogramm) + auto shader = paradiso::Shader{}; + + // wir nutzen einen vorgefertigten shader + shader.load_preset(paradiso::Shader::Preset::Sprite); + + // ein viewport stellt die Sicht der Kamera dar, d.h. bei quadratischen + // Pixeln sollte hier auch eine dementsprechende Grösse eingestellt + // werden + ctx.set_viewport(paradiso::Rectangle{ + .position = paradiso::Point{.x = 0, .y = 0}, .size = size}); + + // nothing beats a classic look + ctx.set_clearcolor(paradiso::RGBA::from_rgb(0x00, 0x00, 0x00)); + + // Asset loader bekommt den Pfad + + paradiso::BitmapIO::get().set_path("assets"); + + // Load + auto background = Background{}; + auto grass = Grass{}; + auto quickwingsapp = QuickWings{}; + auto pipe = Pipe{}; + auto message = Message{}; + auto gameover = GameOverMessage{}; + + // timer + + // das update führt den hier mitgegebnen Ausdruck innerhalb der internen + // Updates des Fensters auf. Es wird hier auch explizit ein bool gefordert + // damit das update auch zu jederzeit unterbrochen werden kann + while (window.update([&](paradiso::Window& w) -> bool { + ctx.set_viewport(paradiso::Rectangle{ + .position = paradiso::Point{.x = 0, .y = 0}, .size = size}); + + ctx.clear(); + auto t1 = std::chrono::high_resolution_clock::now(); + + // Keyboard and state change + update + if (quickwingsapp.paused == false) { + pipe.paused = false; + } + + pipe.update(); + + quickwingsapp.on_keyboard(w.keyboard_input()); + quickwingsapp.update(); + + message.on_keyboard(w.keyboard_input()); + message.update(); + + // Draw + background.draw(shader); + pipe.draw(shader); + grass.draw(shader); + message.draw(shader); + + if (game_over == true) { + gameover.draw(shader); + } + + quickwingsapp.draw(shader); + + // wait for frame rate + auto t2 = std::chrono::high_resolution_clock::now(); + auto duration = + std::chrono::duration_cast(t2 - t1); + auto wait = std::chrono::microseconds(1000000 / frame_rate) - duration; + std::this_thread::sleep_for(wait); + + // Quit + return !(w.keyboard_input().size() && + w.keyboard_input().top().key == 'Q'); + })) { + }; + + return 0; +} diff --git a/examples/tappyplane/CMakeLists.txt b/examples/tappyplane/CMakeLists.txt deleted file mode 100644 index 7d4f40a..0000000 --- a/examples/tappyplane/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -set(tappyplane_srcs tappyplane.cpp) -set(tappyplane_assets - assets/PNG/background.png - ) - -set_source_files_properties(${tappyplane_assets} PROPERTIES HEADER_FILE_ONLY TRUE) - -add_executable(tappyplane ${tappyplane_srcs} ${tappyplane_assets}) - -target_link_libraries(tappyplane paradiso_core) - -# -# copy files to bin/../assets folder -# -add_custom_command(TARGET tappyplane POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory - ${CMAKE_CURRENT_SOURCE_DIR}/assets/ - $/assets) diff --git a/examples/tappyplane/tappyplane.cpp b/examples/tappyplane/tappyplane.cpp deleted file mode 100644 index 95bab15..0000000 --- a/examples/tappyplane/tappyplane.cpp +++ /dev/null @@ -1,801 +0,0 @@ -/** - * paradiso - Paradigmen der Softwareentwicklung - * - * (c) Copyright 2023-2025 Hartmut Seichter and Contributors - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -namespace TappyPlane { - -using SpriteName = std::tuple; -using SpriteMap = std::unordered_map; - -static const unsigned int FRAME_RATE = 60; - -static const unsigned int WINDOW_WIDTH = 800; -static const unsigned int WINDOW_HEIGHT = 480; -static const unsigned int WINDOW_SCALE = 2; - -static const char ACTION_KEY = ' '; - -static constexpr float SCROLLING_SPEED_INC_FACTOR = 1.0002f; - -// x,y+h --- x+w,y+h -// | | -// | | -// | | -// x,y ----- x+w,y -struct AABB { - paradiso::Vector2 position{}; - paradiso::Vector2 size{}; - - bool is_colliding_with(const AABB& other) { - return position.x() < other.position.x() + other.size.x() && - position.x() + size.x() > other.position.x() && - position.y() < other.position.y() + other.size.y() && - position.y() + size.y() > other.position.y(); - } -}; - -struct Background { - static constexpr float INIT_SCROLLING_SPEED = 0.003f; - - float scrolling_speed = INIT_SCROLLING_SPEED; - - std::array sprites; - paradiso::Renderer renderer{}; - - void init(SpriteMap& sprite_map) { - sprites = {paradiso::Sprite{ - .bitmap = sprite_map["background"], - .pivot = {paradiso::Vector2::make(0.0f, 0.0f)}, - .scale = {paradiso::Vector2::make(1.0f, 1.0f)}}, - paradiso::Sprite{ - .bitmap = sprite_map["background"], - .pivot = {paradiso::Vector2::make(2.0f, 0.0f)}, - .scale = {paradiso::Vector2::make(1.0f, 1.0f)}}}; - } - - void reset() { - scrolling_speed = INIT_SCROLLING_SPEED; - - sprites[0].pivot.x() = 0.0f; - sprites[1].pivot.x() = 2.0f; - } - - void update() { - scrolling_speed *= SCROLLING_SPEED_INC_FACTOR; - - for (auto& sprite : sprites) { - sprite.pivot.x() -= scrolling_speed; - if (sprite.pivot.x() <= -2.0f) { - sprite.pivot.x() += 4.0f; - } - } - } - - void draw(const paradiso::Shader& shader) { - for (const auto& sprite : sprites) { - shader.set_uniform("pivot", sprite.pivot); - shader.set_uniform("scale", sprite.scale); - shader.set_uniform("rotation", sprite.rotation); - renderer.draw(sprite, shader); - } - } -}; - -struct Ground { - static constexpr float INIT_SCROLLING_SPEED = 0.009f; - - float scrolling_speed = INIT_SCROLLING_SPEED; - - std::array sprites; - paradiso::Renderer renderer{}; - - AABB aabb{}; - - void init(SpriteMap& sprite_map) { - // The image's height is 71 px. - float scale_y = 71.0f / WINDOW_HEIGHT; - - float pivot_y = -1.0f + scale_y; - - sprites = { - paradiso::Sprite{ - .bitmap = sprite_map["ground"], - .pivot = {paradiso::Vector2::make(0.0f, pivot_y)}, - .scale = {paradiso::Vector2::make(1.0f, scale_y)}}, - paradiso::Sprite{ - .bitmap = sprite_map["ground"], - .pivot = {paradiso::Vector2::make(2.0f, pivot_y)}, - .scale = {paradiso::Vector2::make(1.0f, scale_y)}}}; - - // We'll make the height half the height of the texture. - // (If you want 1:1 size, you need to double the scale of the sprite.) - aabb = AABB{.position = {paradiso::Vector2::make(-1.0f, -1.0f)}, - .size = {paradiso::Vector2::make(2.0f, scale_y)}}; - } - - void reset() { - scrolling_speed = INIT_SCROLLING_SPEED; - - sprites[0].pivot.x() = 0.0f; - sprites[1].pivot.x() = 2.0f; - } - - void update() { - scrolling_speed *= SCROLLING_SPEED_INC_FACTOR; - - for (auto& sprite : sprites) { - sprite.pivot.x() -= scrolling_speed; - if (sprite.pivot.x() <= -2.0f) { - sprite.pivot.x() += 4.0f; - } - } - } - - void draw(const paradiso::Shader& shader) { - for (const auto& sprite : sprites) { - shader.set_uniform("pivot", sprite.pivot); - shader.set_uniform("scale", sprite.scale); - shader.set_uniform("rotation", sprite.rotation); - renderer.draw(sprite, shader); - } - } -}; - -struct Rocks { - static constexpr float INIT_SCROLLING_SPEED = 0.006f; - static constexpr float GAP_SIZE = 1.5f; - - // The image's size is 108x239 px. - static constexpr float SCALE_X = 108.0f / WINDOW_WIDTH; - static constexpr float SCALE_Y = 239.0f / WINDOW_HEIGHT; - - static constexpr paradiso::Vector2 SCALE{ - paradiso::Vector2::make(SCALE_X, SCALE_Y)}; - - float scrolling_speed = INIT_SCROLLING_SPEED; - - paradiso::Sprite top_sprite; - paradiso::Sprite bottom_sprite; - - paradiso::Renderer top_renderer{}; - paradiso::Renderer bottom_renderer{}; - - AABB top_aabb; - AABB bottom_aabb; - - float init_pivot_x = 0.0f; - - auto get_random_top_position_y() -> float { - return 1.0f - SCALE_Y + (std::rand() % 50) / 100.0f + 0.01f; - } - - void init_aabbs() { - // We'll make the width a quarter the width of the texture. - // (If you want 1:1 size, you need to double the scale of the sprite.) - auto size = paradiso::Vector2{ - paradiso::Vector2::make(SCALE_X / 2, SCALE_Y * 2)}; - - auto top_position = - paradiso::Vector2{paradiso::Vector2::make( - top_sprite.pivot.x() - size.x() / 2, - top_sprite.pivot.y() - size.y() / 2)}; - - auto bottom_position = - paradiso::Vector2{paradiso::Vector2::make( - bottom_sprite.pivot.x() - size.x() / 2, - bottom_sprite.pivot.y() - size.y() / 2)}; - - top_aabb = AABB{top_position, size}; - bottom_aabb = AABB{bottom_position, size}; - } - - void init(SpriteMap& sprite_map, float pivot_x) { - init_pivot_x = pivot_x; - - float top_position_y = get_random_top_position_y(); - float bottom_position_y = top_position_y - GAP_SIZE; - - top_sprite = paradiso::Sprite{.bitmap = sprite_map["rocks.top"], - .pivot = {paradiso::Vector2::make( - init_pivot_x, top_position_y)}, - .scale = SCALE}; - - bottom_sprite = - paradiso::Sprite{.bitmap = sprite_map["rocks.bottom"], - .pivot = {paradiso::Vector2::make( - init_pivot_x, bottom_position_y)}, - .scale = SCALE}; - - init_aabbs(); - } - - void reset() { - scrolling_speed = INIT_SCROLLING_SPEED; - - float top_position_y = get_random_top_position_y(); - float bottom_position_y = top_position_y - GAP_SIZE; - - top_sprite.pivot = paradiso::Vector2{ - paradiso::Vector2::make(init_pivot_x, top_position_y)}; - bottom_sprite.pivot = paradiso::Vector2{ - paradiso::Vector2::make(init_pivot_x, bottom_position_y)}; - - init_aabbs(); - } - - void jump_back() { - float top_position_y = get_random_top_position_y(); - float bottom_position_y = top_position_y - GAP_SIZE; - - top_sprite.pivot = paradiso::Vector2{ - paradiso::Vector2::make(1.2f, top_position_y)}; - bottom_sprite.pivot = paradiso::Vector2{ - paradiso::Vector2::make(1.2f, bottom_position_y)}; - - init_aabbs(); - } - - void update() { - scrolling_speed *= SCROLLING_SPEED_INC_FACTOR; - - top_sprite.pivot.x() -= scrolling_speed; - bottom_sprite.pivot.x() -= scrolling_speed; - - // +----------+ - // | | - // | | - // | # #-------- the x it is. - // | \ | - // | \ | - // +-----\----+ - // \ - // *------ the x we need. - - // @Efficiency: We could just scroll the AABBs with the sprites. - top_aabb.position.x() = top_sprite.pivot.x() - top_aabb.size.x() / 2; - bottom_aabb.position.x() = - bottom_sprite.pivot.x() - bottom_aabb.size.x() / 2; - - if (top_sprite.pivot.x() <= -1.2f) { - // Reset. - jump_back(); - return; - } - } - - void draw(const paradiso::Shader& shader) { - shader.set_uniform("pivot", top_sprite.pivot); - shader.set_uniform("scale", top_sprite.scale); - shader.set_uniform("rotation", top_sprite.rotation); - top_renderer.draw(top_sprite, shader); - - shader.set_uniform("pivot", bottom_sprite.pivot); - shader.set_uniform("scale", bottom_sprite.scale); - shader.set_uniform("rotation", bottom_sprite.rotation); - bottom_renderer.draw(bottom_sprite, shader); - } -}; - -struct Plane { - static constexpr float GRAVITY = -0.001f; - static constexpr float JUMP_VELOCITY = 0.03f; - static constexpr float MAX_VELOCITY = 0.03f; - - static constexpr float INIT_POSITION_Y = 0.0f; - static constexpr float INIT_VELOCITY_Y = 0.0f; - static constexpr float INIT_ROTATION = 0.0f; - - static constexpr paradiso::Vector2 INIT_PIVOT{ - paradiso::Vector2::make(0.0f, INIT_POSITION_Y)}; - - static const unsigned int ANIM_INTERVAL = 10; - - // The image's size is 88x73 px. - static constexpr float SCALE_X = 88.0f / WINDOW_WIDTH; - static constexpr float SCALE_Y = 73.0f / WINDOW_HEIGHT; - - static constexpr paradiso::Vector2 SCALE{ - paradiso::Vector2::make(SCALE_X, SCALE_Y)}; - - // Animation sprites - std::array sprites; - std::array renderers; - - unsigned int anim_counter = 0; - - // The direction where 'current_sprite' should go because the animation - // shouldn't loop. - int anim_direction = 1; - - unsigned int current_sprite = 0; - - float position_y = INIT_POSITION_Y; - float velocity_y = INIT_VELOCITY_Y; - float rotation = INIT_ROTATION; - - AABB aabb; - - void init_aabb() { - // We'll make the size half the size of the texture. - // (If you want 1:1 size, you need to double the scale of the sprite.) - // We could use 'SCALE' here, but we'll keep this for clarity. - // (Although, now we no longer need 'SCALE' as a constant in this entire - // struct.) - auto size = paradiso::Vector2{ - paradiso::Vector2::make(SCALE_X, SCALE_Y)}; - - // Center it. - auto position = paradiso::Vector2{paradiso::Vector2::make( - INIT_PIVOT.x() - size.x() / 2, INIT_PIVOT.y() - size.y() / 2)}; - - aabb = AABB{position, size}; - } - - void init(SpriteMap& sprite_map) { - sprites = {paradiso::Sprite{.bitmap = sprite_map["plane.1"], - .pivot = INIT_PIVOT, - .scale = SCALE}, - paradiso::Sprite{.bitmap = sprite_map["plane.2"], - .pivot = INIT_PIVOT, - .scale = SCALE}, - paradiso::Sprite{.bitmap = sprite_map["plane.3"], - .pivot = INIT_PIVOT, - .scale = SCALE}}; - - init_aabb(); - } - - void reset() { - for (auto& sprite : sprites) { - sprite.pivot = INIT_PIVOT; - } - - position_y = INIT_POSITION_Y; - velocity_y = INIT_VELOCITY_Y; - rotation = INIT_ROTATION; - - init_aabb(); - } - - void update_animation() { - if (anim_counter < ANIM_INTERVAL) { - anim_counter++; - } else { - anim_counter = 0; - - current_sprite += anim_direction; - if (current_sprite >= sprites.size() - 1) { - anim_direction = -1; - } else if (current_sprite == 0) { - anim_direction = 1; - } - } - } - - void update(const paradiso::Window::KeyboardInputStack& input) { - update_animation(); - - if (input.size() && input.top().key == ACTION_KEY && - input.top().action == 1) { - velocity_y += JUMP_VELOCITY; - } else { - velocity_y += GRAVITY; - } - - velocity_y = std::clamp(velocity_y, -MAX_VELOCITY, MAX_VELOCITY); - position_y += velocity_y; - - // +-------------+ - // | | - // | | - // | | - // | #--------- the y it is. - // | | - // | # | - // | \ | - // +--------\----+ - // \ - // *--- the y we need. - - // @Efficiency: We could just add the velocity to the AABB's y position. - aabb.position.y() = position_y - aabb.size.y() / 2; - - rotation = velocity_y * 500.0f; - } - - void draw(const paradiso::Shader& shader) { - auto sprite = sprites[current_sprite]; - sprite.rotation = rotation * (std::numbers::pi / 180.0f); - sprite.pivot.y() = position_y; - - shader.set_uniform("pivot", sprite.pivot); - shader.set_uniform("scale", sprite.scale); - shader.set_uniform("rotation", sprite.rotation); - renderers[current_sprite].draw(sprite, shader); - } -}; - -struct StartUI { - static const unsigned int TAP_ANIM_INTERVAL = 40; - - // textGetReady.png, tapLeft.png, tapRight.png - std::array base_sprites; - std::array base_renderers; - - // tap.png, tapTick.png - std::array tap_sprites; - std::array tap_renderers; - - unsigned int tap_anim_counter = 0; - unsigned int current_tap_sprite = 0; - - void init(SpriteMap& sprite_map) { - base_sprites = { - paradiso::Sprite{ - .bitmap = sprite_map["start_ui.text"], - .pivot = {paradiso::Vector2::make(0.0f, 0.5f)}, - // The image's size is 400x73 px. - .scale = {paradiso::Vector2::make( - 400.0f / WINDOW_WIDTH, 73.0f / WINDOW_HEIGHT)}}, - paradiso::Sprite{ - .bitmap = sprite_map["tap_sign.left"], - .pivot = {paradiso::Vector2::make(-0.5f, 0.0f)}, - // The image's size is 85x42 px. - .scale = {paradiso::Vector2::make( - 85.0f / WINDOW_WIDTH, 42.0f / WINDOW_HEIGHT)}}, - paradiso::Sprite{ - .bitmap = sprite_map["tap_sign.right"], - .pivot = {paradiso::Vector2::make(0.5f, 0.0f)}, - // The image's size is 85x42 px. - .scale = {paradiso::Vector2::make( - 85.0f / WINDOW_WIDTH, 42.0f / WINDOW_HEIGHT)}}, - }; - - tap_sprites = { - paradiso::Sprite{ - .bitmap = sprite_map["tap.normal"], - .pivot = {paradiso::Vector2::make(0.0f, -0.5f)}, - // The image's size is 59x59 px. - .scale = {paradiso::Vector2::make( - 59.0f / WINDOW_WIDTH, 59.0f / WINDOW_HEIGHT)}}, - paradiso::Sprite{ - .bitmap = sprite_map["tap.tick"], - .pivot = {paradiso::Vector2::make(0.0f, -0.5f)}, - // The image's size is 59x59 px. - .scale = {paradiso::Vector2::make( - 59.0f / WINDOW_WIDTH, 59.0f / WINDOW_HEIGHT)}}, - }; - } - - void update() { - if (tap_anim_counter < TAP_ANIM_INTERVAL) { - tap_anim_counter++; - } else { - tap_anim_counter = 0; - current_tap_sprite = (current_tap_sprite + 1) % tap_sprites.size(); - } - } - - void draw(const paradiso::Shader& shader) { - for (unsigned int i = 0; i < base_sprites.size(); i++) { - auto sprite = base_sprites[i]; - auto& renderer = base_renderers[i]; - - shader.set_uniform("pivot", sprite.pivot); - shader.set_uniform("scale", sprite.scale); - shader.set_uniform("rotation", sprite.rotation); - renderer.draw(sprite, shader); - } - - auto tap_sprite = tap_sprites[current_tap_sprite]; - auto& tap_renderer = tap_renderers[current_tap_sprite]; - - shader.set_uniform("pivot", tap_sprite.pivot); - shader.set_uniform("scale", tap_sprite.scale); - shader.set_uniform("rotation", tap_sprite.rotation); - tap_renderer.draw(tap_sprite, shader); - } -}; - -struct GameOverUI { - paradiso::Sprite sprite; - paradiso::Renderer renderer{}; - - void init(SpriteMap& sprite_map) { - // The image's size is 412x78 px. - float scale_x = 412.0f / WINDOW_WIDTH; - float scale_y = 78.0f / WINDOW_HEIGHT; - - sprite = {.bitmap = sprite_map["game_over_ui.text"], - .pivot = {paradiso::Vector2::make(0.0f, 0.0f)}, - .scale = {paradiso::Vector2::make(scale_x, scale_y)}}; - } - - void update() { - // @ToDo: Make the sprite slide down. - } - - void draw(const paradiso::Shader& shader) { - shader.set_uniform("pivot", sprite.pivot); - shader.set_uniform("scale", sprite.scale); - shader.set_uniform("rotation", sprite.rotation); - renderer.draw(sprite, shader); - } -}; - -enum class GameState { Start, Playing, GameOver }; - -struct App { - SpriteMap sprites; - - enum class WorldType { Dirt, Grass, Ice, Rock, Snow }; - enum class PlaneType { Blue, Green, Red, Yellow }; - - static auto create(WorldType world_type = WorldType::Grass, - PlaneType plane_type = PlaneType::Red) -> App { - auto app = App{}; - - paradiso::BitmapIO::get().set_path( - paradiso::get_executable_path().parent_path().string() + "/assets"); - - // Yes, I'm lazy, how did you know? - const char* ground_filename = nullptr; - const char* rocks_top_filename = nullptr; - const char* rocks_bottom_filename = nullptr; - switch (world_type) { - case WorldType::Dirt: - ground_filename = "PNG/groundDirt.png"; - rocks_top_filename = "PNG/rockDown.png"; - rocks_bottom_filename = "PNG/rock.png"; - break; - case WorldType::Ice: - ground_filename = "PNG/groundIce.png"; - rocks_top_filename = "PNG/rockIceDown.png"; - rocks_bottom_filename = "PNG/rockIce.png"; - break; - case WorldType::Rock: - ground_filename = "PNG/groundRock.png"; - rocks_top_filename = "PNG/rockDown.png"; - rocks_bottom_filename = "PNG/rock.png"; - break; - case WorldType::Snow: - ground_filename = "PNG/groundSnow.png"; - rocks_top_filename = "PNG/rockSnowDown.png"; - rocks_bottom_filename = "PNG/rockSnow.png"; - break; - default: - case WorldType::Grass: - ground_filename = "PNG/groundGrass.png"; - rocks_top_filename = "PNG/rockGrassDown.png"; - rocks_bottom_filename = "PNG/rockGrass.png"; - break; - } - - // Yes, I'm lazy, how did you know? - const char* plane_1_filename = nullptr; - const char* plane_2_filename = nullptr; - const char* plane_3_filename = nullptr; - switch (plane_type) { - case PlaneType::Blue: - plane_1_filename = "PNG/Planes/planeBlue1.png"; - plane_2_filename = "PNG/Planes/planeBlue2.png"; - plane_3_filename = "PNG/Planes/planeBlue3.png"; - break; - case PlaneType::Green: - plane_1_filename = "PNG/Planes/planeGreen1.png"; - plane_2_filename = "PNG/Planes/planeGreen2.png"; - plane_3_filename = "PNG/Planes/planeGreen3.png"; - break; - case PlaneType::Yellow: - plane_1_filename = "PNG/Planes/planeYellow1.png"; - plane_2_filename = "PNG/Planes/planeYellow2.png"; - plane_3_filename = "PNG/Planes/planeYellow3.png"; - break; - default: - case PlaneType::Red: - plane_1_filename = "PNG/Planes/planeRed1.png"; - plane_2_filename = "PNG/Planes/planeRed2.png"; - plane_3_filename = "PNG/Planes/planeRed3.png"; - break; - } - - auto assets = std::array{ - SpriteName{"background", "PNG/background.png"}, - SpriteName{"ground", ground_filename}, - SpriteName{"rocks.top", rocks_top_filename}, - SpriteName{"rocks.bottom", rocks_bottom_filename}, - SpriteName{"plane.1", plane_1_filename}, - SpriteName{"plane.2", plane_2_filename}, - SpriteName{"plane.3", plane_3_filename}, - SpriteName{"tap_sign.left", "PNG/UI/tapRight.png"}, - SpriteName{"tap_sign.right", "PNG/UI/tapLeft.png"}, - SpriteName{"tap.normal", "PNG/UI/tap.png"}, - SpriteName{"tap.tick", "PNG/UI/tapTick.png"}, - SpriteName{"start_ui.text", "PNG/UI/textGetReady.png"}, - SpriteName{"game_over_ui.text", "PNG/UI/textGameOver.png"}, - }; - - for (const auto& [name, filename] : assets) { - std::print("{} : {} -> ", name, filename); - - auto bitmap = paradiso::BitmapIO::get().load(filename); - app.sprites[name] = bitmap; - } - - return app; - } - - void run() { - auto canvas_size = - paradiso::Size{.width = WINDOW_WIDTH * WINDOW_SCALE, - .height = WINDOW_HEIGHT * WINDOW_SCALE}; - - // Unser Fenster, auf das wir rendern. - auto window = paradiso::Window(); - window - .set_size(canvas_size) // ... Größe - .set_position(paradiso::Point{.x = 200, .y = 200}) // ... Position - .set_title("ParadiSO.TappyPlane") // ... Titel - .set_visible(true); // ... und jetzt anzeigen! - - // Der Fenster Context. - auto context = paradiso::Context{}; - - // Ein Shader (Schattierungsprogramm). - auto shader = paradiso::Shader{}; - - // Wir nutzen einen vorgefertigten Shader, der speziell für Sprites ist. - shader.load_preset(paradiso::Shader::Preset::Sprite); - - // Ein Viewport stellt die Sicht der Kamera dar, d.h. bei quadratischen - // Pixeln sollte hier auch eine dementsprechende Größe eingestellt - // werden. - context.set_viewport(paradiso::Rectangle{ - .position = paradiso::Point{.x = 0, .y = 0}, .size = canvas_size}); - - // Conflower blue - context.set_clearcolor(paradiso::RGBA::from_rgb(0x64, 0x95, 0xED)); - - // Wir initialisieren unsere Sachen. - auto game_state = GameState::Start; - - auto background = Background{}; - auto ground = Ground{}; - auto rocks1 = Rocks{}; - auto rocks2 = Rocks{}; - auto plane = Plane{}; - auto start_ui = StartUI{}; - auto game_over_ui = GameOverUI{}; - - background.init(sprites); - ground.init(sprites); - rocks1.init(sprites, 1.2f); - rocks2.init(sprites, 2.4f); - plane.init(sprites); - start_ui.init(sprites); - game_over_ui.init(sprites); - - auto top_aabb = - AABB{.position = {paradiso::Vector2::make(-1.0f, 1.0f)}, - .size = {paradiso::Vector2::make(2.0f, 0.5f)}}; - - while (window.update([&](paradiso::Window& window) -> bool { - auto t1 = std::chrono::high_resolution_clock::now(); - - if (window.keyboard_input().size() && - window.keyboard_input().top().key == 'Q') { - // Update-Loop beenden. - return false; - } - - if (game_state == GameState::Start) { - if (window.keyboard_input().size() && - window.keyboard_input().top().key == ACTION_KEY && - window.keyboard_input().top().action == 1) { - game_state = GameState::Playing; - - // Make the plane jump for the first time. - // @ToDo: The plane jumps too high because there was no - // gravity before. - plane.update(window.keyboard_input()); - } - - background.update(); - plane.update_animation(); // Only the animation. - ground.update(); - start_ui.update(); - } else if (game_state == GameState::Playing) { - background.update(); - ground.update(); - rocks1.update(); - rocks2.update(); - - plane.update(window.keyboard_input()); - - if (plane.aabb.is_colliding_with(rocks1.top_aabb) || - plane.aabb.is_colliding_with(rocks1.bottom_aabb) || - plane.aabb.is_colliding_with(rocks2.top_aabb) || - plane.aabb.is_colliding_with(rocks2.bottom_aabb) || - plane.aabb.is_colliding_with(top_aabb) || - plane.aabb.is_colliding_with(ground.aabb)) { - game_state = GameState::GameOver; - } - } else if (game_state == GameState::GameOver) { - if (window.keyboard_input().size() && - window.keyboard_input().top().key == ACTION_KEY) { - - // Reset everything. - background.reset(); - ground.reset(); - rocks1.reset(); - rocks2.reset(); - plane.reset(); - game_state = GameState::Start; - } - } - - context.set_viewport( - paradiso::Rectangle{.position = paradiso::Point{.x = 0, .y = 0}, - .size = canvas_size}); - context.clear(); - - background.draw(shader); - plane.draw(shader); - rocks1.draw(shader); - rocks2.draw(shader); - ground.draw(shader); - - // Kinda dumb that we check the game state here the second time but - // I like to seperate 'update' from 'draw'. - if (game_state == GameState::Start) { - start_ui.draw(shader); - } else if (game_state == GameState::GameOver) { - game_over_ui.draw(shader); - } - - // Einen kurzen Moment warten, um auf 60 FPS zu kommen. - auto t2 = std::chrono::high_resolution_clock::now(); - auto duration = - std::chrono::duration_cast(t2 - t1); - auto wait = - std::chrono::microseconds(1000000 / FRAME_RATE) - duration; - std::this_thread::sleep_for(wait); - - return true; - })) { - }; - } -}; - -} // namespace TappyPlane - -auto main() -> int { - std::srand(std::time(nullptr)); - - auto world_type = TappyPlane::App::WorldType::Grass; - auto plane_type = TappyPlane::App::PlaneType::Red; - - auto app = TappyPlane::App::create(world_type, plane_type); - app.run(); - return 0; -}