Add NES sprite flags, handle SDL non-held inputs

This commit is contained in:
OctoSpacc 2023-11-19 01:34:57 +01:00
parent 3ba1e58b75
commit 399e7426b5
11 changed files with 237 additions and 82 deletions

View File

@ -6,6 +6,7 @@ before_script: |
Tests:
stage: build
script: |
make -j($nproc --all)
. .env
make -j$(nproc --all)
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH

Binary file not shown.

View File

@ -13,23 +13,21 @@ typedef struct MainArgs {
MultiSpacc_Surface *background;
//MultiSpacc_Surface *Foreground;
MultiSpacc_Surface *tilesImg;
MultiSpacc_KeysStates *buttonsStates;
} MainArgs;
/*{pal:"nes",layout:"nes"}*/
const char palette[32] = {
0x0F, // screen
0x11,0x02,0x02,0x00, // background 0
0x00,0x00,0x00,0x00, // background 1
0x00,0x00,0x00,0x00, // background 2
0x00,0x00,0x00,0x00, // background 3
0x16,0x00,0x00,0x00, // sprite 0
0x28,0x00,0x00,0x00, // sprite 0
0x00,0x00,0x00,0x00, // sprite 1
0x00,0x00,0x00,0x00, // sprite 2
0x00,0x00,0x00, // sprite 3
};
Uint32 nextTick;
bool MainLoop( void *args )
{
MainArgs *margs = (MainArgs*)args;
@ -37,7 +35,7 @@ bool MainLoop( void *args )
//SDL_FillRect(margs->background, NULL, 0x00F);
MultiSpacc_BlitLayer( margs->background, margs->screen );
//SDL_BlitSurface( margs->Foreground, &rect, margs->Screen, &rect );
MultiSpacc_SetSprite( 0, margs->spriteX, margs->spriteY, 1, margs->tilesImg, margs->screen );
MultiSpacc_SetSprite( 0, margs->spriteX, margs->spriteY, 1, NULL, margs->tilesImg, margs->screen );
//scroll(spriteX,0);
margs->spriteX += margs->accelX;
@ -52,8 +50,10 @@ bool MainLoop( void *args )
margs->accelY *= -1;
}
MultiSpacc_PollButtons( 0, margs->buttonsStates );
/* TODO: listen for OS terminate signal */
if( MultiSpacc_CheckKey( MultiSpacc_Key_Pause, 0 ) )
if( MultiSpacc_CheckKeyPress( MultiSpacc_Key_Pause, margs->buttonsStates ) )
{
return false;
}
@ -77,14 +77,15 @@ int main( int argc, char *argv[] )
{
MainArgs margs = {0};
MultiSpacc_SurfaceConfig windowConfig = {0};
MultiSpacc_KeysStates buttonsStates = {0};
margs.windowConfig = &windowConfig;
margs.buttonsStates = &buttonsStates;
margs.accelX = +2;
margs.accelY = +2;
windowConfig.width = 320;
windowConfig.height = 240;
//windowConfig.bits = 16;
memcpy( windowConfig.palette, palette, 32 );
//romfsInit();

View File

@ -9,6 +9,7 @@ All all:
"Target=WindowsPC MultiSpacc_Target=SDL20" \
"Target=Windows9x" \
"Target=Web" \
"Target=Switch" \
"Target=NDS" \
"Target=NES" \
; do \

View File

@ -20,13 +20,14 @@ signed char paddleDxMove = 0;
//char scoreChar[6];
MultiSpacc_KeysStates buttonsStates;
MultiSpacc_SurfaceConfig windowConfig = {0};
MultiSpacc_Window *window;
MultiSpacc_Surface *screen;
MultiSpacc_Surface *background;
MultiSpacc_Surface *tilesImg;
MultiSpacc_SpritesMap paddleSpriteMap;
MultiSpacc_SpritesMap paddleSxSpriteMap, paddleDxSpriteMap;
MultiSpacc_TilesMap divisorTileMap, borderTileMap;
#define BallSize 8
@ -36,8 +37,9 @@ MultiSpacc_TilesMap divisorTileMap, borderTileMap;
#define BallTile 128
#define PaddleTile 129
#define DivisorTile 130
#define BorderTile 131
#define BorderTile 130
#define DivisorTileSx 131
#define DivisorTileDx 132
#define BallSprite 0
#define PaddleSxSprite 1
@ -54,15 +56,15 @@ MultiSpacc_TilesMap divisorTileMap, borderTileMap;
// TODO: more defines for frequently-used expressions
const char palette[32] = {
0x0F, // screen
0x11,0x30,0x27,0x00, // background 0
0x1c,0x20,0x2c,0x00, // background 1
0x00,0x10,0x20,0x00, // background 2
0x06,0x16,0x26,0x00, // background 3
0x16,0x35,0x24,0x00, // sprite 0
0x00,0x37,0x25,0x00, // sprite 1
0x0d,0x2d,0x3a,0x00, // sprite 2
0x0d,0x27,0x2a, // sprite 3
0x1B, // screen
0x30,0x20,0x20,0x20, // background 0
0x00,0x00,0x00,0x00, // background 1
0x00,0x00,0x00,0x00, // background 2
0x00,0x00,0x00,0x00, // background 3
0x30,0x20,0x20,0x20, // sprite 0
0x00,0x00,0x00,0x00, // sprite 1
0x00,0x00,0x00,0x00, // sprite 2
0x00,0x00,0x00, // sprite 3
};
void ResetBall(void)
@ -163,11 +165,11 @@ void UpdateCpuPlayer(void)
bool PollPlayerPaddle(void)
{
if( paddleSxY > 0+ScreenMarginYPx+PaddleMarginYPx+BallSize && MultiSpacc_CheckKey( MultiSpacc_Key_Up, 0 ) )
if( paddleSxY > 0+ScreenMarginYPx+PaddleMarginYPx+BallSize && MultiSpacc_CheckKeyHold( MultiSpacc_Key_Up, &buttonsStates ) )
{
paddleSxMove = -1;
}
else if( paddleSxY < windowConfig.height-ScreenMarginYPx-PaddleMarginYPx-PaddleHeightPx-BallSize && MultiSpacc_CheckKey( MultiSpacc_Key_Down, 0 ) )
else if( paddleSxY < windowConfig.height-ScreenMarginYPx-PaddleMarginYPx-PaddleHeightPx-BallSize && MultiSpacc_CheckKeyHold( MultiSpacc_Key_Down, &buttonsStates ) )
{
paddleSxMove = +1;
}
@ -193,8 +195,8 @@ bool DisplayBorders(void)
for( i=1; i<(windowConfig.height/8 - 1); i++ )
{
MultiSpacc_SetTile( windowConfig.width/8/2 , i, DivisorTile, tilesImg, background );
MultiSpacc_SetTile( windowConfig.width/8/2 - 1, i, DivisorTile, tilesImg, background );
MultiSpacc_SetTile( windowConfig.width/8/2 , i, DivisorTileDx, tilesImg, background );
MultiSpacc_SetTile( windowConfig.width/8/2 - 1, i, DivisorTileSx, tilesImg, background );
}
for( i=0; i<windowConfig.width/8; i++ )
@ -206,18 +208,20 @@ bool DisplayBorders(void)
bool RealUpdate( void *args, double deltaTime )
{
MultiSpacc_PollButtons( 0, &buttonsStates );
if(!paused)
{
//SDL_FillRect( background, &background->clip_rect, SDL_MapRGB( background->format, 0, 0, 0 ) );
MultiSpacc_BlitLayer( background, screen );
MultiSpacc_SetSprite( BallSprite, ballX+accelX*deltaTime, ballY+accelY*deltaTime, BallTile, tilesImg, screen );
MultiSpacc_SetSprite( BallSprite, ballX+accelX*deltaTime, ballY+accelY*deltaTime, BallTile, NULL, tilesImg, screen );
#define PaddleAccelDelta PaddleAccel*deltaTime
#define PaddleSxYDisplay (paddleSxY + paddleSxMove*PaddleAccelDelta)
#define PaddleDxYDisplay (paddleDxY + paddleDxMove*PaddleAccelDelta)
MultiSpacc_SetMetaSprite( PaddleSxSprite, PaddleSxX, PaddleSxYDisplay, &paddleSpriteMap, PaddleHeightTl, tilesImg, screen );
MultiSpacc_SetMetaSprite( PaddleDxSprite, PaddleDxX, PaddleDxYDisplay, &paddleSpriteMap, PaddleHeightTl, tilesImg, screen );
MultiSpacc_SetMetaSprite( PaddleSxSprite, PaddleSxX, PaddleSxYDisplay, &paddleSxSpriteMap, PaddleHeightTl, tilesImg, screen );
MultiSpacc_SetMetaSprite( PaddleDxSprite, PaddleDxX, PaddleDxYDisplay, &paddleDxSpriteMap, PaddleHeightTl, tilesImg, screen );
//RefreshScore():
//itoa(scoreSx, scoreChar, 10);
@ -231,7 +235,7 @@ bool RealUpdate( void *args, double deltaTime )
// TODO: listen for OS terminate signal
// TODO: fix SDL not waiting for key release with inputs checked this way
// TODO: proper pause menu?
if( MultiSpacc_CheckKey( MultiSpacc_Key_Pause, 0 ) )
if( MultiSpacc_CheckKeyPress( MultiSpacc_Key_Pause, &buttonsStates ) )
{
if(!paused)
{
@ -257,17 +261,25 @@ bool RealUpdate( void *args, double deltaTime )
int main( int argc, char *argv[] )
{
int i;
int chr[] = { PaddleTile, PaddleTile, PaddleTile, PaddleTile };
int x[] = { 0, 0, 0, 0 };
int y[] = { 0, 8, 16, 24 };
paddleSpriteMap.chr = chr;
paddleSpriteMap.x = x;
paddleSpriteMap.y = y;
int x[PaddleHeightTl] = { 0, 0, 0, 0 };
int y[PaddleHeightTl] = { 0, 8, 16, 24 };
int chr[PaddleHeightTl] = { PaddleTile, PaddleTile, PaddleTile, PaddleTile };
MultiSpacc_SpriteFlags flagsSx[PaddleHeightTl];
MultiSpacc_SpriteFlags flagsDx[PaddleHeightTl];
for( i=0; i<PaddleHeightTl; ++i ){
flagsDx[i].flipHorizontal = true;
}
paddleSxSpriteMap.x = paddleDxSpriteMap.x = x;
paddleSxSpriteMap.y = paddleDxSpriteMap.y = y;
paddleSxSpriteMap.chr = paddleDxSpriteMap.chr = chr;
paddleSxSpriteMap.flags = (MultiSpacc_SpriteFlags*)&flagsSx;
paddleDxSpriteMap.flags = (MultiSpacc_SpriteFlags*)&flagsDx;
windowConfig.width = 320;
windowConfig.height = 240;
windowConfig.bits = 16;
memcpy( windowConfig.palette, palette, 32 );
window = MultiSpacc_SetWindow( &windowConfig );

View File

@ -1,33 +1,92 @@
#include "./MultiSpacc.h"
bool MultiSpacc_CheckKey( int key, char pad )
// TODO: Handle actual presses in SDL
// void MultiSpacc_PollButtons( char pad, MultiSpacc_KeysStates *buttonsPressed, MultiSpacc_KeysStates *buttonsHeld )
// {
// #if defined(MultiSpacc_Target_SDLCommon)
// SDL_PumpEvents();
// #if defined(MultiSpacc_Target_SDL12)
// buttonsPressed->keysStates = SDL_GetKeyState(NULL);
// #elif defined(MultiSpacc_Target_SDL20)
// buttonsPressed->keysStates = SDL_GetKeyboardState(NULL);
// #endif
// buttonsHeld->keysStates = buttonsPressed->keysStates;
// #elif defined(MultiSpacc_Target_NDS)
// scanKeys();
// buttonsPressed->keysStates = keysDown();
// buttonsHeld->keysStates = buttonsPressed->keysStates;
// #elif defined(MultiSpacc_Target_NES)
// buttonsPressed->keysStates = pad_trigger(pad);
// buttonsHeld->keysStates = pad_state(pad);
// #endif
// }
// bool MultiSpacc_CheckButtonState( int button, MultiSpacc_KeysStates *buttonsStates )
// {
// #if defined(MultiSpacc_Target_SDLCommon)
// return buttonsStates->keysStates[button];
// #elif defined(MultiSpacc_Target_NDS) || defined(MultiSpacc_Target_NES)
// return ( buttonsStates->keysStates & button );
// #endif
// }
void MultiSpacc_PollButtons( char pad, MultiSpacc_KeysStates *keysStates )
{
#if defined(MultiSpacc_Target_SDLCommon)
int numkeys;
SDL_PumpEvents();
#if defined(MultiSpacc_Target_SDL12)
Uint8 *keys;
SDL_PumpEvents();
keys = SDL_GetKeyState(NULL);
keysStates->keysHeld = SDL_GetKeyState(&numkeys);
#elif defined(MultiSpacc_Target_SDL20)
const Uint8 *keys;
SDL_PumpEvents();
keys = SDL_GetKeyboardState(NULL);
keysStates->keysHeld = SDL_GetKeyboardState(&numkeys);
#endif
return keys[key];
// SDL_Event event;
// while( SDL_PollEvent(&event) ) // TODO: fix this, it eliminates all events beside the first
// {
// if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == key )
// {
// return true;
// }
// }
// return false;
if( keysStates->keysPressed == NULL )
{
keysStates->keysPressed = malloc( numkeys*sizeof(int) );
memset( (void*)keysStates->keysPressed, false, numkeys*sizeof(int) );
}
#elif defined(MultiSpacc_Target_NDS)
int keys;
scanKeys();
keys = keysDown();
return ( keys & key );
keysStates->keysPressed = keysDown();
keysStates->keysHeld = keysStates->keysPressed;
#elif defined(MultiSpacc_Target_NES)
return ( pad_poll(pad) & key );
keysStates->keysPressed = pad_trigger(pad);
keysStates->keysHeld = pad_state(pad);
#endif
}
bool MultiSpacc_CheckKeyPress( int key, MultiSpacc_KeysStates *keysStates )
{
#if defined(MultiSpacc_Target_SDLCommon)
if ( keysStates->keysHeld[key] && !keysStates->keysPressed[key] )
{
keysStates->keysPressed[key] = true;
return true;
}
else if ( !keysStates->keysHeld[key] && keysStates->keysPressed[key] )
{
keysStates->keysPressed[key] = false;
}
return false;
#elif defined(MultiSpacc_Target_NDS) || defined(MultiSpacc_Target_NES)
return ( keysStates->keysPressed & key );
#endif
}
bool MultiSpacc_CheckKeyHold( int key, MultiSpacc_KeysStates *keysStates )
{
#if defined(MultiSpacc_Target_SDLCommon)
return keysStates->keysHeld[key];
#elif defined(MultiSpacc_Target_NDS) || defined(MultiSpacc_Target_NES)
return ( keysStates->keysHeld & key );
#endif
}

View File

@ -5,6 +5,22 @@
extern "C" {
#endif
#if defined(MultiSpacc_Target_SDL12)
#define MultiSpacc_SDLK_ESCAPE SDLK_ESCAPE
#define MultiSpacc_SDLK_TAB SDLK_TAB
#define MultiSpacc_SDLK_UP SDLK_UP
#define MultiSpacc_SDLK_DOWN SDLK_DOWN
#define MultiSpacc_SDLK_LEFT SDLK_LEFT
#define MultiSpacc_SDLK_RIGHT SDLK_RIGHT
#elif defined(MultiSpacc_Target_SDL20)
#define MultiSpacc_SDLK_ESCAPE SDL_SCANCODE_ESCAPE
#define MultiSpacc_SDLK_TAB SDL_SCANCODE_TAB
#define MultiSpacc_SDLK_UP SDL_SCANCODE_UP
#define MultiSpacc_SDLK_DOWN SDL_SCANCODE_DOWN
#define MultiSpacc_SDLK_LEFT SDL_SCANCODE_LEFT
#define MultiSpacc_SDLK_RIGHT SDL_SCANCODE_RIGHT
#endif
#if defined(MultiSpacc_Target_Switch) && defined(MultiSpacc_Target_SDLCommon)
#define JOY_A 0
#define JOY_B 1
@ -45,8 +61,7 @@ extern "C" {
// Pause
#if defined(MultiSpacc_Target_SDLCommon) && (defined(MultiSpacc_Target_PC) || defined(MultiSpacc_Target_Web))
//#define MultiSpacc_Key_Pause SDLK_ESCAPE
#define MultiSpacc_Key_Pause SDL_SCANCODE_ESCAPE
#define MultiSpacc_Key_Pause MultiSpacc_SDLK_ESCAPE
#elif defined(MultiSpacc_Target_SDLCommon) && defined(MultiSpacc_Target_Switch)
#define MultiSpacc_Key_Pause JOY_PLUS
#elif defined(MultiSpacc_Target_NDS)
@ -57,8 +72,7 @@ extern "C" {
// Select
#if defined(MultiSpacc_Target_SDLCommon) && (defined(MultiSpacc_Target_PC) || defined(MultiSpacc_Target_Web))
// #define MultiSpacc_Key_Select SDLK_TAB
#define MultiSpacc_Key_Select SDL_SCANCODE_TAB
#define MultiSpacc_Key_Select MultiSpacc_SDLK_TAB
#elif defined(MultiSpacc_Target_NDS)
#define MultiSpacc_Key_Select KEY_SELECT
#elif defined(MultiSpacc_Target_NES)
@ -67,14 +81,10 @@ extern "C" {
// Directions
#if defined(MultiSpacc_Target_SDLCommon) && (defined(MultiSpacc_Target_PC) || defined(MultiSpacc_Target_Web))
// #define MultiSpacc_Key_Up SDLK_UP
// #define MultiSpacc_Key_Down SDLK_DOWN
// #define MultiSpacc_Key_Left SDLK_LEFT
// #define MultiSpacc_Key_Right SDLK_RIGHT
#define MultiSpacc_Key_Up SDL_SCANCODE_UP
#define MultiSpacc_Key_Down SDL_SCANCODE_DOWN
#define MultiSpacc_Key_Left SDL_SCANCODE_LEFT
#define MultiSpacc_Key_Right SDL_SCANCODE_RIGHT
#define MultiSpacc_Key_Up MultiSpacc_SDLK_UP
#define MultiSpacc_Key_Down MultiSpacc_SDLK_DOWN
#define MultiSpacc_Key_Left MultiSpacc_SDLK_LEFT
#define MultiSpacc_Key_Right MultiSpacc_SDLK_RIGHT
#elif defined(MultiSpacc_Target_NDS)
// ...
#elif defined(MultiSpacc_Target_NES)
@ -91,7 +101,32 @@ extern "C" {
// #define MultiSpacc_Key_Cancel ESC
#endif
bool MultiSpacc_CheckKey( int key, char pad );
// typedef struct MultiSpacc_KeysStates {
// #if defined(MultiSpacc_Target_SDLCommon)
// const Uint8 *keysStates;
// #elif defined(MultiSpacc_Target_NDS)
// int keysStates;
// #elif defined(MultiSpacc_Target_NES)
// char keysStates;
// #endif
// } MultiSpacc_KeysStates;
typedef struct MultiSpacc_KeysStates {
#if defined(MultiSpacc_Target_SDLCommon)
Uint8 *keysPressed;
const Uint8 *keysHeld;
#elif defined(MultiSpacc_Target_NDS)
#elif defined(MultiSpacc_Target_NES)
char keysPressed;
char keysHeld;
#endif
} MultiSpacc_KeysStates;
//void MultiSpacc_PollButtons( char pad, MultiSpacc_KeysStates *buttonsPressed, MultiSpacc_KeysStates *buttonsHeld );
//bool MultiSpacc_CheckButtonState( int button, MultiSpacc_KeysStates *buttonsStates );
void MultiSpacc_PollButtons( char pad, MultiSpacc_KeysStates *keysStates );
bool MultiSpacc_CheckKeyPress( int key, MultiSpacc_KeysStates *keysStates );
bool MultiSpacc_CheckKeyHold( int key, MultiSpacc_KeysStates *keysStates );
#ifdef __cplusplus
}

View File

@ -97,7 +97,7 @@ int MultiSpacc_SetColorKey( MultiSpacc_Surface *Surface, bool Flag, Uint32 Key )
}
#endif
void MultiSpacc_SetSprite( int id, int x, int y, int sprite, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen )
void MultiSpacc_SetSprite( int id, int x, int y, int sprite, MultiSpacc_SpriteFlags *flags, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen )
{
#if defined(MultiSpacc_Target_SDLCommon)
MultiSpacc_Rect offset = { .x = x, .y = y, };
@ -110,7 +110,7 @@ void MultiSpacc_SetSprite( int id, int x, int y, int sprite, MultiSpacc_Surface
SDL_BlitSurface( tiles, &clip, screen, &offset );
#elif defined(MultiSpacc_Target_NES)
oam_spr( x, y, sprite, 0, id*4 );
oam_spr( x, y, sprite, (flags == NULL ? 0 : 0|(flags->flipHorizontal ? OAM_FLIP_H : 0)|(flags->flipVertical ? OAM_FLIP_V : 0)), id*4 );
#endif
}
@ -120,7 +120,7 @@ void MultiSpacc_SetMetaSprite( int id, int x, int y, MultiSpacc_SpritesMap *map,
int i;
for(i=0; i<mapSize; i++)
{
MultiSpacc_SetSprite( (id + i), (x + map->x[i]), (y + map->y[i]), map->chr[i], tiles, screen );
MultiSpacc_SetSprite( (id + i), (x + map->x[i]), (y + map->y[i]), map->chr[i], &map->flags[i], tiles, screen );
}
}
@ -140,7 +140,6 @@ void MultiSpacc_SetTile( int x, int y, int tile, MultiSpacc_Surface *tiles, Mult
SDL_BlitSurface( tiles, &clip, screen, &offset );
#elif defined(MultiSpacc_Target_NES)
// NOTE: is there no alternative to ppu off and on there? it makes the screen flicker and so makes programming more difficult
ppu_off();
vram_adr(NTADR_A( x, y ));
vram_put(tile);
@ -149,6 +148,29 @@ void MultiSpacc_SetTile( int x, int y, int tile, MultiSpacc_Surface *tiles, Mult
#endif
}
void MultiSpacc_SetMetaTile( int x, int y, MultiSpacc_TilesMap *map, int mapSize, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen )
{
int i;
#if defined(MultiSpacc_Target_NES)
ppu_off();
#endif
for(i=0; i<mapSize; i++)
{
#if defined(MultiSpacc_Target_NES)
vram_adr(NTADR_A( (x + map->x[i]), (y + map->y[i]) ));
vram_put( map->chr[i] );
#else
MultiSpacc_SetTile( (x + map->x[i]), (y + map->y[i]), map->chr[i], tiles, screen );
#endif
}
#if defined(MultiSpacc_Target_NES)
ppu_on_all();
#endif
}
void MultiSpacc_BlitLayer( MultiSpacc_Surface *source, MultiSpacc_Surface *destination )
{
#if defined(MultiSpacc_Target_SDLCommon)

View File

@ -107,11 +107,16 @@ typedef struct MultiSpacc_SurfaceConfig {
Uint32 flags;
} MultiSpacc_SurfaceConfig;
typedef struct MultiSpacc_SpriteFlags {
bool flipHorizontal;
bool flipVertical;
} MultiSpacc_SpriteFlags;
typedef struct {
int *chr;
int *x;
int *y;
int *flags;
MultiSpacc_SpriteFlags *flags;
} MultiSpacc_SpritesMap, MultiSpacc_TilesMap;
typedef struct MultiSpacc_MainLoopHandlerArgs {
@ -140,11 +145,11 @@ int MultiSpacc_PollEvent( MultiSpacc_Event *Event );
void MultiSpacc_PrintText( char text[], MultiSpacc_Surface *Surface, MultiSpacc_SurfaceConfig *surfaceConfig, int x, int y, MultiSpacc_Surface *Tiles /*, int FontSize, int Color */ ); // WIP
void MultiSpacc_PrintDebug( const char *format, ... );
void MultiSpacc_SetSprite( int id, int x, int y, int sprite, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen );
void MultiSpacc_SetSprite( int id, int x, int y, int sprite, MultiSpacc_SpriteFlags *flags, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen );
void MultiSpacc_SetMetaSprite( int id, int x, int y, MultiSpacc_SpritesMap *map, int mapSize, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen );
void MultiSpacc_SetTile( int x, int y, int tile, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen );
// void MultiSpacc_SetMetaTile( );
void MultiSpacc_SetMetaTile( int x, int y, MultiSpacc_TilesMap *map, int mapSize, MultiSpacc_Surface *tiles, MultiSpacc_Surface *screen );
MultiSpacc_Surface *MultiSpacc_CreateSurface( MultiSpacc_SurfaceConfig *surfaceConfig );
void MultiSpacc_BlitLayer( MultiSpacc_Surface *source, MultiSpacc_Surface *destination );

View File

@ -26,9 +26,15 @@ MultiSpacc_Window *MultiSpacc_SetWindow( MultiSpacc_SurfaceConfig *windowConfig
{
#if defined(MultiSpacc_Target_SDLCommon)
if( windowConfig->width <= 0 || windowConfig->height <= 0 ){
windowConfig->width = 512;
windowConfig->height = 480;
#if defined(MultiSpacc_Target_Switch)
windowConfig->width = 1280;
windowConfig->height = 720;
#else
windowConfig->width = 512;
windowConfig->height = 480;
#endif
}
if( windowConfig->bits <= 0 ){
windowConfig->bits = 32;
}

View File

@ -9,7 +9,7 @@ mkdir -p /tmp /opt/Sdk
apt update
apt install -y \
make wine curl wget p7zip-full python3 python3-pil \
make wine curl p7zip-full tar xz-utils python3 python3-pil \
gcc mingw-w64 cc65 emscripten \
libsdl1.2-dev libsdl-image1.2-dev libsdl-ttf2.0-dev libsdl-mixer1.2-dev \
libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev \
@ -20,6 +20,19 @@ curl -o /tmp/mingw32.7z https://hlb0.octt.eu.org/Drive/Misc/mingw32-9.2.0.7z.sfx
cp ./mingw32/bin/*.dll ./mingw32/libexec/gcc/mingw32/9.2.0/
mv ./mingw32 /opt/Sdk/mingw32
curl -o /tmp/dkp.sh https://apt.devkitpro.org/install-devkitpro-pacman
yes | bash /tmp/dkp.sh
dkp-pacman -Sy nds-dev
curl -o /tmp/devkitpro.tar.xz https://hlb0.octt.eu.org/Drive/Misc/devkitpro-SDK-Linux-glibc-amd64.tar.xz
tar xf /tmp/devkitpro.tar.xz
mv ./opt/devkitpro /opt/devkitpro
#curl -o /tmp/dkp.sh https://apt.devkitpro.org/install-devkitpro-pacman
#yes | bash /tmp/dkp.sh
#dkp-pacman -Sy nds-dev
cat > .env << [EOF]
export DEVKITPRO=/opt/devkitpro
export DEVKITA64=/opt/devkitpro/devkitA64
export DEVKITARM=/opt/devkitpro/devkitARM
export DEVKITPPC=/opt/devkitpro/devkitPPC
[EOF]
. .env