Merge pull request #245 from paulcockrell/master

Mario Clock [Enhancement] - Extend info displayed + add Daisy
master
Gordon Williams 2020-04-08 07:56:32 +01:00 committed by GitHub
commit f4d7497d9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 128 additions and 31 deletions

View File

@ -914,7 +914,7 @@
{ "id": "marioclock", { "id": "marioclock",
"name": "Mario Clock", "name": "Mario Clock",
"icon": "marioclock.png", "icon": "marioclock.png",
"version":"0.07", "version":"0.08",
"description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.", "description": "Animated retro Mario clock, with Gameboy style 8-bit grey-scale graphics.",
"tags": "clock,mario,retro", "tags": "clock,mario,retro",
"type": "clock", "type": "clock",

View File

@ -5,3 +5,4 @@
0.05: use 12/24 hour clock from settings 0.05: use 12/24 hour clock from settings
0.06: Performance refactor, and enhanced graphics! 0.06: Performance refactor, and enhanced graphics!
0.07: Swipe right to change between Mario and Toad characters, swipe left to toggle night mode 0.07: Swipe right to change between Mario and Toad characters, swipe left to toggle night mode
0.08: Update date panel to be info panel toggling between Date, Battery and Temperature. Add Princes Daisy.

View File

@ -7,12 +7,13 @@ Enjoy watching Mario, or one of the other game characters run through a level wh
## Features ## Features
* Multiple characters - swipe the screen right to change the character * Multiple characters - swipe the screen right to change the character between `Mario`, `Toad`, and `Daisy`
* Night and Day modes - swipe left to toggle mode * Night and Day modes - swipe left to toggle mode
* Smooth animation * Smooth animation
* Awesome 8-bit style grey-scale graphics * Awesome 8-bit style grey-scale graphics
* Mario jumps to change the time, every minute * Mario jumps to change the time, every minute
* You can make Mario jump by pressing the top button (Button 1) on the watch * You can make Mario jump by pressing the bottom button (Button 3) on the watch
* Toggle the info pannel bettween `Date`, `Battery level`, and `Temperature` by pressing the top button (Button 1).
## Requests ## Requests

View File

@ -27,12 +27,13 @@ const DARKEST = "#122d3e";
const NIGHT = "#001818"; const NIGHT = "#001818";
// Character names // Character names
const DAISY = "daisy";
const TOAD = "toad"; const TOAD = "toad";
const MARIO = "mario"; const MARIO = "mario";
const characterSprite = { const characterSprite = {
frameIdx: 0, frameIdx: 0,
x: 35, x: 33,
y: 55, y: 55,
jumpCounter: 0, jumpCounter: 0,
jumpIncrement: Math.PI / 6, jumpIncrement: Math.PI / 6,
@ -54,10 +55,18 @@ const pyramidSprite = {
}; };
const ONE_SECOND = 1000; const ONE_SECOND = 1000;
const DATE_MODE = "date";
const BATT_MODE = "batt";
const TEMP_MODE = "temp";
let timer = 0; let timer = 0;
let backgroundArr = []; let backgroundArr = [];
let nightMode = false; let nightMode = false;
let infoMode = DATE_MODE;
// Used to stop values flapping when displayed on screen
let lastBatt = 0;
let lastTemp = 0;
function genRanNum(min, max) { function genRanNum(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min); return Math.floor(Math.random() * (max - min + 1) + min);
@ -65,11 +74,18 @@ function genRanNum(min, max) {
function switchCharacter() { function switchCharacter() {
const curChar = characterSprite.character; const curChar = characterSprite.character;
let newChar; let newChar;
if (curChar === MARIO) { switch(curChar) {
newChar = TOAD; case DAISY:
} else {
newChar = MARIO; newChar = MARIO;
break;
case TOAD:
newChar = DAISY;
break;
case MARIO:
default:
newChar = TOAD;
} }
characterSprite.character = newChar; characterSprite.character = newChar;
@ -193,6 +209,19 @@ function drawCoin() {
drawCoinFrame(coinSprite.x, coinSprite.y); drawCoinFrame(coinSprite.x, coinSprite.y);
} }
function drawDaisyFrame(idx, x, y) {
switch(idx) {
case 0:
const dFr1 = require("heatshrink").decompress(atob("h8UxH+AAsHAIgAI60HAIQOJBYIABDpMHAAwNNB4wOJB4gIEHgQBBBxYQCBwYLDDhIaEBxApEw4qDAgIOHDwiIEBwtcFIRWIUgWHw6TIAQXWrlcWZAqBDQIeBBxQaBDxIcCHIQ8JDAIAFWJLPHA=="));
g.drawImage(dFr1, x, y);
break;
case 1:
default:
const dFr2 = require("heatshrink").decompress(atob("h8UxH+AAsHAIgAI60HAIQOJBYIABDpMHAAwNNB4wOJB4gIEHgQBBBxYQCBwYLDDhIaEBxApEw4qDAgIOHDwiIEBwtcFIRWIUgQvBSZACCBwNcWZQcCAAIPIDgYACFw4YBDYIOCD4waEDYI+HaBQ="));
g.drawImage(dFr2, x, y);
}
}
function drawMarioFrame(idx, x, y) { function drawMarioFrame(idx, x, y) {
switch(idx) { switch(idx) {
case 0: case 0:
@ -200,10 +229,9 @@ function drawMarioFrame(idx, x, y) {
g.drawImage(mFr1, x, y); g.drawImage(mFr1, x, y);
break; break;
case 1: case 1:
default:
const mFr2 = require("heatshrink").decompress(atob("h8UxH+AAkHAAYKFBolcAAIPIBgYPDBpgfGFIY7EA4YcEBIPWAAYdDC4gLDAII5ECoYOFDogODFgoJCBwYZCAQYOFBAhAFFwZKGHQpMDw+HCQYEBSowOBBQIdCCgTOIFgiVHFwYCBUhA9FBwz8HAo73GACQA=")); // Mario frame 2 const mFr2 = require("heatshrink").decompress(atob("h8UxH+AAkHAAYKFBolcAAIPIBgYPDBpgfGFIY7EA4YcEBIPWAAYdDC4gLDAII5ECoYOFDogODFgoJCBwYZCAQYOFBAhAFFwZKGHQpMDw+HCQYEBSowOBBQIdCCgTOIFgiVHFwYCBUhA9FBwz8HAo73GACQA=")); // Mario frame 2
g.drawImage(mFr2, x, y); g.drawImage(mFr2, x, y);
break;
default:
} }
} }
@ -214,10 +242,9 @@ function drawToadFrame(idx, x, y) {
g.drawImage(tFr1, x, y); g.drawImage(tFr1, x, y);
break; break;
case 1: case 1:
default:
const tFr2 = require("heatshrink").decompress(atob("iEUxH+ACkHAAoNJrnWAAQRGg/WrgACB4QEBCAYOBB44QFB4QICAg4QBBAQbDEgwPCHpAGCGAQ9KAYQPKCYg/EJAoADAwaKFw4BEP4YQCBIIABB468EB4QADYIoQGDwQOGBYQrDb4wcGFxYLDMoYgHRYgwKABAMBA")); // Mario frame 2 const tFr2 = require("heatshrink").decompress(atob("iEUxH+ACkHAAoNJrnWAAQRGg/WrgACB4QEBCAYOBB44QFB4QICAg4QBBAQbDEgwPCHpAGCGAQ9KAYQPKCYg/EJAoADAwaKFw4BEP4YQCBIIABB468EB4QADYIoQGDwQOGBYQrDb4wcGFxYLDMoYgHRYgwKABAMBA")); // Mario frame 2
g.drawImage(tFr2, x, y); g.drawImage(tFr2, x, y);
break;
default:
} }
} }
@ -251,10 +278,13 @@ function drawCharacter(date, character) {
} }
switch(characterSprite.character) { switch(characterSprite.character) {
case(TOAD): case DAISY:
drawDaisyFrame(characterSprite.frameIdx, characterSprite.x, characterSprite.y);
break;
case TOAD:
drawToadFrame(characterSprite.frameIdx, characterSprite.x, characterSprite.y); drawToadFrame(characterSprite.frameIdx, characterSprite.x, characterSprite.y);
break; break;
case(MARIO): case MARIO:
default: default:
drawMarioFrame(characterSprite.frameIdx, characterSprite.x, characterSprite.y); drawMarioFrame(characterSprite.frameIdx, characterSprite.x, characterSprite.y);
} }
@ -281,13 +311,78 @@ function drawTime(date) {
g.drawString(mins, 47, 29); g.drawString(mins, 47, 29);
} }
function drawDate(date) { function buildDateStr(date) {
g.setFont("6x8");
g.setColor(LIGHTEST);
let dateStr = locale.date(date, true); let dateStr = locale.date(date, true);
dateStr = dateStr.replace(date.getFullYear(), "").trim().replace(/\/$/i,""); dateStr = dateStr.replace(date.getFullYear(), "").trim().replace(/\/$/i,"");
dateStr = locale.dow(date, true) + " " + dateStr; dateStr = locale.dow(date, true) + " " + dateStr;
g.drawString(dateStr, (W - g.stringWidth(dateStr))/2, 1);
return dateStr;
}
function buildBatStr() {
let batt = parseInt(E.getBattery());
const battDiff = Math.abs(lastBatt - batt);
// Suppress flapping values
// Only update batt if it moves greater than +-2
if (battDiff > 2) {
lastBatt = batt;
} else {
batt = lastBatt;
}
const battStr = `Bat: ${batt}%`;
return battStr;
}
function buildTempStr() {
let temp = parseInt(E.getTemperature());
const tempDiff = Math.abs(lastTemp - temp);
// Suppress flapping values
// Only update temp if it moves greater than +-2
if (tempDiff > 2) {
lastTemp = temp;
} else {
temp = lastTemp;
}
const tempStr = `Temp: ${temp}'c`;
return tempStr;
}
function drawInfo(date) {
let str = "";
switch(infoMode) {
case TEMP_MODE:
str = buildTempStr();
break;
case BATT_MODE:
str = buildBatStr();
break;
case DATE_MODE:
default:
str = buildDateStr(date);
}
g.setFont("6x8");
g.setColor(LIGHTEST);
g.drawString(str, (W - g.stringWidth(str))/2, 1);
}
function changeInfoMode() {
switch(infoMode) {
case BATT_MODE:
infoMode = TEMP_MODE;
break;
case TEMP_MODE:
infoMode = DATE_MODE;
break;
case DATE_MODE:
default:
infoMode = BATT_MODE;
}
} }
function redraw() { function redraw() {
@ -302,7 +397,7 @@ function redraw() {
drawPyramid(); drawPyramid();
drawTrees(); drawTrees();
drawTime(date); drawTime(date);
drawDate(date); drawInfo(date);
drawCharacter(date); drawCharacter(date);
drawCoin(); drawCoin();
@ -355,20 +450,20 @@ function init() {
setWatch(() => { setWatch(() => {
if (intervalRef && !characterSprite.isJumping) characterSprite.isJumping = true; if (intervalRef && !characterSprite.isJumping) characterSprite.isJumping = true;
resetDisplayTimeout(); resetDisplayTimeout();
}, BTN1, {repeat:true}); }, BTN3, {repeat: true});
// Close watch and load launcher app
setWatch(() => { setWatch(() => {
Bangle.setLCDMode(); Bangle.setLCDMode();
Bangle.showLauncher(); Bangle.showLauncher();
}, BTN2, {repeat:false,edge:"falling"}); }, BTN2, {repeat: false, edge: "falling"});
Bangle.on('lcdPower', (on) => { // Change info mode
if (on) { setWatch(() => {
startTimers(); changeInfoMode();
} else { }, BTN1, {repeat: true});
clearTimers();
} Bangle.on('lcdPower', (on) => on ? startTimers() : clearTimers());
});
Bangle.on('faceUp', (up) => { Bangle.on('faceUp', (up) => {
if (up && !Bangle.isLCDOn()) { if (up && !Bangle.isLCDOn()) {
@ -382,11 +477,11 @@ function init() {
switch(sDir) { switch(sDir) {
// Swipe right (1) - change character (on a loop) // Swipe right (1) - change character (on a loop)
case(1): case 1:
switchCharacter(); switchCharacter();
break; break;
// Swipe left (-1) - change day/night mode (on a loop) // Swipe left (-1) - change day/night mode (on a loop)
case(-1): case -1:
default: default:
toggleNightMode(); toggleNightMode();
} }