Rotation du sprite & bouton écran tactile
This commit is contained in:
parent
d3856fa44c
commit
96bb50c54e
5 changed files with 63 additions and 8 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Makefile récupéré des fichiers exemples de Devkitpro.
|
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.
|
Le code est aussi documenté que possible mais certaines bibliothèques ne donnent aucune information sur les fonctions.
|
||||||
|
|
||||||
|
|
BIN
gfx/BOUTONNOPRESS.png
Normal file
BIN
gfx/BOUTONNOPRESS.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
gfx/BOUTONPRESS.PNG
Normal file
BIN
gfx/BOUTONPRESS.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 1 KiB |
|
@ -1,2 +1,4 @@
|
||||||
--atlas -f rgba8888 -z auto
|
--atlas -f rgba8888 -z auto
|
||||||
MBLUE.png
|
MBLUE.png
|
||||||
|
BOUTONNOPRESS.png
|
||||||
|
BOUTONPRESS.PNG
|
||||||
|
|
|
@ -18,6 +18,8 @@ typedef struct
|
||||||
float x, y;
|
float x, y;
|
||||||
} sprite ;
|
} sprite ;
|
||||||
|
|
||||||
|
void ft_button_press(touchPosition touch, sprite *press, sprite *nopress, sprite *m_blue);
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
/* initialisation du driver RomFS */
|
/* initialisation du driver RomFS */
|
||||||
|
@ -32,18 +34,23 @@ int main(int argc, char *argv[])
|
||||||
printf("Erreur lors de l’initialisation de C2D.\n");
|
printf("Erreur lors de l’initialisation de C2D.\n");
|
||||||
/* prépare le GPU pour du rendu 2D */
|
/* prépare le GPU pour du rendu 2D */
|
||||||
C2D_Prepare();
|
C2D_Prepare();
|
||||||
/* init la console sur l’écran du bas avec la console actuelle */
|
/* init la console sur l’écran du bas avec la console actuelle
|
||||||
consoleInit(GFX_BOTTOM, NULL);
|
* 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 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 */
|
* 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 *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 */
|
/* 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");
|
C2D_SpriteSheet sprite_sheet = C2D_SpriteSheetLoad("romfs:/gfx/sprites.t3x");
|
||||||
if (!sprite_sheet)
|
if (!sprite_sheet)
|
||||||
svcBreak(USERBREAK_PANIC);
|
svcBreak(USERBREAK_PANIC);
|
||||||
|
|
||||||
|
/* struct indiquand les coordonnées de l’écran tactile touchées*/
|
||||||
|
touchPosition touch;
|
||||||
|
|
||||||
sprite m_blue;
|
sprite m_blue;
|
||||||
m_blue.x = 0;
|
m_blue.x = 0;
|
||||||
m_blue.y = 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_SpriteSetCenter(&m_blue.spr, 0.5f, 0.5f);
|
||||||
C2D_SpriteSetPos(&m_blue.spr, m_blue.x, m_blue.y);
|
C2D_SpriteSetPos(&m_blue.spr, m_blue.x, m_blue.y);
|
||||||
//C2D_SpriteSetRotation(&m_blue.spr, C3D_Angle(0.0f));
|
//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())
|
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.*/
|
* ces opérations bit à bit sont nécessaires pour extraire la touche voulue.*/
|
||||||
if (bouton_presse & KEY_DOWN)
|
if (bouton_presse & KEY_DOWN)
|
||||||
/* on récupère la position du sprite (lire la doc pour + d’infos) */
|
/* 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
|
/* 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) */
|
* on indique la vitesse de x et y après en pixel/frame (je suppose) */
|
||||||
C2D_SpriteMove(&m_blue.spr, 0, 5);
|
C2D_SpriteMove(&m_blue.spr, 0, 5);
|
||||||
if (bouton_presse & KEY_UP)
|
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);
|
C2D_SpriteMove(&m_blue.spr, 0, -1);
|
||||||
if (bouton_presse & KEY_LEFT)
|
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);
|
C2D_SpriteMove(&m_blue.spr, -1, 0);
|
||||||
if (bouton_presse & KEY_RIGHT)
|
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);
|
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 */
|
/* attend que la frame précédente soit afficher avant de rendre la suivante */
|
||||||
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||||
/* nettoye l’écran avec la couleur passée en paramètre */
|
/* 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 */
|
/* prépare à écrire sur l’écran top, définit le buffer où écrire */
|
||||||
C2D_SceneBegin(top);
|
C2D_SceneBegin(top);
|
||||||
/* dessine le sprite */
|
/* dessine le sprite */
|
||||||
C2D_DrawSprite(&m_blue.spr);
|
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 */
|
/* on indique la fin de la frame */
|
||||||
C3D_FrameEnd(0);
|
C3D_FrameEnd(0);
|
||||||
}
|
}
|
||||||
|
@ -99,3 +126,29 @@ int main(int argc, char *argv[])
|
||||||
romfsExit();
|
romfsExit();
|
||||||
return 0;
|
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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue