Code edit (10 edits merged)
Please save this source code
Code edit (3 edits merged)
Please save this source code
User prompt
bgmusic doesn't really loop
User prompt
Please fix the bug: 'Uncaught TypeError: bgMusic.isPlaying is not a function' in or related to this line: 'if (!bgMusic.isPlaying()) {' Line Number: 553
User prompt
loop the bgmusic sound while the game is playing.
Code edit (3 edits merged)
Please save this source code
User prompt
play the yousound1 when player clicks a good item.
User prompt
play the frogcroak sound when a frog is clicked
User prompt
play the mousesqueek sound when a mouse is clicked
User prompt
play the fishblub sound when a goldfish is clicked
User prompt
play the cakelayerdrop sound when a cakelayer drops
Code edit (1 edits merged)
Please save this source code
/****
* Classes
****/
var BlueberryButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('blueberryButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
// CakeLayer class
var CakeLayer = Container.expand(function () {
var self = Container.call(this);
var layerGraphic = self.attachAsset('cakeLayer', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.startY = self.y;
self.targetY = 0;
self.tweenStartTime = LK.ticks;
self.tweening = false;
self.inPlace = false;
self._move_migrated = function () {
if (!self.tweening && !self.inPlace) {
self.tweening = true;
self.startY = self.y;
self.targetY = game.height - 300 - currentCakeHeight - self.height / 2;
self.tweenStartTime = LK.ticks;
}
var tweenDuration = 60; // Duration of the tween in ticks
var timeElapsed = LK.ticks - self.tweenStartTime;
if (timeElapsed < tweenDuration) {
//self.y = easeOutElastic(timeElapsed, self.startY, self.targetY - self.startY, tweenDuration);
self.y = easeInExpo(timeElapsed, self.startY, self.targetY - self.startY, tweenDuration);
//self.y = easeOutElastic(timeElapsed, self.startY, self.targetY - self.startY, tweenDuration);
} else {
self.y = self.targetY;
self.tweening = false;
self.inPlace = true;
if (!self.shaken && typeof shakeScreen === 'function') {
shakeScreen(300);
self.shaken = true;
showOptions();
}
//currentCakeHeight = currentCakeHeight + self.height;
//console.log('currentCakeHeight is now:' + currentCakeHeight);
}
};
});
// Candle class
var Candle = Container.expand(function () {
var self = Container.call(this);
var candleGraphic = self.attachAsset('candle', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetY = 0;
self.speed = 60;
self.delay = 0;
self.waited = 0;
self._move_migrated = function () {
if (self.waited < self.delay) {
self.waited++;
} else {
if (self.y < self.targetY) {
self.y += self.speed;
} else {
self.y = self.targetY;
}
}
};
});
// Filling class
var Filling = Container.expand(function (type) {
var self = Container.call(this);
var fillingGraphic = self.attachAsset(type === 'good' ? 'goodFilling' : 'badFilling', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
self.speed = 5;
self._move_migrated = function () {
self.y += self.speed;
};
});
var FishButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('fishButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
var FrogButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('frogButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
var MangoButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('mangoButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
var MouseButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('mouseButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
var NutellaButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('nutellaButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
var PineappleButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('pineappleButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
var RaspberryButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('raspberryButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
var StrawberryButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('strawberryButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
// Table class
var Table = Container.expand(function () {
var self = Container.call(this);
var tableGraphic = self.attachAsset('table', {
anchorX: 0.5,
anchorY: 0.5
});
});
// TopDecoration class
var TopDecoration = Container.expand(function () {
var self = Container.call(this);
var decorationGraphic = self.attachAsset('topDecoration', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.startY = self.y;
self.targetY = 0;
self.tweenStartTime = LK.ticks;
self.tweening = false;
self.inPlace = false;
self._move_migrated = function () {
if (!self.tweening && !self.inPlace) {
self.tweening = true;
self.startY = self.y;
self.targetY = game.height - 300 - currentCakeHeight - self.height / 2;
self.tweenStartTime = LK.ticks;
}
var tweenDuration = 60; // Duration of the tween in ticks
var timeElapsed = LK.ticks - self.tweenStartTime;
if (timeElapsed < tweenDuration) {
//self.y = easeOutElastic(timeElapsed, self.startY, self.targetY - self.startY, tweenDuration);
self.y = easeInExpo(timeElapsed, self.startY, self.targetY - self.startY, tweenDuration);
//self.y = easeOutElastic(timeElapsed, self.startY, self.targetY - self.startY, tweenDuration);
} else {
self.y = self.targetY;
self.tweening = false;
self.inPlace = true;
if (!self.shaken && typeof shakeScreen === 'function') {
shakeScreen(300);
self.shaken = true;
//showOptions();
}
//currentCakeHeight = currentCakeHeight + self.height;
//console.log('currentCakeHeight is now:' + currentCakeHeight);
}
};
});
var WhippedCreamButton = Container.expand(function () {
var self = Container.call(this);
var buttonGraphic = self.attachAsset('whippedCreamButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.on('down', function (x, y, obj) {
handleButtons(self);
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb // Init game with sky blue background
});
/****
* Game Code
****/
// add instructions text at start, and require click/tap beofre beginnning.
// TODO:
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
function showOptions() {
goodFill.forEach(function (i) {
i.y = 4000;
});
badFill.forEach(function (i) {
i.y = 4000;
});
var t = [];
for (i = 0; i < 10; i++) {
var g = goodFill[Math.floor(Math.random() * goodFill.length)];
if (!t.includes(g) && t.length < 2) {
t.push(g);
}
}
console.log(t);
var b = badFill[Math.floor(Math.random() * badFill.length)];
t.push(b);
shuffleArray(t);
t[0].x = game.width / 2 - 400;
t[1].x = game.width / 2;
t[2].x = game.width / 2 + 400;
for (var j = 0; j < t.length; j++) {
t[j].y = 2550;
}
}
;
// Add background image
function shakeScreen(intensity, shakes) {
var shakeCount = 0;
var maxShakes = shakes || 10;
var shakeAmount = 10;
var shakeInterval = LK.setInterval(function () {
game.x += Math.random() * shakeAmount / 2 - shakeAmount / 4;
game.y += Math.random() * shakeAmount - shakeAmount / 2;
shakeCount++;
if (shakeCount >= maxShakes) {
LK.clearInterval(shakeInterval);
game.x = 0;
game.y = 0;
}
}, 5);
}
var background = game.addChild(LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5
}));
background.x = game.width / 2;
background.y = game.height / 2;
// Initialize important asset arrays
// Define the assets for the cake layers and fillings
function easeInExpo(t, b, c, d) {
//d *= 15;
return t == 0 ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;
}
function easeOutElastic(t, b, c, d) {
//d *= 15;
var s = 1.70158;
var p = 0;
var a = c;
if (t == 0) {
return b;
}
if ((t /= d) == 1) {
return b + c;
}
if (!p) {
p = d * .3;
}
if (a < Math.abs(c)) {
a = c;
var s = p / 4;
} else {
var s = p / (2 * Math.PI) * Math.asin(c / a);
}
return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
}
var cakeLayers = [];
var fillings = [];
var candles = [];
var currentCakeHeight = 0;
var score = 0;
var stars = []; // Define stars array to track star particles
// Create a draggable cake base
var cakeBase = game.addChild(new CakeLayer());
cakeBase.x = game.width / 2;
cakeBase.y = game.height - cakeBase.height / 2;
// Handle dragging the cake base
var dragNode = null;
game.on('down', function (x, y, obj) {
dragNode = cakeBase;
});
game.on('move', function (x, y, obj) {
if (dragNode) {
var pos = game.toLocal(obj.global);
dragNode.x = pos.x;
}
});
game.on('up', function (x, y, obj) {
dragNode = null;
}); // Create and position the table at the bottom of the screen
var table = game.addChild(new Table());
table.x = game.width / 2 - 35;
table.y = game.height - table.height / 2 + 1320;
table.scale.x = 3;
table.scale.y = 2;
// Add Mango button to the game
var mangoButton = game.addChild(new MangoButton());
mangoButton.x = game.width / 2 + 800;
mangoButton.y = game.height - 800;
var frogButton = game.addChild(new FrogButton());
frogButton.x = game.width / 2 + 400;
frogButton.y = game.height - 150;
var fishButton = game.addChild(new FishButton());
fishButton.x = game.width / 2 + 800;
fishButton.y = game.height - 1000;
var mouseButton = game.addChild(new MouseButton());
mouseButton.x = game.width / 2 - 800;
mouseButton.y = game.height - 800;
var pineappleButton = game.addChild(new PineappleButton());
pineappleButton.x = game.width / 2;
pineappleButton.y = game.height - 150;
var whippedCreamButton = game.addChild(new WhippedCreamButton());
whippedCreamButton.x = game.width / 2 - 400;
whippedCreamButton.y = game.height - 150;
var nutellaButton = game.addChild(new NutellaButton());
nutellaButton.x = game.width / 2 - 800;
nutellaButton.y = game.height - 150;
var blueberryButton = game.addChild(new BlueberryButton());
blueberryButton.x = game.width / 2 + 800;
blueberryButton.y = game.height - 150;
var raspberryButton = game.addChild(new RaspberryButton());
raspberryButton.x = game.width / 2 - 800;
raspberryButton.y = game.height - 150 - 400;
var strawberryButton = game.addChild(new StrawberryButton());
strawberryButton.x = game.width / 2 + 800;
strawberryButton.y = game.height - 150 - 400;
var goodFill = [mangoButton, raspberryButton, nutellaButton, whippedCreamButton, pineappleButton, blueberryButton, strawberryButton];
var badFill = [mouseButton, fishButton, frogButton];
goodFill.forEach(function (i) {
i.bonus = 1;
i.y = 4000;
});
badFill.forEach(function (i) {
i.bonus = -1;
i.y = 4000;
});
function handleButtons(button) {
//button.interactive = false;
//button.zIndex = 1000; //game.children.length - 1;
//button.y = game.height - currentCakeHeight - button.height / 2 - 400;
//button.visible = false;
button.y = 4000;
//LK.setScore(LK.getScore() + button.bonus);
score += button.bonus;
scoreLabel.setText('' + score);
if (button.bonus > 0) {
for (var i = 0; i < 20; i++) {
var star = LK.getAsset('star', {
anchorX: 0.5,
anchorY: 0.5,
x: scoreLabel.x,
y: scoreLabel.y + 300
});
game.addChild(star);
// Adjust initial velocities to make stars explode upwards
star.vx = Math.random() * 32 - 16; // Horizontal velocity
star.vy = -(Math.random() * 8 + 4); // Vertical velocity, initially upwards
star.life = 240; // Extend life to allow for upward movement and fall
star.gravity = 0.2; // Gravity effect on star
star.alpha = 0.75; // Initial alpha for fade out effect
stars.push(star); // Add star to stars array for tracking
}
} else {
LK.effects.flashObject(scoreLabel, 0xff0000, 500);
}
// Add a copy of the clicked button to the latest cake layer
if (cakeLayers.length > 0) {
var latestCakeLayer = cakeLayers[cakeLayers.length - 1];
if (latestCakeLayer.inPlace) {
var buttonCopy = new button.constructor();
buttonCopy.interactive = false;
if (button.bonus > 0) {
buttonCopy.x = latestCakeLayer.x + button.x - 1000;
buttonCopy.y = latestCakeLayer.y - 150;
} else {
buttonCopy.x = button.x;
buttonCopy.y = 2550;
buttonCopy.vx = Math.random() < 0.5 ? 30 : -30;
buttonCopy.vy = -40;
buttonCopy.life = 240;
buttonCopy.gravity = 1;
stars.push(buttonCopy);
}
game.addChild(buttonCopy);
}
}
}
;
function showGameOverMessage() {
console.log('showgameovermessage');
var msgLabel = new Text2('Congratulations!\nYou added ' + score + ' fillings to your cake\nAnd got ' + score + ' candles', {
size: 100,
fill: "#ffffff",
align: "center",
weight: 800,
dropShadow: true,
dropShadowColor: '#000000',
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 5
});
msgLabel.x = game.width / 2;
msgLabel.y = 1200;
msgLabel.anchor.set(0.5, 0);
game.addChild(msgLabel);
}
;
function showNoCandlesMessage() {
console.log('shownocandlesmessage');
var msgLabel = new Text2('You added the wrong fillings to your cake.\nPlease try again for a better result.', {
size: 100,
fill: "#ffffff",
align: "center",
weight: 800,
dropShadow: true,
dropShadowColor: '#000000',
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 5
});
msgLabel.x = game.width / 2;
msgLabel.y = 1200;
msgLabel.anchor.set(0.5, 0);
game.addChild(msgLabel);
}
;
var scoreLabel = new Text2('0', {
size: 200,
fill: "#ffffff",
align: "center",
strokeColor: "#000000",
strokeThickness: 15
});
scoreLabel.x = game.width / 2;
scoreLabel.y = 50;
scoreLabel.anchor.set(0.5, 0);
game.addChild(scoreLabel);
var instLabel = new Text2('Add fillings to each layer of your cake.\nTap to start', {
size: 100,
weight: 600,
fill: "#bbddff",
align: "center",
strokeColor: "#222222",
strokeThickness: 25
});
instLabel.x = game.width / 2;
instLabel.y = 2200;
instLabel.anchor.set(0.5, 0);
game.addChild(instLabel);
var gameStarted = false;
game.on('down', function () {
if (!gameStarted) {
gameStarted = true;
instLabel.destroy();
}
});
// Game tick event
LK.on('tick', function () {
if (gameStarted) {
// Update stars in the game tick function
for (var i = stars.length - 1; i >= 0; i--) {
var star = stars[i];
star.vx *= 0.99; // Apply slight horizontal drag
star.vy += star.gravity; // Apply gravity effect
star.x += star.vx;
star.y += star.vy;
star.alpha -= 1 / star.life; // Fade out effect
star.life--;
if (star.life <= 0) {
star.destroy();
stars.splice(i, 1); // Remove star from array once it's life ends
}
}
// Move cake layers
for (var i = cakeLayers.length - 1; i >= 0; i--) {
cakeLayers[i]._move_migrated();
// Remove off-screen cake layers
/*if (cakeLayers[i].y > game.height + cakeLayers[i].height) {
cakeLayers[i].destroy();
cakeLayers.splice(i, 1);
}*/
}
for (var i = candles.length - 1; i >= 0; i--) {
candles[i]._move_migrated();
}
// Spawn cake layers and fillings
if (LK.ticks % 180 === 0 && currentCakeHeight < 1200) {
var newLayer = new CakeLayer(currentCakeHeight);
newLayer.x = game.width / 2;
newLayer.y = -newLayer.height / 2;
cakeLayers.push(newLayer);
game.addChild(newLayer);
currentCakeHeight += currentCakeHeight == 0 ? 1 : 150;
} else if (LK.ticks % 180 === 0 && currentCakeHeight > 1200 && currentCakeHeight < 1300) {
//remove buttons for fillings
goodFill.forEach(function (i) {
i.y = 4000;
});
badFill.forEach(function (i) {
i.y = 4000;
});
//create the final top layer of the cake
var newLayer = new TopDecoration(currentCakeHeight);
newLayer.x = game.width / 2;
newLayer.y = -newLayer.height / 2;
cakeLayers.push(newLayer);
game.addChild(newLayer);
currentCakeHeight += 150;
if (score > 0) {
// Drop candles in an elliptical pattern on the top decoration layer, after a delay.
var ellipseCenterX = game.width / 2;
var ellipseCenterY = newLayer.y + 1000;
var ellipseRadiusX = newLayer.width / 2.5; // Ellipse width
var ellipseRadiusY = 50; // Ellipse height, smaller for a flatter ellipse
for (var i = 0; i < score; i++) {
var angle = i / score * 2 * Math.PI; // Distribute candles evenly in a circle
var angle = i / score * 2 * Math.PI - 0.1; // Distribute candles evenly in a circle
//var angle = i / score * 2 * Math.PI % Math.PI / 0.2783; // Distribute candles evenly in a circle
var candle = new Candle();
candle.x = ellipseCenterX + ellipseRadiusX * Math.cos(angle);
candle.targetY = ellipseCenterY + ellipseRadiusY * Math.sin(angle) - candle.height / 2; // Adjust for candle height
candle.y = -1000;
candle.delay = 60 + 15 * i;
game.addChild(candle);
candles.push(candle);
}
LK.setTimeout(showGameOverMessage, 60 + 15 * score + 10);
LK.setTimeout(LK.showGameOver, 7060 + 15 * score + 10);
} else {
//no candles
LK.setTimeout(showNoCandlesMessage, 60);
LK.setTimeout(LK.showGameOver, 7060);
}
}
}
});
a dark wooden kitchen table with a serving plate.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A bakery wall with shelves full of cakes, toppings, berries. Rich game illustration style.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A swirl of delicious whipped cream. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A small pile of delicious blueberries. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A few delicious red raspberries, cleaned.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Lush, mature strawberries, cleaned and slices and ready for use in bakery or for decoration.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A little green frog. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A cute little goldfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A golden star.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A pile of pieces of milk chocolate. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.