test-3ds/source/main.c

155 lines
5.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file main.c
* @author rick <rick@gnous.eu>
* date 2021
* @licence GPL3
*/
#include <citro2d.h>
#include <stdlib.h>
#include <stdio.h>
#define SCREEN_HEIGH 240
#define SCREEN_WIDTH 400
typedef struct
{
C2D_Sprite spr;
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 */
romfsInit();
/* init le framebuffer de lécran avec des paramètres par défaut */
gfxInitDefault();
/* init la lib C3D avec la taille du buffer par défaut */
if (!C3D_Init(C3D_DEFAULT_CMDBUF_SIZE))
printf("Erreur lors de linitialisation de C3D.\n");
/* init la lib C2D avec le max de sprites possible / frame */
if(!C2D_Init(C2D_DEFAULT_MAX_OBJECTS))
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
* 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;
C2D_SpriteFromSheet(&m_blue.spr, sprite_sheet, 0);
//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())
{
/* on capte le boutons pressé */
hidScanInput();
/* on récupère le bouton qui est maintenu
* pour déplacer le sprite */
u32 bouton_presse = hidKeysHeld();
/* hidKeysHeld retourne lensemble des touches pressées.
* 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)
/* 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)
C2D_SpriteMove(&m_blue.spr, 0, -1);
if (bouton_presse & KEY_LEFT)
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)
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(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);
}
/* nécessaire pour nettoyer la mémoire et les buffers */
C2D_SpriteSheetFree(sprite_sheet);
C2D_Fini();
C3D_Fini();
gfxExit();
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);
}