Square nose color -- By Juice_Lizard

Square Nose Color

Author :  Juice_Lizard

"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.


See more
1 Like
Author :  Aurélien Rodot

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!

1 Like
Author :  Juice_Lizard

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); }

1 Like
Author :  jicehel

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

1 Like
Author :  Juice_Lizard

Game is now roughly playable, but not finished.

1 Like
Author :  jicehel

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 ;)

1 Like
Author :  Juice_Lizard

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

1 Like
Author :  jicehel

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

1 Like
Author :  Juice_Lizard

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.

Author :  jicehel

Joli, trop rose pour moi mais joli  ;)


Author :  jicehel

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

Author :  Juice_Lizard

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...

Author :  STUDIOCRAFTapps

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

Author :  Juice_Lizard

Avoid contact!

Author :  Juice_Lizard

"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).

Author :  Aurélien Rodot

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

Author :  jicehel

PS: Pense à faire une belle affiche/flyer aussi pour le jeu  (au moins en tant qu'image) car Aurélien peut aussi en mettre dans ses diverses manifestations...

Author :  Juice_Lizard

Le petit Square Nose ne peut échapper au docteur Meggan, qui l'attrape vigoureusement comme on attrape le dernier bout de saucisson sur un plateau apéritif. (fichier .bin mis à jour)

Author :  Aurélien Rodot

Noooon impossible de lui échapper !

Author :  Juice_Lizard

MINI GAME JAM  !!!

Take the source code of Square Nose Color, smell it, shake it, warp it as you wish and make a beautiful modification.

Show it here or send it to me by MP. You have two weeks (end of submission: wednesday the 17th of october 2018).

The best* one will win a t-shirt!

Other poeple could by them 20 ‚ā¨ each + shipping cost.

You coud also compete on Arduboy (one t-shirt to win / console) with the black and white version of the game.

* "best" = depending on my personal obscure and unpredictable decision