/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ //Make a Bubble class by using the LK expand method to extend Container. var Bubble = Container.expand(function () { var self = Container.call(this); //Get and automatically addChild to self asset with id 'bubble' with the anchor point set to .5, .5 var bubbleGraphics = self.attachAsset('bubble', { anchorX: 0.5, anchorY: 0.5 }); //Event handler called when a press happens on element. This is automatically called on press if bubble is attached. //Do not call this from the game source code as well. self.down = function (x, y, obj) { // Play pop sound LK.getSound('pop').play(); // Increase score LK.setScore(LK.getScore() + 1); // Remove bubble from array and destroy it bubbles.splice(bubbles.indexOf(self), 1); self.destroy(); }; self.lastX = self.x; self.lastY = self.y; return self; //You must return self if you want other classes to be able to inherit from this class }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 //Init game with black background }); /**** * Game Code ****/ //Storage library which should be used for persistent game data //Minimalistic tween library which should be used for animations over time, including tinting / colouring an object, scaling, rotating, or changing any game object property. //Only include the plugins you need to create the game. //We have access to the following plugins. (Note that the variable names used are mandetory for each plugin) // Initialize assets used in this game. Scale them according to what is needed for the game. // or via static code analysis based on their usage in the code. // Assets are automatically created and loaded either dynamically during gameplay /* Supported Types: 1. Shape: - Simple geometric figures with these properties: * width: (required) pixel width of the shape. * height: (required) pixel height of the shape. * color: (required) color of the shape. * shape: (required) type of shape. Valid options: 'box', 'ellipse'. 2. Image: - Imported images with these properties: * width: (required) pixel resolution width. * height: (required) pixel resolution height. * id: (required) identifier for the image. * flipX: (optional) horizontal flip. Valid values: 0 (no flip), 1 (flip). * flipY: (optional) vertical flip. Valid values: 0 (no flip), 1 (flip). * orientation: (optional) rotation in multiples of 90 degrees, clockwise. Valid values: - 0: No rotation. - 1: Rotate 90 degrees. - 2: Rotate 180 degrees. - 3: Rotate 270 degrees. Note: Width and height remain unchanged upon flipping. 3. Sound: - Sound effects with these properties: * id: (required) identifier for the sound. * volume: (optional) custom volume. Valid values are a float from 0 to 1. 4. Music: - In contract to sound effects, only one music can be played at a time - Music is using the same API to initilize just like sound. - Music loops by default - Music with these config options: * id: (required) identifier for the sound. * volume: (optional) custom volume. Valid values are a float from 0 to 1. * start: (optional) a float from 0 to 1 used for cropping and indicates the start of the cropping * end: (optional) a float from 0 to 1 used for cropping and indicates the end of the cropping */ //Note game dimensions are 2048x2732 // Attach background shape to the game var background = LK.getAsset('background', { anchorX: 0.0, anchorY: 0.0, x: 0, y: 0 }); game.addChild(background); // Create an array to hold all bubbles var bubbles = []; // Function to create bubbles function createBubbles(num) { var rows = Math.ceil(num / 12) + 2; // Calculate number of rows needed and add more rows for (var row = 0; row < rows; row++) { // Loop through each row for (var i = 0; i < 12; i++) { // Create 12 bubbles per row var bubble = new Bubble(); var colors = [0x00bfff, 0xff6347, 0x32cd32, 0xffd700, 0x8a2be2]; // Array of different colors var randomColor = colors[Math.floor(Math.random() * colors.length)]; bubble.children[0].tint = randomColor; // Apply random color to bubble bubble.x = i * 180 + 100; // Increase horizontal spacing for better separation bubble.y = row * 200 + 300; // Increase vertical spacing for better separation bubbles.push(bubble); game.addChild(bubble); } } } // Create initial bubbles createBubbles(30); // Start with 30 bubbles for the first level // Score display var scoreTxt = new Text2('0', { size: 150, fill: 0xFFFFFF }); scoreTxt.setText(LK.getScore()); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Update score display function updateScore() { scoreTxt.setText(LK.getScore()); } // Ask LK engine to update game every game tick game.update = function () { // Check if all bubbles are popped if (bubbles.length === 0) { // Display 'GOOD JOB' message var goodJobTxt = new Text2('GOOD JOB', { size: 200, fill: 0xFFFFFF }); goodJobTxt.anchor.set(0.5, 0.5); goodJobTxt.x = 2048 / 2; goodJobTxt.y = 2732 / 2; game.addChild(goodJobTxt); // Make bubbles disappear for a few seconds bubbles.forEach(function (bubble) { bubble.visible = false; }); // Set a timeout to remove the 'GOOD JOB' message and make bubbles reappear LK.setTimeout(function () { game.removeChild(goodJobTxt); bubbles.forEach(function (bubble) { bubble.visible = true; }); // Advance to next level createBubbles(40); // Start level 2 with 40 bubbles }, 2000); // 2000 milliseconds = 2 seconds } updateScore(); };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
//Make a Bubble class by using the LK expand method to extend Container.
var Bubble = Container.expand(function () {
var self = Container.call(this);
//Get and automatically addChild to self asset with id 'bubble' with the anchor point set to .5, .5
var bubbleGraphics = self.attachAsset('bubble', {
anchorX: 0.5,
anchorY: 0.5
});
//Event handler called when a press happens on element. This is automatically called on press if bubble is attached.
//Do not call this from the game source code as well.
self.down = function (x, y, obj) {
// Play pop sound
LK.getSound('pop').play();
// Increase score
LK.setScore(LK.getScore() + 1);
// Remove bubble from array and destroy it
bubbles.splice(bubbles.indexOf(self), 1);
self.destroy();
};
self.lastX = self.x;
self.lastY = self.y;
return self; //You must return self if you want other classes to be able to inherit from this class
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
//Storage library which should be used for persistent game data
//Minimalistic tween library which should be used for animations over time, including tinting / colouring an object, scaling, rotating, or changing any game object property.
//Only include the plugins you need to create the game.
//We have access to the following plugins. (Note that the variable names used are mandetory for each plugin)
// Initialize assets used in this game. Scale them according to what is needed for the game.
// or via static code analysis based on their usage in the code.
// Assets are automatically created and loaded either dynamically during gameplay
/*
Supported Types:
1. Shape:
- Simple geometric figures with these properties:
* width: (required) pixel width of the shape.
* height: (required) pixel height of the shape.
* color: (required) color of the shape.
* shape: (required) type of shape. Valid options: 'box', 'ellipse'.
2. Image:
- Imported images with these properties:
* width: (required) pixel resolution width.
* height: (required) pixel resolution height.
* id: (required) identifier for the image.
* flipX: (optional) horizontal flip. Valid values: 0 (no flip), 1 (flip).
* flipY: (optional) vertical flip. Valid values: 0 (no flip), 1 (flip).
* orientation: (optional) rotation in multiples of 90 degrees, clockwise. Valid values:
- 0: No rotation.
- 1: Rotate 90 degrees.
- 2: Rotate 180 degrees.
- 3: Rotate 270 degrees.
Note: Width and height remain unchanged upon flipping.
3. Sound:
- Sound effects with these properties:
* id: (required) identifier for the sound.
* volume: (optional) custom volume. Valid values are a float from 0 to 1.
4. Music:
- In contract to sound effects, only one music can be played at a time
- Music is using the same API to initilize just like sound.
- Music loops by default
- Music with these config options:
* id: (required) identifier for the sound.
* volume: (optional) custom volume. Valid values are a float from 0 to 1.
* start: (optional) a float from 0 to 1 used for cropping and indicates the start of the cropping
* end: (optional) a float from 0 to 1 used for cropping and indicates the end of the cropping
*/
//Note game dimensions are 2048x2732
// Attach background shape to the game
var background = LK.getAsset('background', {
anchorX: 0.0,
anchorY: 0.0,
x: 0,
y: 0
});
game.addChild(background);
// Create an array to hold all bubbles
var bubbles = [];
// Function to create bubbles
function createBubbles(num) {
var rows = Math.ceil(num / 12) + 2; // Calculate number of rows needed and add more rows
for (var row = 0; row < rows; row++) {
// Loop through each row
for (var i = 0; i < 12; i++) {
// Create 12 bubbles per row
var bubble = new Bubble();
var colors = [0x00bfff, 0xff6347, 0x32cd32, 0xffd700, 0x8a2be2]; // Array of different colors
var randomColor = colors[Math.floor(Math.random() * colors.length)];
bubble.children[0].tint = randomColor; // Apply random color to bubble
bubble.x = i * 180 + 100; // Increase horizontal spacing for better separation
bubble.y = row * 200 + 300; // Increase vertical spacing for better separation
bubbles.push(bubble);
game.addChild(bubble);
}
}
}
// Create initial bubbles
createBubbles(30); // Start with 30 bubbles for the first level
// Score display
var scoreTxt = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreTxt.setText(LK.getScore());
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Update score display
function updateScore() {
scoreTxt.setText(LK.getScore());
}
// Ask LK engine to update game every game tick
game.update = function () {
// Check if all bubbles are popped
if (bubbles.length === 0) {
// Display 'GOOD JOB' message
var goodJobTxt = new Text2('GOOD JOB', {
size: 200,
fill: 0xFFFFFF
});
goodJobTxt.anchor.set(0.5, 0.5);
goodJobTxt.x = 2048 / 2;
goodJobTxt.y = 2732 / 2;
game.addChild(goodJobTxt);
// Make bubbles disappear for a few seconds
bubbles.forEach(function (bubble) {
bubble.visible = false;
});
// Set a timeout to remove the 'GOOD JOB' message and make bubbles reappear
LK.setTimeout(function () {
game.removeChild(goodJobTxt);
bubbles.forEach(function (bubble) {
bubble.visible = true;
});
// Advance to next level
createBubbles(40); // Start level 2 with 40 bubbles
}, 2000); // 2000 milliseconds = 2 seconds
}
updateScore();
};