From 2fc701723a70eea861378f026ffec05e1a567976 Mon Sep 17 00:00:00 2001 From: Fries Date: Tue, 23 Apr 2024 16:52:55 -0700 Subject: [PATCH] Add a semi-working bird sprite to the flappyBird game. --- .vscode/launch.json | 29 ++++++++++++++++++ src/engine/entity.hh | 1 + src/flappyBird/Assets.hh | 7 ++++- src/flappyBird/Bird.cc | 29 +++++++++++++++--- src/flappyBird/Bird.hh | 2 ++ src/flappyBird/FlappyBird.cc | 4 +++ src/flappyBird/FlappyBird.hh | 1 + src/flappyBird/assets/yellowbird-downflap.png | Bin 426 -> 4497 bytes src/flappyBird/generateAssets.py | 20 +++++++----- 9 files changed, 81 insertions(+), 12 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 88266ac..dc9ed8f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -187,6 +187,35 @@ ], "avoidWindowsConsoleRedirection": false, "internalConsoleOptions": "openOnSessionStart" + }, + { + "name": "(gdb, lxdream-nitro) Launch flappyBird.elf", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/src/flappyBird.elf", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "/opt/toolchains/dc/sh-elf/bin/sh-elf-gdb", + "miDebuggerServerAddress": "localhost:3263", + "debugServerPath": "/home/user/Downloads/lxdream-nitro/builddir/lxdream-nitro", + "debugServerArgs": "-d -g 3263 -e ${workspaceFolder}/build/src/flappyBird.elf", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set SuperH architechture", + "text": "set architecture sh4" + } + ], + "avoidWindowsConsoleRedirection": false, + "internalConsoleOptions": "openOnSessionStart" } ] } diff --git a/src/engine/entity.hh b/src/engine/entity.hh index ea76627..ff69166 100644 --- a/src/engine/entity.hh +++ b/src/engine/entity.hh @@ -16,6 +16,7 @@ public: std::vector children = {}; virtual void Draw() {}; virtual void Update() {}; + virtual void Start() {}; bool b_destroyed = false; Vector3 GetPosition() const; Vector3 GetGlobalPosition() const; diff --git a/src/flappyBird/Assets.hh b/src/flappyBird/Assets.hh index 903e2c7..884474a 100644 --- a/src/flappyBird/Assets.hh +++ b/src/flappyBird/Assets.hh @@ -2,6 +2,11 @@ #define ASSETS_HH #include namespace assets { - std::vector bird(); + struct Image { + int width; + int height; + std::vector data; + }; + extern Image bird; } #endif diff --git a/src/flappyBird/Bird.cc b/src/flappyBird/Bird.cc index f282bb8..f5089ee 100644 --- a/src/flappyBird/Bird.cc +++ b/src/flappyBird/Bird.cc @@ -1,22 +1,29 @@ #include "Bird.hh" - +#include "Assets.hh" +#include #include +#include void Bird::Draw() { engine::Vector3 one = {-1.0, -1.0, 0.0}; engine::Vector3 two = {0.0, 1.0, 0.0}; engine::Vector3 three = {1.0, -1.0, 0.0f}; + glEnable(GL_TEXTURE_2D); glBegin(GL_TRIANGLES); - glColor3f(1.0f, 0.0f, 0.0f); + // glColor3f(1.0f, 0.0f, 0.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3fv((float*)&(one)); - glColor3f(0.0f, 1.0f, 0.0f); + // glColor3f(0.0f, 1.0f, 0.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3fv((float*)&two); - glColor3f(0.0f, 0.0f, 1.0f); + // glColor3f(0.0f, 0.0f, 1.0f); + glTexCoord2f(0.5f, 1.0f); glVertex3fv((float*)&three); glEnd(); + glDisable(GL_TEXTURE_2D); } void Bird::Update() { @@ -63,3 +70,17 @@ Bird::Bird(engine::Engine* engie, engine::Entity* parent, PipesContainer* pipes) : Entity(engie, parent) { this->pipes = pipes; } + +void Bird::Start() { + auto bird = assets::bird; + + glGenTextures(1, &ui_birdTexture); + glBindTexture(GL_TEXTURE_2D, ui_birdTexture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bird.width, bird.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bird.data.data()); +} diff --git a/src/flappyBird/Bird.hh b/src/flappyBird/Bird.hh index a776310..a6a0157 100644 --- a/src/flappyBird/Bird.hh +++ b/src/flappyBird/Bird.hh @@ -7,6 +7,7 @@ class Bird : public engine::Entity { public: void Draw() override; void Update() override; + void Start() override; Bird(engine::Engine* engie, engine::Entity* parent, PipesContainer* pipes); bool b_isHit = false; @@ -15,5 +16,6 @@ class Bird : public engine::Entity { static constexpr float JUMP_CONST = 0.5; float f_verticalSpeed = JUMP_CONST; PipesContainer *pipes = nullptr; + unsigned int ui_birdTexture = 0; }; #endif diff --git a/src/flappyBird/FlappyBird.cc b/src/flappyBird/FlappyBird.cc index cafc2af..491ac6c 100644 --- a/src/flappyBird/FlappyBird.cc +++ b/src/flappyBird/FlappyBird.cc @@ -105,3 +105,7 @@ FlappyBird::~FlappyBird() p_thread->detach(); delete p_thread; } + +void FlappyBird::Start() { + p_bird->Start(); +} diff --git a/src/flappyBird/FlappyBird.hh b/src/flappyBird/FlappyBird.hh index f04fc79..0185b58 100644 --- a/src/flappyBird/FlappyBird.hh +++ b/src/flappyBird/FlappyBird.hh @@ -11,6 +11,7 @@ class FlappyBird : public engine::Engine { void GameLoop() override; + void Start() override; void SpawnPipes(); void MainGameLoop(); void MainMenuLoop(); diff --git a/src/flappyBird/assets/yellowbird-downflap.png b/src/flappyBird/assets/yellowbird-downflap.png index e9e1c77b9deb38738f6f4d184243143bca2da46b..943fe360a2225a7492102f5c24ee3bc4d77f5818 100644 GIT binary patch literal 4497 zcmeHKe^3)w9^arS#KZGi%7M0YFJ7%F?q+urlFc3wZ9*Y~0S2kXwvKFe7g#0Pm@E+N z6a&~=E5az$5lTk{z3*Z$nntjLKU}#=Xw`prNpSeERYoBu{P7`%0nrfBygh{> zfq4BgcdTyq`JT?&CzhQRFJ+Ot_J7y4ZOhq_9bfML@M+EBb5R@eer2t`lm6{L53Ox$ zm7CsowqNf*mi|F#03X=!w|{?g*mFE5blT`UP=4>|65_6Nb7yCNL#W1cb?`*zhcBGI zHh;m3e|gOA??PN#4#%9_chPdK=Dp|Ir9TZHdZ+Q@xoGyf15&8YUUbs&_Z!K#Zw=oX zzG58yz8djA@9+NO-LKLh27_Wjp=#yV&MDwFZ{)1JE`7N+Eyw_XN03=G=qd9Cn4nFk z;xZsB-3A@1s>mB{xG|kT!Gx?6EA`tLq)0N7yk1-f3 zD=YCzBQE(%45Za+H4v16qA<|F0##m_4PxHFVg(|M;Sd6xU-ZeMnU*_So80WzcfD7>C4_EABZRHk~p*!%LjVGpZ<16lGz}1SW8_1v6P`D`pkk z@JMy@Bt^3%%@UKKoZf)UdO1OX0&rXe9Dy|PG-cs13t={4CYmnBXo03Nie%|j3q^1w z%}s*H^@|XdY}sV56eu2`Qq4xQnG!4*X)*Db$- zO<75rB7unsr8R;-0FkI*s<~4gQMQGF#Q?Fa5~l#5_QP5jyI){s$zLEzWj5V-)*T;q z!ExeQnRT$T0HEV}xL_;~V}ykv#(8I45-%24{XcEx@SthoEzc4IFn^WW6+Tg`g-zkN z@N1c<9wii24+X<=;Uxsv3V~Ps1g!87SIT-z1jrtda2@Lxe;^c6DPyY90)fQBPGKf9 zX~ZCcESQlZDT*_*R+grwq6eg6xsvq@D@%Y!;0nT1{f9!AsvD)Bs$E$sD7yfJVT1{z zs0d-HWP~t7WWfd{XN;{l&G0{*q^Sy%k_^~|`yhEiE;NiM!w6?e+W84fWG{Zg831}_ zl4_X(z5zf)~DmD&ew3z127$E?RTk*_jUH zzVd5-=eJGJ6YI-b8$ghG4=PoIw6-Ne=Umz8%9uMeJK>j!#@$U9E8sSbI~^+vNZl&xzRpzn=*OkncCOyA@Ak`2uj2>tSMKe{dIl?&n{s12 z^`SjvWAeZ5CojwVBGaPfc2?ELKY6B^7+j6a!?rGV3vwuChzd3sAhHV$)iNed8v&TkQ zvSHro%h6xoOsVfidXIhEJnAd>x+(ASy&=6OVKgPFVi&)Ku3OZvXOASbzpDR(JNeM@ zPj8IW*FgEA-}y>#WWK(6@3#J-(j?-`e`rdpk`qRUkR{3Qp4r(&g+6JfTBGKicqEh( z-9D?ZWkuu3bnvews^?OE*SV#4O0{8bqJE7aMaRmT*yCF-0hx$1BggUPlSQ@v1;q^< AcK`qY literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^N0k@DU)Otn z{rdG|yYcmBXZ~0)JZRAQ|NsAjlBe20X~vQuzhDN3XE)M7oFs2|7ml`jQ>%a+&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=n3;!xN%;9M)g3^gEKe855Q)pZ7Xx_@DDbdch_c|` z+Rz#`qc!rtzdq>=sjVsBUE?z}5|%k^4ByAJ!`ka$T!g!ToEOuzDa{u&IhFo(WoYXz zDx9oRkXI(;$Etnt%hpG8VzmpM7VpkfwA$Ns>~Px5;^<#p`}Q%EMVg;vcHSliv{kjl zHKHUXu_Vlzw{7+P2v7+D!wY8#kY85lg&vOJ8UAvZrIGp!Q0 Uh6&}3^*{{_p00i_>zopr0M`A6wg3PC diff --git a/src/flappyBird/generateAssets.py b/src/flappyBird/generateAssets.py index a67cb8a..60c22bf 100644 --- a/src/flappyBird/generateAssets.py +++ b/src/flappyBird/generateAssets.py @@ -3,13 +3,13 @@ from pathlib import Path from PIL import Image parser = argparse.ArgumentParser() -parser.add_argument("function") +parser.add_argument("variable") parser.add_argument("input") parser.add_argument("output") args = parser.parse_args() -function = args.function +variable = args.variable input = Path(args.input) output = Path(args.output) @@ -18,10 +18,14 @@ if not input.exists(): raise SystemExit(1) hexList = list() +imageWidth = 0 +imageHeight = 0 with Image.open(input) as image: - imageBytes = bytes(image.getdata()) - byteList = list(imageBytes) + imageWidth = image.width + imageHeight = image.height + # flatten a tuple of RGBA bytes into a list of bytes + byteList = [item for tup in [*image.getdata()] for item in tup] for byte in byteList: hexList.append(f'0x{byte:02x}') @@ -31,9 +35,11 @@ code = f"""#include #include namespace assets {{ -std::vector {function}() {{ - return {{ {','.join(hexList)} }}; -}} +Image {variable} = {{ + .width = {imageWidth}, + .height = {imageHeight}, + .data = {{ {','.join(hexList)} }} +}}; }} """