Square Nose Color

Creations

Juice_Lizard

5 years ago

"A Squarrel for September"

As promised, I have begun to make a port of my last Arduboy game "Square Nose", with all the features allowed by the Meta (colors, full screen, and more...). It is the first time I code on this console (except for my other Arduboy crosscompiled games). It would be great if I manage to finish this game this month, and if I could show it at IndieCade Europe in Paris, even for just an hour. The inspirations for "Square Nose Color" are mainly "Sonic the hedgehog", "Portal" and "Super Meat Boy". The main character is a small animal trapped in a laboratory, who has to eat dry pet food as fast as possible, to avoid being punished by Dr Meggan. It can run and jump, and it must avoid the other animals living in the test chambers. Dr Meggan will record the time that the squarrel spends eating the meaty rings, to find what is the best recipe and to sell millions of dry food boxes to all the pets in the world. All the characters are already printed on stickers avaible for 2 euros the A5 sheet (ask me in PM). T-shirts are on the way.

View full creation

Aurélien Rodot

NEW 5 years ago

I'm the proud owner of a Square Noze Sticker, the character is pretty cute :)

I haven't played it yet, can't wait to give it a try on Gamebuino META!

Juice_Lizard

NEW 5 years ago

Square Nose can jump now. This is the code in four ino files (work in progress):

// SQUARE NOSE COLOR by Juice Lizard on Gamebuino Meta

#include <Gamebuino-Meta.h>

const uint8_t SquareNoseRightData[] = {10, 12, 1, 0, 1, 0x03, 1, 0x33, 0x00,0x00, 0x03,0x33, 0x30,0x04, 0x04,0x00, 0x33,0x00, 0x44,0x44, 0x40,0x00, 0x04,0x40, 0x40,0x40, 0x80,0x04, 0x44,0x44, 0x44,0x00, 0x04,0x44, 0x77,0x40, 0x03,0x00, 0x44,0x44, 0x00,0x33, 0x04,0x44, 0x44,0x40, 0x33,0x00, 0x44,0x44, 0x00,0x33, 0x30,0x40, 0x04,0x00, 0x33,0x30, 0x44,0x04, 0x40,0x33, 0x30,0x00, 0x00,0x00, 0x33};
Image SquareNoseRight = Image(SquareNoseRightData);

const uint8_t SquareNoseRunsRightData[] = {10, 12, 2, 0, 2, 0x03, 1, 0x33, 0x00,0x00, 0x03,0x33, 0x30,0x04, 0x04,0x00, 0x33,0x00, 0x44,0x44, 0x40,0x00, 0x04,0x40, 0x40,0x40, 0x80,0x04, 0x44,0x44, 0x44,0x00, 0x04,0x44, 0x77,0x40, 0x03,0x00, 0x44,0x44, 0x00,0x33, 0x04,0x44, 0x44,0x40, 0x33,0x00, 0x44,0x44, 0x00,0x03, 0x04,0x40, 0x04,0x44, 0x03,0x04, 0x00,0x00, 0x00,0x03, 0x00,0x03, 0x33,0x33, 0x33,0x33, 0x00,0x00, 0x03,0x33, 0x30,0x04, 0x04,0x00, 0x33,0x00, 0x44,0x44, 0x40,0x00, 0x04,0x40, 0x40,0x40, 0x80,0x04, 0x44,0x44, 0x44,0x00, 0x04,0x44, 0x77,0x40, 0x03,0x00, 0x44,0x44, 0x00,0x33, 0x04,0x44, 0x44,0x40, 0x33,0x00, 0x44,0x44, 0x00,0x33, 0x30,0x40, 0x04,0x00, 0x33,0x30, 0x44,0x04, 0x40,0x33, 0x30,0x00, 0x00,0x00, 0x33};
Image SquareNoseRunsRight = Image(SquareNoseRunsRightData);

const uint8_t SquareNoseLeftData[] = {10, 12, 1, 0, 1, 0x03, 1, 0x33, 0x30,0x00, 0x00,0x33, 0x33,0x00, 0x40,0x40, 0x03,0x00, 0x04,0x44, 0x44,0x00, 0x08,0x04, 0x04,0x04, 0x40,0x00, 0x44,0x44, 0x44,0x40, 0x30,0x04, 0x77,0x44, 0x40,0x33, 0x00,0x44, 0x44,0x00, 0x33,0x04, 0x44,0x44, 0x40,0x33, 0x00,0x44, 0x44,0x00, 0x33,0x00, 0x40,0x04, 0x03,0x33, 0x04,0x40, 0x44,0x03, 0x33,0x00, 0x00,0x00, 0x03};
Image SquareNoseLeft = Image(SquareNoseLeftData);

const uint8_t SquareNoseRunsLeftData[] = {10, 12, 2, 0, 2, 0x03, 1, 0x33, 0x30,0x00, 0x00,0x33, 0x33,0x00, 0x40,0x40, 0x03,0x00, 0x04,0x44, 0x44,0x00, 0x08,0x04, 0x04,0x04, 0x40,0x00, 0x44,0x44, 0x44,0x40, 0x30,0x04, 0x77,0x44, 0x40,0x33, 0x00,0x44, 0x44,0x00, 0x33,0x04, 0x44,0x44, 0x40,0x30, 0x00,0x44, 0x44,0x00, 0x30,0x44, 0x40,0x04, 0x40,0x30, 0x00,0x00, 0x00,0x40, 0x33,0x33, 0x33,0x30, 0x00,0x33, 0x30,0x00, 0x00,0x33, 0x33,0x00, 0x40,0x40, 0x03,0x00, 0x04,0x44, 0x44,0x00, 0x08,0x04, 0x04,0x04, 0x40,0x00, 0x44,0x44, 0x44,0x40, 0x30,0x04, 0x77,0x44, 0x40,0x33, 0x00,0x44, 0x44,0x00, 0x33,0x04, 0x44,0x44, 0x40,0x33, 0x00,0x44, 0x44,0x00, 0x33,0x00, 0x40,0x04, 0x03,0x33, 0x04,0x40, 0x44,0x03, 0x33,0x00, 0x00,0x00, 0x03};
Image SquareNoseRunsLeft = Image(SquareNoseRunsLeftData);

const uint8_t SN_ball_clockData[] = {10, 10, 4, 0, 1, 0x0E, 1, 0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0x4f, 0x40,0x0e, 0x00,0x44, 0x44,0xf4, 0x00,0x04, 0x44,0x44, 0x44,0x40, 0x04,0x44, 0x44,0x44, 0x40,0x00, 0x44,0x44, 0x44,0x00, 0xe0,0x04, 0x44,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee,0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0x44, 0x40,0x0e, 0x00,0x44, 0x44,0x44, 0x00,0x04, 0x44,0x44, 0x44,0x40, 0x04,0x44, 0x44,0x4f, 0x40,0x00, 0x44,0x44, 0xf4,0x00, 0xe0,0x04, 0x44,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee,0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0x44, 0x40,0x0e, 0x00,0x44, 0x44,0x44, 0x00,0x04, 0x44,0x44, 0x44,0x40, 0x04,0x44, 0x44,0x44, 0x40,0x00, 0x4f,0x44, 0x44,0x00, 0xe0,0x04, 0xf4,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee,0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0x44, 0x40,0x0e, 0x00,0x4f, 0x44,0x44, 0x00,0x04, 0xf4,0x44, 0x44,0x40, 0x04,0x44, 0x44,0x44, 0x40,0x00, 0x44,0x44, 0x44,0x00, 0xe0,0x04, 0x44,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee};
Image SN_ball_clock = Image(SN_ball_clockData);

