Created
November 18, 2019 23:54
-
-
Save TheGag96/ae94bb157a3671f3344f9a56c5de8f1c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Simple citro2d sprite drawing example | |
// Images borrowed from: | |
// https://kenney.nl/assets/space-shooter-redux | |
#include <citro2d.h> | |
#include <assert.h> | |
#include <string.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <time.h> | |
#define MAX_SPRITES 768 | |
#define SCREEN_WIDTH 400 | |
#define SCREEN_HEIGHT 240 | |
// Simple sprite struct | |
typedef struct | |
{ | |
C2D_Sprite spr; | |
float z; | |
float dx, dy; // velocity | |
} Sprite; | |
static C2D_SpriteSheet spriteSheet; | |
static Sprite sprites[MAX_SPRITES]; | |
static size_t numSprites = MAX_SPRITES/2; | |
float depth = 100; | |
bool rotation = false; | |
//--------------------------------------------------------------------------------- | |
static void initSprites() { | |
//--------------------------------------------------------------------------------- | |
size_t numImages = C2D_SpriteSheetCount(spriteSheet); | |
srand(time(NULL)); | |
for (size_t i = 0; i < MAX_SPRITES; i++) | |
{ | |
Sprite* sprite = &sprites[i]; | |
// Random image, position, rotation and speed | |
C2D_SpriteFromSheet(&sprite->spr, spriteSheet, rand() % numImages); | |
C2D_SpriteSetCenter(&sprite->spr, 0.5f, 0.5f); | |
C2D_SpriteSetPos(&sprite->spr, rand() % SCREEN_WIDTH, rand() % SCREEN_HEIGHT); | |
// C2D_SpriteSetRotation(&sprite->spr, C3D_Angle(rand()/(float)RAND_MAX)); | |
sprite->dx = rand()*4.0f/RAND_MAX - 2.0f; | |
sprite->dy = rand()*4.0f/RAND_MAX - 2.0f; | |
sprite->z = (MAX_SPRITES-i) / depth; | |
// sprite->z = -(rand()*10.0f/RAND_MAX - 5.0f); | |
} | |
} | |
//--------------------------------------------------------------------------------- | |
static void moveSprites() { | |
//--------------------------------------------------------------------------------- | |
for (size_t i = 0; i < numSprites; i++) | |
{ | |
Sprite* sprite = &sprites[i]; | |
C2D_SpriteMove(&sprite->spr, sprite->dx, sprite->dy); | |
if (rotation) { | |
C2D_SpriteRotateDegrees(&sprite->spr, 1.0f); | |
} | |
// Check for collision with the screen boundaries | |
if ((sprite->spr.params.pos.x < sprite->spr.params.pos.w / 2.0f && sprite->dx < 0.0f) || | |
(sprite->spr.params.pos.x > (SCREEN_WIDTH-(sprite->spr.params.pos.w / 2.0f)) && sprite->dx > 0.0f)) | |
sprite->dx = -sprite->dx; | |
if ((sprite->spr.params.pos.y < sprite->spr.params.pos.h / 2.0f && sprite->dy < 0.0f) || | |
(sprite->spr.params.pos.y > (SCREEN_HEIGHT-(sprite->spr.params.pos.h / 2.0f)) && sprite->dy > 0.0f)) | |
sprite->dy = -sprite->dy; | |
sprite->z = (MAX_SPRITES-i) / depth; | |
} | |
} | |
//--------------------------------------------------------------------------------- | |
int main(int argc, char* argv[]) { | |
//--------------------------------------------------------------------------------- | |
// Init libs | |
romfsInit(); | |
gfxInitDefault(); | |
gfxSet3D(true); // Enable stereoscopic 3D | |
C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); | |
C2D_Init(C2D_DEFAULT_MAX_OBJECTS); | |
C2D_Prepare(); | |
consoleInit(GFX_BOTTOM, NULL); | |
// Create screens | |
C3D_RenderTarget* topLeft = C2D_CreateScreenTarget(GFX_TOP, GFX_LEFT); | |
C3D_RenderTarget* topRight = C2D_CreateScreenTarget(GFX_TOP, GFX_RIGHT); | |
// Load graphics | |
spriteSheet = C2D_SpriteSheetLoad("romfs:/gfx/sprites.t3x"); | |
if (!spriteSheet) svcBreak(USERBREAK_PANIC); | |
// Initialize sprites | |
initSprites(); | |
printf("\x1b[8;1HPress Up to increment sprites"); | |
printf("\x1b[9;1HPress Down to decrement sprites"); | |
// Main loop | |
while (aptMainLoop()) | |
{ | |
hidScanInput(); | |
// Respond to user input | |
u32 kDown = hidKeysDown(); | |
if (kDown & KEY_START) | |
break; // break in order to return to hbmenu | |
if (kDown & KEY_X) | |
rotation = !rotation; | |
u32 kHeld = hidKeysHeld(); | |
if ((kHeld & KEY_UP) && numSprites < MAX_SPRITES) | |
numSprites++; | |
if ((kHeld & KEY_DOWN) && numSprites > 1) | |
numSprites--; | |
if ((kHeld & KEY_LEFT)) | |
depth--; | |
if ((kHeld & KEY_RIGHT)) | |
depth++; | |
moveSprites(); | |
printf("\x1b[1;1HSprites: %zu/%u\x1b[K", numSprites, MAX_SPRITES); | |
printf("\x1b[2;1HCPU: %6.2f%%\x1b[K", C3D_GetProcessingTime()*6.0f); | |
printf("\x1b[3;1HGPU: %6.2f%%\x1b[K", C3D_GetDrawingTime()*6.0f); | |
printf("\x1b[4;1HCmdBuf: %6.2f%%\x1b[K", C3D_GetCmdBufUsage()*100.0f); | |
printf("\x1b[5;1Hdepth: %6.2f%%\x1b[K", depth); | |
// Render the scene | |
C3D_FrameBegin(C3D_FRAME_SYNCDRAW); | |
C2D_TargetClear(topLeft, C2D_Color32f(0.0f, 0.0f, 0.0f, 1.0f)); | |
C2D_SceneBegin(topLeft); | |
for (size_t i = 0; i < numSprites; i ++) { | |
float oldX = sprites[i].spr.params.pos.x; | |
sprites[i].spr.params.pos.x -= sprites[i].z; | |
C2D_DrawSprite(&sprites[i].spr); | |
sprites[i].spr.params.pos.x = oldX; | |
} | |
C2D_TargetClear(topRight, C2D_Color32f(0.0f, 0.0f, 0.0f, 1.0f)); | |
C2D_SceneBegin(topRight); | |
for (size_t i = 0; i < numSprites; i ++) { | |
float oldX = sprites[i].spr.params.pos.x; | |
sprites[i].spr.params.pos.x += sprites[i].z; | |
C2D_DrawSprite(&sprites[i].spr); | |
sprites[i].spr.params.pos.x = oldX; | |
} | |
C3D_FrameEnd(0); | |
} | |
// Delete graphics | |
C2D_SpriteSheetFree(spriteSheet); | |
// Deinit libs | |
C2D_Fini(); | |
C3D_Fini(); | |
gfxExit(); | |
romfsExit(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment