/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var CalendarDoor = Container.expand(function (doorNumber) { var self = Container.call(this); self.doorNumber = doorNumber; self.isOpen = false; // Create door frame var frame = self.attachAsset('doorFrame', { anchorX: 0.5, anchorY: 0.5 }); // Create door var door = self.attachAsset('door', { anchorX: 0.5, anchorY: 0.5 }); // Create door number text var numberText = new Text2(doorNumber.toString(), { size: 60, fill: 0xFFFFFF }); numberText.anchor.set(0.5, 0.5); self.addChild(numberText); // Create hidden character var characterTypes = ['character1', 'character2', 'character3', 'character4', 'character5', 'pango']; var characterType = characterTypes[doorNumber % characterTypes.length]; var character = self.attachAsset(characterType, { anchorX: 0.5, anchorY: 0.5 }); character.alpha = 0; character.visible = false; self.openDoor = function () { if (self.isOpen) return; self.isOpen = true; // Play door open sound LK.getSound('doorOpen').play(); // Animate door opening tween(door, { scaleX: 0, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { door.visible = false; numberText.visible = false; // Show character character.visible = true; character.alpha = 0; character.scaleX = 0.1; character.scaleY = 0.1; // Play reveal sound LK.getSound('reveal').play(); // Animate character reveal tween(character, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 400, easing: tween.bounceOut }); } }); }; self.down = function (x, y, obj) { if (!self.isOpen) { self.openDoor(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0f3460 }); /**** * Game Code ****/ // Create festive background var background = game.attachAsset('calendarBackground', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 }); // Create title var titleText = new Text2("Pango's Advent Calendar", { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.x = 1024; titleText.y = 150; game.addChild(titleText); // Create calendar doors array var doors = []; // Create 31 doors in a grid layout var doorsPerRow = 6; var doorSpacing = 220; var startX = 200; var startY = 400; for (var i = 1; i <= 31; i++) { var door = new CalendarDoor(i); var row = Math.floor((i - 1) / doorsPerRow); var col = (i - 1) % doorsPerRow; door.x = startX + col * doorSpacing; door.y = startY + row * doorSpacing; doors.push(door); game.addChild(door); } // Create Pango character in corner var pangoCharacter = game.attachAsset('pango', { anchorX: 0.5, anchorY: 0.5, x: 1800, y: 300 }); // Add some floating animation to Pango var pangoFloatUp = true; var pangoBaseY = 300; game.update = function () { // Animate Pango floating if (LK.ticks % 60 === 0) { if (pangoFloatUp) { tween(pangoCharacter, { y: pangoBaseY - 20 }, { duration: 1000, easing: tween.easeInOut }); } else { tween(pangoCharacter, { y: pangoBaseY + 20 }, { duration: 1000, easing: tween.easeInOut }); } pangoFloatUp = !pangoFloatUp; } }; // Create instruction text var instructionText = new Text2("Tap doors 1-31 to discover surprises!", { size: 45, fill: 0xFFFF99 }); instructionText.anchor.set(0.5, 0); instructionText.x = 1024; instructionText.y = 250; game.addChild(instructionText);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var CalendarDoor = Container.expand(function (doorNumber) {
var self = Container.call(this);
self.doorNumber = doorNumber;
self.isOpen = false;
// Create door frame
var frame = self.attachAsset('doorFrame', {
anchorX: 0.5,
anchorY: 0.5
});
// Create door
var door = self.attachAsset('door', {
anchorX: 0.5,
anchorY: 0.5
});
// Create door number text
var numberText = new Text2(doorNumber.toString(), {
size: 60,
fill: 0xFFFFFF
});
numberText.anchor.set(0.5, 0.5);
self.addChild(numberText);
// Create hidden character
var characterTypes = ['character1', 'character2', 'character3', 'character4', 'character5', 'pango'];
var characterType = characterTypes[doorNumber % characterTypes.length];
var character = self.attachAsset(characterType, {
anchorX: 0.5,
anchorY: 0.5
});
character.alpha = 0;
character.visible = false;
self.openDoor = function () {
if (self.isOpen) return;
self.isOpen = true;
// Play door open sound
LK.getSound('doorOpen').play();
// Animate door opening
tween(door, {
scaleX: 0,
alpha: 0
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
door.visible = false;
numberText.visible = false;
// Show character
character.visible = true;
character.alpha = 0;
character.scaleX = 0.1;
character.scaleY = 0.1;
// Play reveal sound
LK.getSound('reveal').play();
// Animate character reveal
tween(character, {
alpha: 1,
scaleX: 1,
scaleY: 1
}, {
duration: 400,
easing: tween.bounceOut
});
}
});
};
self.down = function (x, y, obj) {
if (!self.isOpen) {
self.openDoor();
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x0f3460
});
/****
* Game Code
****/
// Create festive background
var background = game.attachAsset('calendarBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
// Create title
var titleText = new Text2("Pango's Advent Calendar", {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.x = 1024;
titleText.y = 150;
game.addChild(titleText);
// Create calendar doors array
var doors = [];
// Create 31 doors in a grid layout
var doorsPerRow = 6;
var doorSpacing = 220;
var startX = 200;
var startY = 400;
for (var i = 1; i <= 31; i++) {
var door = new CalendarDoor(i);
var row = Math.floor((i - 1) / doorsPerRow);
var col = (i - 1) % doorsPerRow;
door.x = startX + col * doorSpacing;
door.y = startY + row * doorSpacing;
doors.push(door);
game.addChild(door);
}
// Create Pango character in corner
var pangoCharacter = game.attachAsset('pango', {
anchorX: 0.5,
anchorY: 0.5,
x: 1800,
y: 300
});
// Add some floating animation to Pango
var pangoFloatUp = true;
var pangoBaseY = 300;
game.update = function () {
// Animate Pango floating
if (LK.ticks % 60 === 0) {
if (pangoFloatUp) {
tween(pangoCharacter, {
y: pangoBaseY - 20
}, {
duration: 1000,
easing: tween.easeInOut
});
} else {
tween(pangoCharacter, {
y: pangoBaseY + 20
}, {
duration: 1000,
easing: tween.easeInOut
});
}
pangoFloatUp = !pangoFloatUp;
}
};
// Create instruction text
var instructionText = new Text2("Tap doors 1-31 to discover surprises!", {
size: 45,
fill: 0xFFFF99
});
instructionText.anchor.set(0.5, 0);
instructionText.x = 1024;
instructionText.y = 250;
game.addChild(instructionText);