const uint8_t SN_ball_counter_clockData[] = {10, 10, 4, 0, 1, 0x0E, 1, 0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0xf4, 0x40,0x0e, 0x00,0x4f, 0x44,0x44, 0x00,0x04, 0x44,0x44, 0x44,0x40, 0x04,0x44, 0x44,0x44, 0x40,0x00, 0x44,0x44, 0x44,0x00, 0xe0,0x04, 0x44,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee,0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0x44, 0x40,0x0e, 0x00,0x44, 0x44,0x44, 0x00,0x04, 0x44,0x44, 0x44,0x40, 0x04,0xf4, 0x44,0x44, 0x40,0x00, 0x4f,0x44, 0x44,0x00, 0xe0,0x04, 0x44,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee,0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0x44, 0x40,0x0e, 0x00,0x44, 0x44,0x44, 0x00,0x04, 0x44,0x44, 0x44,0x40, 0x04,0x44, 0x44,0x44, 0x40,0x00, 0x44,0x44, 0xf4,0x00, 0xe0,0x04, 0x4f,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee,0xee, 0xe0,0x00, 0x0e,0xee, 0xee,0x00, 0x44,0x00, 0xee,0xe0, 0x04,0x44, 0x40,0x0e, 0x00,0x44, 0x44,0xf4, 0x00,0x04, 0x44,0x44, 0x4f,0x40, 0x04,0x44, 0x44,0x44, 0x40,0x00, 0x44,0x44, 0x44,0x00, 0xe0,0x04, 0x44,0x40, 0x0e,0xee, 0x00,0x44, 0x00,0xee, 0xee,0xe0, 0x00,0x0e, 0xee};
Image SN_ball_counter_clock = Image(SN_ball_counter_clockData);


int level = 1;
// timer
int frameCounter = 0;
int seconds = 0;
int minutes = 0;
// Square Nose
int SquareNoseX = 16;
int SquareNoseY = 28;
bool SquareNoseGoesRight = true;
bool SquareNoseIsJumping = false;
int SquareNoseJumpSpeed = 0;
int SquareNoseJumpCounter = 0;

void setup() {
  gb.begin();
}

