/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BlossomCharacter = Container.expand(function () {
var self = Container.call(this);
// Create body parts
var blossomBody = self.attachAsset('blossom', {
anchorX: 0.5,
anchorY: 0.5
});
var skirt = self.attachAsset('skirt', {
anchorX: 0.5,
anchorY: 0,
y: 200
});
var lei = self.attachAsset('lei', {
anchorX: 0.5,
anchorY: 0.5,
y: -150
});
var tummy = self.attachAsset('tummy', {
anchorX: 0.5,
anchorY: 0.5,
y: 50
});
self.state = 'idle';
self.isAnimating = false;
self.startIdleAnimation = function () {
if (self.isAnimating) return;
self.isAnimating = true;
tween(skirt, {
rotation: 0.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(skirt, {
rotation: -0.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.isAnimating = false;
if (self.state === 'idle') {
self.startIdleAnimation();
}
}
});
}
});
};
self.playTalkAnimation = function () {
self.state = 'talking';
tween.stop(skirt);
tween(blossomBody, {
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(blossomBody, {
scaleY: 1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
self.state = 'idle';
self.isAnimating = false;
self.startIdleAnimation();
}
});
}
});
};
self.playDanceAnimation = function () {
self.state = 'dancing';
tween.stop(skirt);
var danceCount = 0;
function danceCycle() {
if (danceCount < 8) {
tween(skirt, {
rotation: 0.3,
scaleX: 1.2
}, {
duration: 250,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(skirt, {
rotation: -0.3,
scaleX: 0.8
}, {
duration: 250,
easing: tween.easeInOut,
onFinish: function onFinish() {
danceCount++;
danceCycle();
}
});
}
});
} else {
tween(skirt, {
rotation: 0,
scaleX: 1
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.state = 'idle';
self.isAnimating = false;
self.startIdleAnimation();
}
});
}
}
danceCycle();
};
self.down = function (x, y, obj) {
var currentTime = Date.now();
if (!self.lastTapTime) {
self.lastTapTime = currentTime;
self.tapCount = 1;
} else {
var timeDiff = currentTime - self.lastTapTime;
if (timeDiff < 500) {
self.tapCount++;
if (self.tapCount === 2) {
// Double tap - play hula song
self.playDanceAnimation();
LK.getSound('hulaSong').play();
self.createSparkles();
interactions++;
scoreTxt.setText(interactions);
self.tapCount = 0;
}
} else {
self.tapCount = 1;
}
self.lastTapTime = currentTime;
}
// Handle single tap after delay
if (self.tapCount === 1) {
LK.setTimeout(function () {
if (self.tapCount === 1) {
// Single tap - play random saying
var randomSaying = Math.floor(Math.random() * 7) + 1;
LK.getSound('saying' + randomSaying).play();
self.playTalkAnimation();
self.createSparkles();
interactions++;
scoreTxt.setText(interactions);
self.tapCount = 0;
}
}, 500);
}
};
self.createSparkles = function () {
for (var i = 0; i < 3; i++) {
var sparkle = new Sparkle();
sparkle.x = (Math.random() - 0.5) * 200;
sparkle.y = (Math.random() - 0.5) * 200;
self.addChild(sparkle);
sparkle.animate();
}
};
return self;
});
var PalmTree = Container.expand(function () {
var self = Container.call(this);
var trunk = self.attachAsset('palmTree', {
anchorX: 0.5,
anchorY: 1
});
var leaves = self.attachAsset('palmLeaves', {
anchorX: 0.5,
anchorY: 0.5,
y: -350
});
self.animate = function () {
tween(leaves, {
rotation: 0.1
}, {
duration: 2000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(leaves, {
rotation: -0.1
}, {
duration: 2000,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.animate();
}
});
}
});
};
return self;
});
var Sparkle = Container.expand(function () {
var self = Container.call(this);
var sparkleGraphics = self.attachAsset('sparkle', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
self.animate = function () {
tween(sparkleGraphics, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var interactions = 0;
// Create background
var background = game.attachAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Create palm trees
var leftPalmTree = game.addChild(new PalmTree());
leftPalmTree.x = 300;
leftPalmTree.y = 2200;
leftPalmTree.animate();
var rightPalmTree = game.addChild(new PalmTree());
rightPalmTree.x = 1748;
rightPalmTree.y = 2200;
rightPalmTree.animate();
// Create Blossom character
var blossom = game.addChild(new BlossomCharacter());
blossom.x = 1024;
blossom.y = 1366;
blossom.startIdleAnimation();
// Create score display
var scoreTxt = new Text2('Interactions: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Instructions text
var instructionTxt = new Text2('Tap Blossom\'s tummy!\nDouble tap for hula song!', {
size: 60,
fill: 0xFFFFFF
});
instructionTxt.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionTxt);
game.update = function () {
// Game loop - animations are handled by tween system
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BlossomCharacter = Container.expand(function () {
var self = Container.call(this);
// Create body parts
var blossomBody = self.attachAsset('blossom', {
anchorX: 0.5,
anchorY: 0.5
});
var skirt = self.attachAsset('skirt', {
anchorX: 0.5,
anchorY: 0,
y: 200
});
var lei = self.attachAsset('lei', {
anchorX: 0.5,
anchorY: 0.5,
y: -150
});
var tummy = self.attachAsset('tummy', {
anchorX: 0.5,
anchorY: 0.5,
y: 50
});
self.state = 'idle';
self.isAnimating = false;
self.startIdleAnimation = function () {
if (self.isAnimating) return;
self.isAnimating = true;
tween(skirt, {
rotation: 0.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(skirt, {
rotation: -0.1
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.isAnimating = false;
if (self.state === 'idle') {
self.startIdleAnimation();
}
}
});
}
});
};
self.playTalkAnimation = function () {
self.state = 'talking';
tween.stop(skirt);
tween(blossomBody, {
scaleY: 1.1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(blossomBody, {
scaleY: 1
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
self.state = 'idle';
self.isAnimating = false;
self.startIdleAnimation();
}
});
}
});
};
self.playDanceAnimation = function () {
self.state = 'dancing';
tween.stop(skirt);
var danceCount = 0;
function danceCycle() {
if (danceCount < 8) {
tween(skirt, {
rotation: 0.3,
scaleX: 1.2
}, {
duration: 250,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(skirt, {
rotation: -0.3,
scaleX: 0.8
}, {
duration: 250,
easing: tween.easeInOut,
onFinish: function onFinish() {
danceCount++;
danceCycle();
}
});
}
});
} else {
tween(skirt, {
rotation: 0,
scaleX: 1
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.state = 'idle';
self.isAnimating = false;
self.startIdleAnimation();
}
});
}
}
danceCycle();
};
self.down = function (x, y, obj) {
var currentTime = Date.now();
if (!self.lastTapTime) {
self.lastTapTime = currentTime;
self.tapCount = 1;
} else {
var timeDiff = currentTime - self.lastTapTime;
if (timeDiff < 500) {
self.tapCount++;
if (self.tapCount === 2) {
// Double tap - play hula song
self.playDanceAnimation();
LK.getSound('hulaSong').play();
self.createSparkles();
interactions++;
scoreTxt.setText(interactions);
self.tapCount = 0;
}
} else {
self.tapCount = 1;
}
self.lastTapTime = currentTime;
}
// Handle single tap after delay
if (self.tapCount === 1) {
LK.setTimeout(function () {
if (self.tapCount === 1) {
// Single tap - play random saying
var randomSaying = Math.floor(Math.random() * 7) + 1;
LK.getSound('saying' + randomSaying).play();
self.playTalkAnimation();
self.createSparkles();
interactions++;
scoreTxt.setText(interactions);
self.tapCount = 0;
}
}, 500);
}
};
self.createSparkles = function () {
for (var i = 0; i < 3; i++) {
var sparkle = new Sparkle();
sparkle.x = (Math.random() - 0.5) * 200;
sparkle.y = (Math.random() - 0.5) * 200;
self.addChild(sparkle);
sparkle.animate();
}
};
return self;
});
var PalmTree = Container.expand(function () {
var self = Container.call(this);
var trunk = self.attachAsset('palmTree', {
anchorX: 0.5,
anchorY: 1
});
var leaves = self.attachAsset('palmLeaves', {
anchorX: 0.5,
anchorY: 0.5,
y: -350
});
self.animate = function () {
tween(leaves, {
rotation: 0.1
}, {
duration: 2000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(leaves, {
rotation: -0.1
}, {
duration: 2000,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.animate();
}
});
}
});
};
return self;
});
var Sparkle = Container.expand(function () {
var self = Container.call(this);
var sparkleGraphics = self.attachAsset('sparkle', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 1
});
self.animate = function () {
tween(sparkleGraphics, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var interactions = 0;
// Create background
var background = game.attachAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
// Create palm trees
var leftPalmTree = game.addChild(new PalmTree());
leftPalmTree.x = 300;
leftPalmTree.y = 2200;
leftPalmTree.animate();
var rightPalmTree = game.addChild(new PalmTree());
rightPalmTree.x = 1748;
rightPalmTree.y = 2200;
rightPalmTree.animate();
// Create Blossom character
var blossom = game.addChild(new BlossomCharacter());
blossom.x = 1024;
blossom.y = 1366;
blossom.startIdleAnimation();
// Create score display
var scoreTxt = new Text2('Interactions: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Instructions text
var instructionTxt = new Text2('Tap Blossom\'s tummy!\nDouble tap for hula song!', {
size: 60,
fill: 0xFFFFFF
});
instructionTxt.anchor.set(0.5, 1);
LK.gui.bottom.addChild(instructionTxt);
game.update = function () {
// Game loop - animations are handled by tween system
};