diff --git a/CMakeLists.txt b/CMakeLists.txt index d45ef1b..b6ab2cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,15 @@ # Basic parameters; check that these match your project / environment cmake_minimum_required(VERSION 3.8) +# has to be before project +if(PICO_SDK_PATH) + include(${32BLIT_DIR}/32blit-pico/pico_sdk_import.cmake) + include(${32BLIT_DIR}/32blit-pico/pico_extras_import.cmake) +endif() + + project(Super-Square-Bros) -set(PROJECT_SOURCE SuperSquareBros.cpp Audio.cpp) +set(PROJECT_SOURCE SuperSquareBros.cpp) set(PROJECT_DISTRIBS LICENSE README.md) # Build configuration; approach this with caution! @@ -13,9 +20,16 @@ else() endif() find_package (32BLIT CONFIG REQUIRED PATHS ../32blit-sdk) +if(PICO_SDK_PATH) +set(PROJECT_SOURCE ${PROJECT_SOURCE} PicoAudio.cpp) +else() +set(PROJECT_SOURCE ${PROJECT_SOURCE} Audio.cpp) +endif() + blit_executable (${PROJECT_NAME} ${PROJECT_SOURCE}) blit_assets_yaml (${PROJECT_NAME} assets.yml) blit_metadata (${PROJECT_NAME} metadata.yml) +target_compile_definitions(${PROJECT_NAME} PRIVATE ALLOW_HIRES=0) add_custom_target (flash DEPENDS ${PROJECT_NAME}.flash) # setup release packages diff --git a/PicoAudio.cpp b/PicoAudio.cpp new file mode 100644 index 0000000..4b2c8ae --- /dev/null +++ b/PicoAudio.cpp @@ -0,0 +1,40 @@ +#include "PicoAudio.hpp" + +// Todo: rework to pick a free channel rather than always using same one. + +namespace AudioHandler { + AudioHandler::AudioHandler() { } + + void AudioHandler::set_volume(uint32_t volume) { + (void)volume; + } + + void AudioHandler::set_volume(uint8_t channel, uint32_t volume) { + (void)channel; + (void)volume; + } + + void AudioHandler::load(uint8_t channel, const uint8_t mp3_data[], const uint32_t mp3_size) { + (void)channel; + (void *)mp3_data; + (void)mp3_size; + } + + void AudioHandler::load(uint8_t target_channel, uint8_t source_channel) { + (void)target_channel; + (void)source_channel; + } + + void AudioHandler::play(uint8_t channel, uint8_t flags) { + (void)channel; + (void)flags; + } + + bool AudioHandler::is_playing(uint8_t channel) { + (void)channel; + return true; // Make splash wait for button press + } + + void AudioHandler::update() { + } +} \ No newline at end of file diff --git a/PicoAudio.hpp b/PicoAudio.hpp new file mode 100644 index 0000000..8d16614 --- /dev/null +++ b/PicoAudio.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace AudioHandler { + class AudioHandler { + public: + AudioHandler(); + + void set_volume(uint32_t = 0xffff); + void set_volume(uint8_t, uint32_t); + + void load(uint8_t, const uint8_t[], const uint32_t); + void load(uint8_t, uint8_t); + void play(uint8_t, uint8_t = 0); + bool is_playing(uint8_t); + void update(); + }; +} \ No newline at end of file diff --git a/SuperSquareBros.cpp b/SuperSquareBros.cpp index 6c05a5d..92abfe2 100644 --- a/SuperSquareBros.cpp +++ b/SuperSquareBros.cpp @@ -14,7 +14,11 @@ using namespace blit; void init_game(); +#ifdef PICO_BUILD +const uint16_t SCREEN_WIDTH = 120; +#else const uint16_t SCREEN_WIDTH = 160; +#endif const uint16_t SCREEN_HEIGHT = 120; const uint8_t LEVEL_COUNT = 10; @@ -558,7 +562,6 @@ float dt; uint32_t lastTime = 0; Surface* sg_icon_image = Surface::load(asset_scorpion_games); -Surface* background_image = Surface::load(asset_background); AudioHandler::AudioHandler audioHandler; @@ -858,64 +861,41 @@ class ScreenShake { }; ScreenShake shaker(SCREEN_SHAKE_SHAKINESS); -class Colour { -public: - uint8_t r, g, b, a; - - Colour() { - r = g = b = a = 255; - } - - Colour(uint8_t r, uint8_t g, uint8_t b) { - this->r = r; - this->g = g; - this->b = b; - a = 255; - } - - Colour(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { - this->r = r; - this->g = g; - this->b = b; - this->a = a; - } -}; - // Particle colours -const std::vector playerDeathParticleColours[2] = { - { Colour(255, 255, 242), Colour(255, 204, 181), Colour(178, 53, 53) }, - { Colour(255, 255, 242), Colour(178, 214, 96), Colour(37, 124, 73) } +const std::vector playerDeathParticleColours[2] = { + { Pen(255, 255, 242), Pen(255, 204, 181), Pen(178, 53, 53) }, + { Pen(255, 255, 242), Pen(178, 214, 96), Pen(37, 124, 73) } }; -const std::vector enemyDeathParticleColours[5] = { - { Colour(255, 255, 242), Colour(184, 197, 216), Colour(25, 40, 102) }, - { Colour(255, 255, 242), Colour(255, 204, 181), Colour(165, 82, 139) }, - { Colour(255, 255, 242), Colour(255, 204, 181), Colour(229, 114, 57) }, - { Colour(255, 255, 242), Colour(204, 137, 124), Colour(127, 24, 75) }, - { Colour(255, 255, 242), Colour(145, 224, 204), Colour(53, 130, 130) } +const std::vector enemyDeathParticleColours[5] = { + { Pen(255, 255, 242), Pen(184, 197, 216), Pen(25, 40, 102) }, + { Pen(255, 255, 242), Pen(255, 204, 181), Pen(165, 82, 139) }, + { Pen(255, 255, 242), Pen(255, 204, 181), Pen(229, 114, 57) }, + { Pen(255, 255, 242), Pen(204, 137, 124), Pen(127, 24, 75) }, + { Pen(255, 255, 242), Pen(145, 224, 204), Pen(53, 130, 130) } }; -const std::vector bossDeathParticleColours[3] = { - { Colour(255, 255, 242), Colour(184, 197, 216), Colour(25, 40, 102) }, - { Colour(255, 255, 242), Colour(255, 204, 181), Colour(165, 82, 139) }, - { Colour(255, 255, 242), Colour(184, 197, 216), Colour(25, 40, 102) } +const std::vector bossDeathParticleColours[3] = { + { Pen(255, 255, 242), Pen(184, 197, 216), Pen(25, 40, 102) }, + { Pen(255, 255, 242), Pen(255, 204, 181), Pen(165, 82, 139) }, + { Pen(255, 255, 242), Pen(184, 197, 216), Pen(25, 40, 102) } }; -const std::vector levelTriggerParticleColours = { Colour(255, 255, 242), Colour(145, 224, 204), Colour(53, 130, 130) }; +const std::vector levelTriggerParticleColours = { Pen(255, 255, 242), Pen(145, 224, 204), Pen(53, 130, 130) }; -const std::vector checkpointParticleColours[3] = { - { Colour(255, 255, 242), Colour(184, 197, 216) }, - { Colour(178, 53, 53), Colour(127, 24, 75) }, - { Colour(37, 124, 73), Colour(16, 84, 72) } +const std::vector checkpointParticleColours[3] = { + { Pen(255, 255, 242), Pen(184, 197, 216) }, + { Pen(178, 53, 53), Pen(127, 24, 75) }, + { Pen(37, 124, 73), Pen(16, 84, 72) } }; -const std::vector finishParticleColours = { Colour(37, 124, 73), Colour(16, 84, 72), Colour(10, 57, 71) }; +const std::vector finishParticleColours = { Pen(37, 124, 73), Pen(16, 84, 72), Pen(10, 57, 71) }; -const std::vector slowPlayerParticleColours = { Colour(145, 224, 204), Colour(53, 130, 130) };//Colour(255, 255, 242), -const std::vector repelPlayerParticleColours = { Colour(255, 235, 140), Colour(255, 199, 89) }; +const std::vector slowPlayerParticleColours = { Pen(145, 224, 204), Pen(53, 130, 130) };//Pen(255, 255, 242), +const std::vector repelPlayerParticleColours = { Pen(255, 235, 140), Pen(255, 199, 89) }; -const Colour inputSelectColour = Colour(255, 199, 89); -const Colour hudBackground = Colour(7, 0, 14, 64); -const Colour gameBackground = Colour(62, 106, 178); -const Colour defaultWhite = Colour(255, 255, 242); -Colour splashColour = Colour(7, 0, 14, 0); +const Pen inputSelectColour(255, 199, 89); +const Pen hudBackground(7, 0, 14, 64); +const Pen gameBackground(62, 106, 178); +const Pen defaultWhite(255, 255, 242); +Pen splashColour(7, 0, 14, 0); class Camera { public: @@ -989,7 +969,7 @@ class Particle { float x, y; float xVel, yVel; float gravityX, gravityY; - Colour colour; + Pen colour; float age; Particle() { @@ -998,12 +978,12 @@ class Particle { gravityX = 0; gravityY = 0; - colour = Colour(0, 0, 0); + colour = Pen(0, 0, 0); age = 0; } - Particle(float xPosition, float yPosition, float xVelocity, float yVelocity, float particleGravityX, float particleGravityY, Colour particleColour) { + Particle(float xPosition, float yPosition, float xVelocity, float yVelocity, float particleGravityX, float particleGravityY, Pen particleColour) { x = xPosition; y = yPosition; xVel = xVelocity; @@ -1017,7 +997,7 @@ class Particle { } void render(Camera camera) { - screen.pen = Pen(colour.r, colour.g, colour.b, colour.a); + screen.pen = colour; screen.pixel(Point(SCREEN_MID_WIDTH + x - camera.x, SCREEN_MID_HEIGHT + y - camera.y)); } @@ -1083,7 +1063,7 @@ class BrownianParticle : public Particle { speed = 0; } - BrownianParticle(float xPosition, float yPosition, uint16_t angle, float speed, float particleGravityX, float particleGravityY, Colour particleColour, uint8_t angleWiggle) : Particle(xPosition, yPosition, 0, 0, particleGravityX, particleGravityY, particleColour) { + BrownianParticle(float xPosition, float yPosition, uint16_t angle, float speed, float particleGravityX, float particleGravityY, Pen particleColour, uint8_t angleWiggle) : Particle(xPosition, yPosition, 0, 0, particleGravityX, particleGravityY, particleColour) { this->angleWiggle = angleWiggle; this->angle = angle; this->speed = speed; @@ -1107,7 +1087,7 @@ class BrownianParticle : public Particle { -std::vector generate_particles(float x, float y, float gravityX, float gravityY, std::vector colours, float speed, uint8_t count) { +std::vector generate_particles(float x, float y, float gravityX, float gravityY, std::vector colours, float speed, uint8_t count) { std::vector particles; for (uint8_t i = 0; i < count; i++) { @@ -1122,7 +1102,7 @@ std::vector generate_particles(float x, float y, float gravityX, float return particles; } -BrownianParticle generate_brownian_particle(float x, float y, float gravityX, float gravityY, float speed, std::vector colours, uint8_t wiggle) { +BrownianParticle generate_brownian_particle(float x, float y, float gravityX, float gravityY, float speed, std::vector colours, uint8_t wiggle) { uint16_t angle = rand() % 360; return BrownianParticle(x, y, angle, speed, gravityX, gravityY, colours[rand() % colours.size()], wiggle); @@ -1660,7 +1640,7 @@ class LevelTrigger { void render(Camera camera) { if (visible) { - screen.pen = Pen(levelTriggerParticleColours[1].r, levelTriggerParticleColours[1].g, levelTriggerParticleColours[1].b, levelTriggerParticleColours[1].a); + screen.pen = levelTriggerParticleColours[1]; screen.text(std::to_string(levelNumber + 1), minimal_font, Point(SCREEN_MID_WIDTH + x - camera.x + SPRITE_HALF, SCREEN_MID_HEIGHT + y - camera.y - SPRITE_HALF * 3 + textY), true, TextAlign::center_center); //screen.sprite(TILE_ID_LEVEL_TRIGGER, Point(SCREEN_MID_WIDTH + x - camera.x, SCREEN_MID_HEIGHT + y - camera.y)); render_sprite(TILE_ID_LEVEL_TRIGGER, Point(SCREEN_MID_WIDTH + x - camera.x, SCREEN_MID_HEIGHT + y - camera.y)); @@ -1759,6 +1739,7 @@ class Entity { y = foreground[i].y + SPRITE_SIZE; } yVel = 0; + break; } } @@ -1782,6 +1763,7 @@ class Entity { x = foreground[i].x + SPRITE_SIZE - 1; } xVel = 0; + break; } } @@ -1950,6 +1932,11 @@ class Enemy : public Entity { void update(float dt, ButtonStates buttonStates) { if (health > 0) { +#ifdef PICO_BUILD + uint32_t dx = abs(*playerX - x); + if(dx > SCREEN_WIDTH) return; // TODO make this less hacky: Don't update enemies we can't see. Makes level ~7 playable on PicoSystem +#endif + if (reloadTimer) { reloadTimer -= dt; if (reloadTimer < 0) { @@ -3105,6 +3092,7 @@ class Boss : public Enemy { y = foreground[i].y + SPRITE_SIZE; } yVel = 0; + break; } } @@ -3122,6 +3110,7 @@ class Boss : public Enemy { } yVel = 0; } + break; } } } @@ -3141,6 +3130,7 @@ class Boss : public Enemy { x = foreground[i].x + SPRITE_SIZE - 1; } xVel = 0; + break; } } @@ -3974,13 +3964,6 @@ void render_finish() { finish.render(camera); } -void render_background() { - //screen.blit(background_image, Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), Point(0, 0), false); - screen.pen = Pen(gameBackground.r, gameBackground.g, gameBackground.b); - - screen.clear(); -} - void render_level() { render_parallax(parallax); @@ -4025,7 +4008,7 @@ void render_hud() { screen.rectangle(Rect(0, 0, SCREEN_WIDTH, SPRITE_HALF * 2 + 2)); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; // Player health for (uint8_t i = 0; i < PLAYER_MAX_HEALTH; i++) { @@ -4059,13 +4042,13 @@ void render_nearby_level_info() { background_rect(1); - screen.pen = Pen(levelTriggerParticleColours[1].r, levelTriggerParticleColours[1].g, levelTriggerParticleColours[1].b); + screen.pen = levelTriggerParticleColours[1]; // Level number screen.text("Level " + std::to_string(levelTriggers[i].levelNumber + 1), minimal_font, Point(SPRITE_HALF, SCREEN_HEIGHT - 9 - SPRITE_HALF), true, TextAlign::center_left); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; if (allPlayerSaveData[playerSelected].levelReached < levelTriggers[i].levelNumber) { // Level is locked @@ -4545,23 +4528,21 @@ void render_sg_icon() { } void render_input_select() { - render_background(); - background_rect(0); background_rect(1); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Select Input Method", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); - screen.pen = gameSaveData.inputType == InputType::CONTROLLER ? Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b) : Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = gameSaveData.inputType == InputType::CONTROLLER ? inputSelectColour : defaultWhite; screen.text("Controller/32Blit", minimal_font, Point(SCREEN_MID_WIDTH, 50), true, TextAlign::center_center); - screen.pen = gameSaveData.inputType == InputType::KEYBOARD ? Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b) : Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = gameSaveData.inputType == InputType::KEYBOARD ? inputSelectColour : defaultWhite; screen.text("Keyboard", minimal_font, Point(SCREEN_MID_WIDTH, 70), true, TextAlign::center_center); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; if (textFlashTimer < TEXT_FLASH_TIME * 0.6f) { screen.text(messageStrings[0][gameSaveData.inputType], minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_HEIGHT - 9), true, TextAlign::center_center); @@ -4569,8 +4550,6 @@ void render_input_select() { } void render_character_select() { - render_background(); - render_level(); render_entities(); @@ -4591,10 +4570,10 @@ void render_character_select() { screen.pen = Pen(hudBackground.r, hudBackground.g, hudBackground.b, hudBackground.a); screen.rectangle(Rect(0, SCREEN_HEIGHT - (SPRITE_SIZE + 12 + 12), SCREEN_WIDTH, 12)); - screen.pen = Pen(levelTriggerParticleColours[1].r, levelTriggerParticleColours[1].g, levelTriggerParticleColours[1].b); + screen.pen = levelTriggerParticleColours[1]; screen.text("Player " + std::to_string(playerSelected + 1) + " (Save " + std::to_string(playerSelected + 1) + ")", minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_HEIGHT - 10 - 12), true, TextAlign::center_center); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Select Player", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); if (textFlashTimer < TEXT_FLASH_TIME * 0.6f) { @@ -4603,8 +4582,6 @@ void render_character_select() { } void render_menu() { - render_background(); - render_level(); render_entities(); @@ -4613,23 +4590,23 @@ void render_menu() { background_rect(0); background_rect(1); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Super Square Bros.", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); if (menuItem == 0) { - screen.pen = Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b); + screen.pen = inputSelectColour; } screen.text("Play", minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_MID_HEIGHT - 10), true, TextAlign::center_center); if (menuItem == 0) { - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; } else { - screen.pen = Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b); + screen.pen = inputSelectColour; } screen.text("Settings", minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_MID_HEIGHT + 10), true, TextAlign::center_center); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; if (textFlashTimer < TEXT_FLASH_TIME * 0.6f) { screen.text(messageStrings[4][gameSaveData.inputType], minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_HEIGHT - 9), true, TextAlign::center_center); @@ -4637,8 +4614,6 @@ void render_menu() { } void render_settings() { - render_background(); - render_level(); render_entities(); @@ -4653,7 +4628,7 @@ void render_settings() { background_rect(0); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Settings", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); screen.text("Checkpoints:", minimal_font, Point(SPRITE_SIZE, SCREEN_MID_HEIGHT - SPRITE_SIZE * 3), true, TextAlign::center_left); @@ -4662,23 +4637,23 @@ void render_settings() { if (settingsItem == 0) { - screen.pen = Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b); + screen.pen = inputSelectColour; } screen.text(gameSaveData.checkpoints ? "On" : "Off", minimal_font, Point(SCREEN_WIDTH - SPRITE_SIZE * 2, SCREEN_MID_HEIGHT - SPRITE_SIZE * 3), true, TextAlign::center_right); if (settingsItem == 1) { - screen.pen = Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b); + screen.pen = inputSelectColour; } else { - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; } screen.text(gameSaveData.musicVolume ? "On" : "Off", minimal_font, Point(SCREEN_WIDTH - SPRITE_SIZE * 2, SCREEN_MID_HEIGHT - SPRITE_SIZE), true, TextAlign::center_right); if (settingsItem == 2) { - screen.pen = Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b); + screen.pen = inputSelectColour; } else { - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; } screen.text(gameSaveData.sfxVolume ? "On" : "Off", minimal_font, Point(SCREEN_WIDTH - SPRITE_SIZE * 2, SCREEN_MID_HEIGHT + SPRITE_SIZE), true, TextAlign::center_right); @@ -4687,17 +4662,15 @@ void render_settings() { background_rect(1); /*if (textFlashTimer < TEXT_FLASH_TIME * 0.6f) { - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text(messageStrings[4][gameSaveData.inputType], minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_HEIGHT - 9), true, TextAlign::center_center); }*/ - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text(messageStrings[5][gameSaveData.inputType], minimal_font, Point(SPRITE_SIZE * 2, SCREEN_HEIGHT - 9), true, TextAlign::center_left); screen.text(messageStrings[6][gameSaveData.inputType], minimal_font, Point(SCREEN_WIDTH - SPRITE_SIZE * 2, SCREEN_HEIGHT - 9), true, TextAlign::center_right); } void render_level_select() { - render_background(); - render_level(); render_entities(); @@ -4709,15 +4682,13 @@ void render_level_select() { background_rect(0); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Select level", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); render_nearby_level_info(); } void render_game() { - render_background(); - render_level(); if (bosses.size() == 0) { @@ -4749,20 +4720,20 @@ void render_game() { //screen.pen = Pen(hudBackground.r, hudBackground.g, hudBackground.b, hudBackground.a); //screen.text(messageStrings[3][gameSaveData.inputType], minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_HEIGHT - 9), true, TextAlign::center_center); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; display_stats(false); screen.text("Game Paused", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); if (pauseMenuItem == 0) { - screen.pen = Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b); + screen.pen = inputSelectColour; } screen.text("Resume", minimal_font, Point(SCREEN_MID_WIDTH - SPRITE_SIZE * 4, SCREEN_HEIGHT - 9), true, TextAlign::center_center); if (pauseMenuItem == 1) { - screen.pen = Pen(inputSelectColour.r, inputSelectColour.g, inputSelectColour.b); + screen.pen = inputSelectColour; } else { - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; } screen.text("Exit", minimal_font, Point(SCREEN_MID_WIDTH + SPRITE_SIZE * 4, SCREEN_HEIGHT - 9), true, TextAlign::center_center); @@ -4773,13 +4744,13 @@ void render_game() { else if (cameraIntro) { // Level message background_rect(0); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Level " + std::to_string(currentLevelNumber + 1), minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); // Press to skip intro message background_rect(1); if (textFlashTimer < TEXT_FLASH_TIME * 0.6f) { - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text(messageStrings[1][gameSaveData.inputType], minimal_font, Point(SCREEN_MID_WIDTH, SCREEN_HEIGHT - 9), true, TextAlign::center_center); } } @@ -4791,8 +4762,6 @@ void render_game() { void render_game_lost() { - render_background(); - render_level(); if (bosses.size() == 0) { @@ -4811,7 +4780,7 @@ void render_game_lost() { background_rect(0); background_rect(1); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Level failed.", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); @@ -4824,8 +4793,6 @@ void render_game_lost() { void render_game_won() { - render_background(); - render_level(); if (bosses.size() == 0) { @@ -4844,7 +4811,7 @@ void render_game_won() { background_rect(0); background_rect(1); - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; screen.text("Level complete!", minimal_font, Point(SCREEN_MID_WIDTH, 10), true, TextAlign::center_center); @@ -5591,6 +5558,7 @@ void load_audio() { // Set volume to a default audioHandler.set_volume(DEFAULT_VOLUME); // Sfx +#ifndef PICO_BUILD audioHandler.load(0, asset_sound_select, asset_sound_select_length); audioHandler.load(1, asset_sound_jump, asset_sound_jump_length); audioHandler.load(2, asset_sound_coin, asset_sound_coin_length); @@ -5600,6 +5568,7 @@ void load_audio() { audioHandler.load(6, asset_sound_enemythrow, asset_sound_enemythrow_length); // Music audioHandler.load(7, asset_music_splash, asset_music_splash_length); +#endif // Start splash music playing audioHandler.play(7); @@ -5656,13 +5625,13 @@ void init() { // void render(uint32_t time) { // clear the screen -- screen is a reference to the frame buffer and can be used to draw all things with the 32blit - screen.pen = Pen(splashColour.r, splashColour.g, splashColour.b); + screen.pen = gameState == GameState::STATE_SG_ICON ? splashColour : gameBackground; screen.clear(); // draw some text at the top of the screen screen.alpha = 255; screen.mask = nullptr; - screen.pen = Pen(defaultWhite.r, defaultWhite.g, defaultWhite.b); + screen.pen = defaultWhite; if (gameState == GameState::STATE_SG_ICON) { render_sg_icon(); @@ -5695,7 +5664,7 @@ void render(uint32_t time) { render_transition(); if (splashColour.a != 0) { - screen.pen = Pen(splashColour.r, splashColour.g, splashColour.b, splashColour.a); + screen.pen = splashColour; screen.clear(); } } @@ -5856,4 +5825,4 @@ void update(uint32_t time) { camera.y += shaker.time_to_shake(dt); audioHandler.update(); -} \ No newline at end of file +} diff --git a/SuperSquareBros.hpp b/SuperSquareBros.hpp index 6a2aa6a..9761489 100644 --- a/SuperSquareBros.hpp +++ b/SuperSquareBros.hpp @@ -6,4 +6,8 @@ #include "graphics/sprite.hpp" #include "graphics/color.hpp" -#include "Audio.hpp" \ No newline at end of file +#ifdef PICO_BUILD +#include "PicoAudio.hpp" +#else +#include "Audio.hpp" +#endif \ No newline at end of file diff --git a/assets.yml b/assets.yml index 866504c..57a4eaf 100644 --- a/assets.yml +++ b/assets.yml @@ -6,10 +6,7 @@ assets.cpp: assets/spritesheet.png: name: asset_sprites - - assets/background.png: - name: asset_background - + assets/scorpion_games.png: name: asset_scorpion_games