From 96bb50c54e3b6be0833c08885806aeb4a7ceee95 Mon Sep 17 00:00:00 2001 From: rick Date: Fri, 19 Mar 2021 11:16:53 +0100 Subject: [PATCH] =?UTF-8?q?Rotation=20du=20sprite=20&=20bouton=20=C3=A9cra?= =?UTF-8?q?n=20tactile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- gfx/BOUTONNOPRESS.png | Bin 0 -> 1078 bytes gfx/BOUTONPRESS.PNG | Bin 0 -> 1054 bytes gfx/sprites.t3s | 2 ++ source/main.c | 67 +++++++++++++++++++++++++++++++++++++----- 5 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 gfx/BOUTONNOPRESS.png create mode 100644 gfx/BOUTONPRESS.PNG diff --git a/README.md b/README.md index e9a7d36..7e7bcf8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Makefile récupéré des fichiers exemples de Devkitpro. -Programme affichant un sprite basique et de le déplacer. +Programme affichant un sprite basique et de le déplacer. Il affiche aussi un bouton sur l’écran tactile pour faire tourner le sprite. Le code est aussi documenté que possible mais certaines bibliothèques ne donnent aucune information sur les fonctions. diff --git a/gfx/BOUTONNOPRESS.png b/gfx/BOUTONNOPRESS.png new file mode 100644 index 0000000000000000000000000000000000000000..a971b2e2bd95d4272cbed509d2b688abe600f3da GIT binary patch literal 1078 zcmV-61j+k}P)EX>4Tx04R}tkv&MmKpe$iQ$>-Apan%7GSp5ML`5963Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2zhIPS;0dyl(!fKV?p&FUBjG~G5+ ziMW`_u8Li+2%;Z@5D=A_Wz0!Z629Z>9s$1I#dwzgxj#p*nzI-X5Q%4*VcNtS#M7I$ z!FiuJ%!;x~d`>)O(glehxvqHp#<}3Kz%#>UIyFxmCKd~Ath6yJni}yGaYWU0$`>*o ztDLtuYvn3y-jlyDl+#z1xlVHg2`pj>5=1DdqJ%PR#Aww?v5=zuxQ~C>^-JVZ$W;O( z#{w$QAiI9>Klt6Pm7kpOl0tEy^TlyKMuDzfpiy(2?_(i|qi@Or1GhlWn%7%%AEysMnz~Bf00)Oa zv_RSGKJV^s@9p0+&HjD>K8|vdQV7uy00006VoOIv044ww0Oyi}9jpKV010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00It4L_t(Y$L*F)XcJKsg})gmlgt=VtIu_`qdgHabC}MQcl}fQ))U^KL50TOuwcWJQ)E{gT zXC}dM(F!e%V8K)qayA#<<=)5PynD|Ryer2o3IHMnf>}iTtujM#jiI>4z_5#^pe=tD zdGa_##o8EmLX+&5TO&!(fk z*GYM!h&a%1u%pgSb&bs1sLAdF5)QlYSHBMnLgZ$rN!fZEiXzf||2u)8laY~h{%x(~ w7cdNqSS-V>t7*zN$b|ch{F{-Yv;SxK3FRZ@n3i_DQ~&?~07*qoM6N<$g7xp~n*aa+ literal 0 HcmV?d00001 diff --git a/gfx/BOUTONPRESS.PNG b/gfx/BOUTONPRESS.PNG new file mode 100644 index 0000000000000000000000000000000000000000..40099d88c4417214af6a05f8d7e221f4cbf7e0e9 GIT binary patch literal 1054 zcmV+(1mXLMP)EX>4Tx04R}tkv&MmKpe$iQ$>-Apan%7GSp5ML`5963Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLxj8AiNQwVT3N2zhIPS;0dyl(!fKV?p&FUBjG~G5+ ziMW`_u8Li+2%;Z@5D=A_Wz0!Z629Z>9s$1I#dwzgxj#p*nzI-X5Q%4*VcNtS#M7I$ z!FiuJ%!;x~d`>)O(glehxvqHp#<}3Kz%#>UIyFxmCKd~Ath6yJni}yGaYWU0$`>*o ztDLtuYvn3y-jlyDl+#z1xlVHg2`pj>5=1DdqJ%PR#Aww?v5=zuxQ~C>^-JVZ$W;O( z#{w$QAiI9>Klt6Pm7kpOl0tEy^TlyKMuDzfpiy(2?_(i|qi@Or1GhlWn%7%%AEysMnz~Bf00)Oa zv_RSGKJV^s@9p0+&HjD>K8|vdQV7uy00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00H(%L_t(Y$L*CrOcQYw$3It()}FmMP?P#6g4h570+TNO zNlZ+1Mh#H|YC-~oan#5pgBu!SOmt!~K^u*egEpkp1Pjpt3q3$Av?qj~7AGj)wWsG$ z2a%dcVhz{yEpPbc``+)H@B6+dq`bQ=N+2ARNUR~!e`OqBdI4X00oRPm{jR8e6?yw+ zmBu|9&z>%G>WuW)g$AyT6MZ$m{rv1H`V+p*ec`~E306f1LBl2Jpfbd;~ zV4uR-b22ARdZ=8SFNg{BOt2J+vu#dAoJ{E(AT6H@#u3!Da`F45DoAq>Y6Db+93*n&^D;(1C?c74^X%F8Ts#zL}<2~lLl_KKkh{2&FE@aukY&^^3 zws%~13HCGlh1<?3*lp Y0Lta`QZVJdp#T5?07*qoM6N<$f(&ljhX4Qo literal 0 HcmV?d00001 diff --git a/gfx/sprites.t3s b/gfx/sprites.t3s index 13fdc34..5701b8c 100644 --- a/gfx/sprites.t3s +++ b/gfx/sprites.t3s @@ -1,2 +1,4 @@ --atlas -f rgba8888 -z auto MBLUE.png +BOUTONNOPRESS.png +BOUTONPRESS.PNG diff --git a/source/main.c b/source/main.c index af5f995..ceff92e 100644 --- a/source/main.c +++ b/source/main.c @@ -18,6 +18,8 @@ typedef struct float x, y; } sprite ; +void ft_button_press(touchPosition touch, sprite *press, sprite *nopress, sprite *m_blue); + int main(int argc, char *argv[]) { /* initialisation du driver RomFS */ @@ -32,18 +34,23 @@ int main(int argc, char *argv[]) printf("Erreur lors de l’initialisation de C2D.\n"); /* prépare le GPU pour du rendu 2D */ C2D_Prepare(); - /* init la console sur l’écran du bas avec la console actuelle */ - consoleInit(GFX_BOTTOM, NULL); + /* init la console sur l’écran du bas avec la console actuelle + * Ne doit pas être mis si on veut dessiner des sprites sur l’écran */ + /* consoleInit(GFX_BOTTOM, NULL); */ /* on créé une cible de rendu pour l’écran du haut (on le "créé") * On utilise le coté gauche car le droit n’est utilisé qu’en 3D */ C3D_RenderTarget *top = C2D_CreateScreenTarget(GFX_TOP, GFX_LEFT); + C3D_RenderTarget *bot = C2D_CreateScreenTarget(GFX_BOTTOM, GFX_LEFT); /* on récupère la feuille des sprites générée par le Makefile */ C2D_SpriteSheet sprite_sheet = C2D_SpriteSheetLoad("romfs:/gfx/sprites.t3x"); if (!sprite_sheet) svcBreak(USERBREAK_PANIC); + /* struct indiquand les coordonnées de l’écran tactile touchées*/ + touchPosition touch; + sprite m_blue; m_blue.x = 0; m_blue.y = 0; @@ -51,6 +58,16 @@ int main(int argc, char *argv[]) //C2D_SpriteSetCenter(&m_blue.spr, 0.5f, 0.5f); C2D_SpriteSetPos(&m_blue.spr, m_blue.x, m_blue.y); //C2D_SpriteSetRotation(&m_blue.spr, C3D_Angle(0.0f)); + + sprite button_no_press; + C2D_SpriteFromSheet(&button_no_press.spr, sprite_sheet, 1); + C2D_SpriteSetCenter(&button_no_press.spr, 0.5f, 0.5f); + C2D_SpriteSetPos(&button_no_press.spr, 100, 50); + + sprite button_press; + C2D_SpriteFromSheet(&button_press.spr, sprite_sheet, 2); + C2D_SpriteSetCenter(&button_press.spr, 0.5f, 0.5f); + C2D_SpriteSetPos(&button_press.spr, 100, 50); while (aptMainLoop()) { @@ -65,28 +82,38 @@ int main(int argc, char *argv[]) * ces opérations bit à bit sont nécessaires pour extraire la touche voulue.*/ if (bouton_presse & KEY_DOWN) /* on récupère la position du sprite (lire la doc pour + d’infos) */ - if (m_blue.spr.params.pos.y != SCREEN_HEIGH) + if (m_blue.spr.params.pos.y < SCREEN_HEIGH) /* permet de déplacer le sprite en mettant à jour son x et son y * on indique la vitesse de x et y après en pixel/frame (je suppose) */ C2D_SpriteMove(&m_blue.spr, 0, 5); if (bouton_presse & KEY_UP) - if (m_blue.spr.params.pos.y != 0) + if (m_blue.spr.params.pos.y > 0) C2D_SpriteMove(&m_blue.spr, 0, -1); if (bouton_presse & KEY_LEFT) - if (m_blue.spr.params.pos.x != 0) + if (m_blue.spr.params.pos.x > 0) C2D_SpriteMove(&m_blue.spr, -1, 0); if (bouton_presse & KEY_RIGHT) - if (m_blue.spr.params.pos.x != SCREEN_WIDTH) + if (m_blue.spr.params.pos.x < SCREEN_WIDTH) C2D_SpriteMove(&m_blue.spr, 1, 0); + /* récpère les coordonnées de l’écran tactile */ + hidTouchRead(&touch); + /* attend que la frame précédente soit afficher avant de rendre la suivante */ C3D_FrameBegin(C3D_FRAME_SYNCDRAW); /* nettoye l’écran avec la couleur passée en paramètre */ - C2D_TargetClear(top, C2D_Color32f(0.0f, 0.0f, 0.0f, 1.0f)); + C2D_TargetClear(top, C2D_Color32f(250.0f, 0.0f, 0.0f, 1.0f)); /* prépare à écrire sur l’écran top, définit le buffer où écrire */ C2D_SceneBegin(top); /* dessine le sprite */ C2D_DrawSprite(&m_blue.spr); + + /* on fait la meme pour l’écran du bas */ + C2D_TargetClear(bot, C2D_Color32f(0.0f, 0.0f, 0.0f, 1.0f)); + C2D_SceneBegin(bot); + /* on appelle une fonction pour vérifier si le bouton est pressé */ + ft_button_press(touch, &button_press, &button_no_press, &m_blue); + /* on indique la fin de la frame */ C3D_FrameEnd(0); } @@ -99,3 +126,29 @@ int main(int argc, char *argv[]) romfsExit(); return 0; } + +/** + * ft_button_press(): méthode pour faire tourner le sprite si le bouton est pressé + * @touch: l’interaction qu’il y a eu sur l’écran tactile + * @press: le sprite du bouton pressé + * @nopress: le sprite du bouton non pressé + * @m_blue: le sprite à faire tourner + */ +void ft_button_press(touchPosition touch, sprite *press, sprite *nopress, sprite *m_blue) +{ + /* on récupère des valeurs très grosses pour simplifier la vérification */ + float heigth = nopress->spr.params.pos.h / 2; + float weigth = nopress->spr.params.pos.w / 2; + float sprx = nopress->spr.params.pos.x; + float spry = nopress->spr.params.pos.y; + if (touch.px >= sprx - weigth && touch.px <= sprx + weigth && + touch.py >= spry - heigth && touch.py <= spry + heigth) + { + /* on dessine le bouton pressé et on tourne le sprite */ + C2D_DrawSprite(&press->spr); + C2D_SpriteRotateDegrees(&m_blue->spr, 5); + } + else + /* on affiche juste le sprite du bouton non pressé */ + C2D_DrawSprite(&nopress->spr); +}