Rotation du sprite & bouton écran tactile

This commit is contained in:
rick 2021-03-19 11:16:53 +01:00
parent d3856fa44c
commit 96bb50c54e
Signed by: Rick
GPG key ID: 2B593F087240EE99
5 changed files with 63 additions and 8 deletions

View file

@ -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.

BIN
gfx/BOUTONNOPRESS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
gfx/BOUTONPRESS.PNG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -1,2 +1,4 @@
--atlas -f rgba8888 -z auto
MBLUE.png
BOUTONNOPRESS.png
BOUTONPRESS.PNG

View file

@ -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 linitialisation 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 nest utilisé quen 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 + dinfos) */
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: linteraction quil 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);
}