void loop() {
  while(!gb.update());
  gb.display.clear();

  inputs();
  updates();
  outputs();
}
void inputs() {

// select level if(gb.buttons.pressed(BUTTON_DOWN) && (level < 3)) { level = level + 1; }

if(gb.buttons.pressed(BUTTON_UP) && (level > 1)) { level = level - 1; }

// move Square Nose right and left if((gb.buttons.repeat(BUTTON_RIGHT, 0)) && (SquareNoseX < (gb.display.width() - 10))) { SquareNoseX += 3; SquareNoseGoesRight = true; }

if((gb.buttons.repeat(BUTTON_LEFT, 0)) && (SquareNoseX > 0)) { SquareNoseX -= 3; SquareNoseGoesRight = false; }

// Square Nose jump if((SquareNoseY == 28) && (gb.buttons.pressed(BUTTON_B))) { SquareNoseIsJumping = true; SquareNoseJumpSpeed = -6; gb.sound.playTick(); } if((gb.buttons.released(BUTTON_B)) && (SquareNoseJumpSpeed < 0)) { SquareNoseJumpSpeed /= 2; } }

void updates() {
// timer
  frameCounter += 1;
  if(frameCounter > 24) {
    frameCounter = 0;
    seconds += 1;
  }
  if(seconds > 59) {
    seconds = 0;
    minutes += 1;
  }
  if((seconds == 8) && (minutes == 2)) {
    frameCounter = 0;
    seconds = 0;
    minutes = 0;
    gb.sound.playCancel();
  }

// stop Square Nose when hit a wall if(SquareNoseX < 1) { SquareNoseX = 0; } if(SquareNoseX > 69) { SquareNoseX = 70; }

// Square Nose jump if(SquareNoseIsJumping == true) { SquareNoseY += SquareNoseJumpSpeed; SquareNoseJumpCounter += 1; if((SquareNoseJumpCounter % 2) == 0) { SquareNoseJumpSpeed += 2; } }

// stop falling when hit the ground if(SquareNoseY > 28) { SquareNoseY = 28; SquareNoseIsJumping = false; SquareNoseJumpCounter = 0; } }

void outputs() {
// gray background 80x40 pixels
  gb.display.setColor(GRAY);
  gb.display.fillRect(0, 0, gb.display.width(), gb.display.width()/2);

switch(level) { case 1: for(int row = 0; row < 2; row += 1) { for(int column = 0; column < 4; column += 1) { int brickX = column * 20; int brickY = row * 20; gb.display.setColor(DARKGRAY); gb.display.fillRect(brickX, brickY, 10, 10); gb.display.fillRect(brickX + 10, brickY + 10, 10, 10); } } break;

case 2: for(int row = 0; row < 2; row += 1) { for(int column = 0; column < 8; column += 1) { int brickX = column * 10; int brickY = row * 20; gb.display.setColor(DARKGRAY); gb.display.drawLine(brickX + 9, brickY, brickX +9, brickY + 19); gb.display.drawLine(brickX, brickY, brickX + 9, brickY); gb.display.drawPixel(brickX + 1, brickY + 2); gb.display.drawPixel(brickX + 7, brickY + 2); gb.display.drawPixel(brickX + 7, brickY + 18); gb.display.drawPixel(brickX + 1, brickY + 18); } } break;

case 3: for(int row = 0; row < 4; row += 1) { for(int column = 0; column < 8; column += 1) { int brickX = column * 10; int brickY = row * 10; gb.display.setColor(DARKGRAY); gb.display.fillTriangle(brickX, brickY + 9, brickX + 5, brickY + 5, brickX + 9, brickY + 9); gb.display.drawTriangle(brickX, brickY - 1, brickX + 10, brickY - 1, brickX + 5, brickY + 4); gb.display.drawLine(brickX, brickY, brickX, brickY + 9); } } break; }

// draw Square Nose if(SquareNoseGoesRight == true) { if(SquareNoseIsJumping == true) { gb.display.drawImage(SquareNoseX, SquareNoseY, SN_ball_clock); } else { if(gb.buttons.repeat(BUTTON_RIGHT, 0)) { gb.display.drawImage(SquareNoseX, SquareNoseY, SquareNoseRunsRight); } else { gb.display.drawImage(SquareNoseX, SquareNoseY, SquareNoseRight); } } } else { if(SquareNoseIsJumping == true) { gb.display.drawImage(SquareNoseX, SquareNoseY, SN_ball_counter_clock); } else { if(gb.buttons.repeat(BUTTON_LEFT, 0)) { gb.display.drawImage(SquareNoseX, SquareNoseY, SquareNoseRunsLeft); } else { gb.display.drawImage(SquareNoseX, SquareNoseY, SquareNoseLeft); } } }

// draw timer gb.display.setFontSize(3); if(((minutes == 1) && (seconds == 59)) || (minutes == 2)) { if(frameCounter == 0) { gb.sound.playTick(); } gb.display.setColor(ORANGE); } else { gb.display.setColor(DARKGRAY); } gb.display.setCursor(6,45); gb.display.print(minutes); gb.display.setCursor(18,45); gb.display.print("m"); gb.display.setCursor(30,45); gb.display.print(seconds / 10); gb.display.setCursor(42,45); gb.display.print(seconds % 10); gb.display.setCursor(54,45); gb.display.print("s"); gb.display.setCursor(66,45); gb.display.print((frameCounter / 5) * 2); if(((minutes == 1) && (seconds == 59)) || (minutes == 2)) { gb.display.setColor(RED); } else { gb.display.setColor(GRAY); } gb.display.setCursor(5,44); gb.display.print(minutes); gb.display.setCursor(17,44); gb.display.print("m"); gb.display.setCursor(29,44); gb.display.print(seconds / 10); gb.display.setCursor(41,44); gb.display.print(seconds % 10); gb.display.setCursor(53,44); gb.display.print("s"); gb.display.setCursor(65,44); gb.display.print((frameCounter / 5) * 2); }

jicehel

NEW 5 years ago

Nice. You progress in the port. :) The hardiest was to start. Now, the other things will be easiest and easiest.

STUDIOCRAFTapps

5 years ago

The hardest part of making a game is the start you say? Oh boy.

Juice_Lizard

NEW 5 years ago

Game is now roughly playable, but not finished.

jicehel

NEW 5 years ago

J'ai testé. J'ai ramasser une bonne vingtaine de pièces. Ca le fait. Le jeu est beau. Je trouve même qu'il est plus contrôlable que sur la version portée de l'Arduboy mais c'est peut être juste moi qui m'habitue plus à y jouer.

Bon aller la prochaine fois j'essaye de ramasser plus de pièces ;)

Juice_Lizard

5 years ago

Square Nose doit manger 32 "croquettes" pour valider chaque "test".

Juice_Lizard

NEW 5 years ago

jicehel jicehel

Square Nose doit manger 32 "croquettes" pour valider chaque "test".

jicehel

NEW 5 years ago

Oui, je devrais pouvoir y arriver. Je te dis ça bientôt, mais en tous cas, le portage est sympa.

Juice_Lizard

NEW 5 years ago

Le fichier .bin est mis à jour, le jeu est jouable (même si il n'est pas encore fini). N'hésitez pas à le télécharger à nouveau (et dites moi jusqu'à quel loop vous parvenez héhé!).

Comme Square Nose est inspiré de Sonic, j'en profite pour partager avec vous ces peintures que j'ai réalisées récemment. Elle seront en vente dans l'exposition "Œuvres en liberté" à l'Atrium à Chaville (92) en France. Vernissage le mercredi 19 septembre à 19h00. Puis entrée libre jusqu'au 30 septembre.

"Amy Rose", 40 x 40 cm chacune, acrylique sur papier et encadrement, 2018.

jicehel

NEW 5 years ago

Joli, trop rose pour moi mais joli  ;)


Juice_Lizard

5 years ago

Après, si c'est juste la couleur qui ne correspond pas, il y a toujours moyen de travailler d'après commande (en tout cas avec cette technique là). Je dis ça au cas où, on sait jamais...

jicehel

NEW 5 years ago

Mince j'ai foncé dans la grenouille...

Juice_Lizard

NEW 5 years ago

jicehel jicehel

Après, si c'est juste la couleur qui ne correspond pas, il y a toujours moyen de travailler d'après commande (en tout cas avec cette technique là). Je dis ça au cas où, on sait jamais...

STUDIOCRAFTapps

NEW 5 years ago

jicehel jicehel

The hardest part of making a game is the start you say? Oh boy.

thomasvt

4 years ago

The hardest part of making a game is preventing the start of another game :)

Juice_Lizard

NEW 5 years ago

Avoid contact!

Juice_Lizard

NEW 5 years ago

"Square Nose Color" est presque terminé. J'ai envoyé une candidature pour le présenter à Paris le mois prochain dans un salon du jeu vidéo indépendant. Voici le lien: http://indiecade-europe.eu/programme/showtell Donc je viens d'ajouter le game over quand on dépasse le temps imparti (2 min et 8 secondes, soit 128 secondes). Il me reste à travailler les sons et petites musiques, ajouter une animation quand on termine un niveau (la main du docteur Meggan qui arrive du haut de l'écran et qui attrape Square Nose) et créer une belle animation en plein écran quand on termine le jeu (usine qui produit des croquettes à la chaîne, avec la recette que Square Nose a contribué à sélectionner).

Aurélien Rodot

5 years ago

Super pour Square Nose et belle initiative, n'hésite pas à nous contacter si tu veux des posters et flyers :)

Aurélien Rodot

NEW 5 years ago

Juice_Lizard Juice_Lizard

Super pour Square Nose et belle initiative, n'hésite pas à nous contacter si tu veux des posters et flyers :)