/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Bubble = Container.expand(function () { var self = Container.call(this); var bubbleGraphics = self.attachAsset('bubble', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self.collected = false; // Add a small bobbing motion to the bubble self.bobSpeed = 0.5 + Math.random() * 0.5; self.bobAmount = 10; self.bobOffset = Math.random() * Math.PI * 2; self.startY = 0; self.update = function () { self.x += self.speed; // Bob up and down if (self.startY) { self.y = self.startY + Math.sin(LK.ticks * 0.02 * self.bobSpeed + self.bobOffset) * self.bobAmount; } else { self.startY = self.y; } // Remove when off screen if (self.x < -50) { self.destroy(); var index = game.bubbles.indexOf(self); if (index !== -1) { game.bubbles.splice(index, 1); } } }; self.collect = function () { if (self.collected) { return; } self.collected = true; // Play collect sound LK.getSound('collect').play(); // Add score game.score += 5; scoreTxt.setText(game.score.toString()); // Show visual effect LK.effects.flashObject(self, 0xffffff, 200); // Animate bubble scaling up and fading out tween(self, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.destroy(); var index = game.bubbles.indexOf(self); if (index !== -1) { game.bubbles.splice(index, 1); } } }); }; return self; }); var Coral = Container.expand(function () { var self = Container.call(this); var coralGraphics = self.attachAsset('coral', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self.passed = false; self.update = function () { self.x += self.speed; // Mark as passed for scoring if (!self.passed && self.x < 600) { self.passed = true; if (!game.gameOver) { game.score++; scoreTxt.setText(game.score.toString()); } } // Remove when off screen if (self.x < -100) { self.destroy(); var index = game.obstacles.indexOf(self); if (index !== -1) { game.obstacles.splice(index, 1); } } }; return self; }); var Fish = Container.expand(function () { var self = Container.call(this); var fishGraphics = self.attachAsset('fish', { anchorX: 0.5, anchorY: 0.5 }); self.velocity = 0; self.gravity = 0.5; self.jumpPower = -10; self.rotation = 0; self.isDead = false; self.jump = function () { if (self.isDead) { return; } self.velocity = self.jumpPower; LK.getSound('swim').play(); }; self.update = function () { if (self.isDead) { return; } self.velocity += self.gravity; self.y += self.velocity; // Rotate fish based on velocity var targetRotation = Math.min(Math.max(self.velocity * 0.04, -0.5), 0.5); self.rotation += (targetRotation - self.rotation) * 0.1; fishGraphics.rotation = self.rotation; // Keep fish within bounds if (self.y < 50) { self.y = 50; self.velocity = 0; } if (self.y > 2732 - 50) { self.y = 2732 - 50; self.velocity = 0; self.die(); } }; self.die = function () { if (self.isDead) { return; } self.isDead = true; LK.getSound('hit').play(); LK.effects.flashObject(self, 0xff0000, 500); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x0066aa }); /**** * Game Code ****/ // Create background var background = game.addChild(LK.getAsset('background', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Game variables game.speed = 5; game.score = 0; game.gameOver = false; game.obstacles = []; game.bubbles = []; game.difficulty = 1; game.lastObstacleTime = 0; game.lastBubbleTime = 0; // Create score text var scoreTxt = new Text2('0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); scoreTxt.y = 50; // Create instructions text (disappears after game starts) var instructionsTxt = new Text2('Tap to make the fish swim!', { size: 60, fill: 0xFFFFFF }); instructionsTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(instructionsTxt); // Create fish var fish = new Fish(); fish.x = 400; fish.y = 2732 / 2; game.addChild(fish); // Game has started flag var gameStarted = false; // Function to start game function startGame() { if (gameStarted) { return; } gameStarted = true; instructionsTxt.visible = false; // Start background music LK.playMusic('underwater'); } // Function to spawn a new coral obstacle function spawnObstacle() { // Calculate gap size based on difficulty var gapSize = 500 - game.difficulty * 30; gapSize = Math.max(gapSize, 200); // Minimum gap size // Calculate random position for the gap var gapPosition = 300 + Math.random() * (2732 - 600); // Create top coral var topCoral = new Coral(); topCoral.x = 2200; topCoral.y = gapPosition - gapSize / 2; topCoral.scaleY = (gapPosition - gapSize / 2) / 250; // Scale to reach from top to gap game.addChild(topCoral); game.obstacles.push(topCoral); // Create bottom coral var bottomCoral = new Coral(); bottomCoral.x = 2200; bottomCoral.y = gapPosition + gapSize / 2 + 250; bottomCoral.scaleY = (2732 - (gapPosition + gapSize / 2)) / 250; // Scale to reach from gap to bottom game.addChild(bottomCoral); game.obstacles.push(bottomCoral); // Increase difficulty as game progresses game.difficulty += 0.1; // Increase speed slightly game.speed = Math.min(game.speed + 0.1, 12); // Update all obstacle speeds for (var i = 0; i < game.obstacles.length; i++) { game.obstacles[i].speed = -game.speed; } // Update all bubble speeds for (var i = 0; i < game.bubbles.length; i++) { game.bubbles[i].speed = -game.speed; } } // Function to spawn a bubble function spawnBubble() { var bubble = new Bubble(); bubble.x = 2200; bubble.y = 300 + Math.random() * (2732 - 600); bubble.speed = -game.speed; game.addChild(bubble); game.bubbles.push(bubble); } // Check for collisions function checkCollisions() { if (fish.isDead) { return; } // Check collision with obstacles for (var i = 0; i < game.obstacles.length; i++) { if (fish.intersects(game.obstacles[i])) { fish.die(); gameOver(); return; } } // Check collision with bubbles for (var i = game.bubbles.length - 1; i >= 0; i--) { if (!game.bubbles[i].collected && fish.intersects(game.bubbles[i])) { game.bubbles[i].collect(); } } } // Game over function function gameOver() { game.gameOver = true; // Save high score var highScore = storage.highScore || 0; if (game.score > highScore) { storage.highScore = game.score; } // Show game over screen LK.setTimeout(function () { LK.showGameOver(); }, 1000); } // Handle input game.down = function (x, y, obj) { if (!gameStarted) { startGame(); } fish.jump(); }; // Game update function game.update = function () { if (!gameStarted) { return; } // Spawn obstacles if (LK.ticks - game.lastObstacleTime > 120) { game.lastObstacleTime = LK.ticks; spawnObstacle(); } // Spawn bubbles if (LK.ticks - game.lastBubbleTime > 60) { game.lastBubbleTime = LK.ticks; if (Math.random() < 0.3) { // 30% chance to spawn a bubble spawnBubble(); } } // Check collisions checkCollisions(); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,311 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Bubble = Container.expand(function () {
+ var self = Container.call(this);
+ var bubbleGraphics = self.attachAsset('bubble', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -5;
+ self.collected = false;
+ // Add a small bobbing motion to the bubble
+ self.bobSpeed = 0.5 + Math.random() * 0.5;
+ self.bobAmount = 10;
+ self.bobOffset = Math.random() * Math.PI * 2;
+ self.startY = 0;
+ self.update = function () {
+ self.x += self.speed;
+ // Bob up and down
+ if (self.startY) {
+ self.y = self.startY + Math.sin(LK.ticks * 0.02 * self.bobSpeed + self.bobOffset) * self.bobAmount;
+ } else {
+ self.startY = self.y;
+ }
+ // Remove when off screen
+ if (self.x < -50) {
+ self.destroy();
+ var index = game.bubbles.indexOf(self);
+ if (index !== -1) {
+ game.bubbles.splice(index, 1);
+ }
+ }
+ };
+ self.collect = function () {
+ if (self.collected) {
+ return;
+ }
+ self.collected = true;
+ // Play collect sound
+ LK.getSound('collect').play();
+ // Add score
+ game.score += 5;
+ scoreTxt.setText(game.score.toString());
+ // Show visual effect
+ LK.effects.flashObject(self, 0xffffff, 200);
+ // Animate bubble scaling up and fading out
+ tween(self, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.destroy();
+ var index = game.bubbles.indexOf(self);
+ if (index !== -1) {
+ game.bubbles.splice(index, 1);
+ }
+ }
+ });
+ };
+ return self;
+});
+var Coral = Container.expand(function () {
+ var self = Container.call(this);
+ var coralGraphics = self.attachAsset('coral', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = -5;
+ self.passed = false;
+ self.update = function () {
+ self.x += self.speed;
+ // Mark as passed for scoring
+ if (!self.passed && self.x < 600) {
+ self.passed = true;
+ if (!game.gameOver) {
+ game.score++;
+ scoreTxt.setText(game.score.toString());
+ }
+ }
+ // Remove when off screen
+ if (self.x < -100) {
+ self.destroy();
+ var index = game.obstacles.indexOf(self);
+ if (index !== -1) {
+ game.obstacles.splice(index, 1);
+ }
+ }
+ };
+ return self;
+});
+var Fish = Container.expand(function () {
+ var self = Container.call(this);
+ var fishGraphics = self.attachAsset('fish', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocity = 0;
+ self.gravity = 0.5;
+ self.jumpPower = -10;
+ self.rotation = 0;
+ self.isDead = false;
+ self.jump = function () {
+ if (self.isDead) {
+ return;
+ }
+ self.velocity = self.jumpPower;
+ LK.getSound('swim').play();
+ };
+ self.update = function () {
+ if (self.isDead) {
+ return;
+ }
+ self.velocity += self.gravity;
+ self.y += self.velocity;
+ // Rotate fish based on velocity
+ var targetRotation = Math.min(Math.max(self.velocity * 0.04, -0.5), 0.5);
+ self.rotation += (targetRotation - self.rotation) * 0.1;
+ fishGraphics.rotation = self.rotation;
+ // Keep fish within bounds
+ if (self.y < 50) {
+ self.y = 50;
+ self.velocity = 0;
+ }
+ if (self.y > 2732 - 50) {
+ self.y = 2732 - 50;
+ self.velocity = 0;
+ self.die();
+ }
+ };
+ self.die = function () {
+ if (self.isDead) {
+ return;
+ }
+ self.isDead = true;
+ LK.getSound('hit').play();
+ LK.effects.flashObject(self, 0xff0000, 500);
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x0066aa
+});
+
+/****
+* Game Code
+****/
+// Create background
+var background = game.addChild(LK.getAsset('background', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 0
+}));
+// Game variables
+game.speed = 5;
+game.score = 0;
+game.gameOver = false;
+game.obstacles = [];
+game.bubbles = [];
+game.difficulty = 1;
+game.lastObstacleTime = 0;
+game.lastBubbleTime = 0;
+// Create score text
+var scoreTxt = new Text2('0', {
+ size: 100,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+scoreTxt.y = 50;
+// Create instructions text (disappears after game starts)
+var instructionsTxt = new Text2('Tap to make the fish swim!', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+instructionsTxt.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(instructionsTxt);
+// Create fish
+var fish = new Fish();
+fish.x = 400;
+fish.y = 2732 / 2;
+game.addChild(fish);
+// Game has started flag
+var gameStarted = false;
+// Function to start game
+function startGame() {
+ if (gameStarted) {
+ return;
+ }
+ gameStarted = true;
+ instructionsTxt.visible = false;
+ // Start background music
+ LK.playMusic('underwater');
+}
+// Function to spawn a new coral obstacle
+function spawnObstacle() {
+ // Calculate gap size based on difficulty
+ var gapSize = 500 - game.difficulty * 30;
+ gapSize = Math.max(gapSize, 200); // Minimum gap size
+ // Calculate random position for the gap
+ var gapPosition = 300 + Math.random() * (2732 - 600);
+ // Create top coral
+ var topCoral = new Coral();
+ topCoral.x = 2200;
+ topCoral.y = gapPosition - gapSize / 2;
+ topCoral.scaleY = (gapPosition - gapSize / 2) / 250; // Scale to reach from top to gap
+ game.addChild(topCoral);
+ game.obstacles.push(topCoral);
+ // Create bottom coral
+ var bottomCoral = new Coral();
+ bottomCoral.x = 2200;
+ bottomCoral.y = gapPosition + gapSize / 2 + 250;
+ bottomCoral.scaleY = (2732 - (gapPosition + gapSize / 2)) / 250; // Scale to reach from gap to bottom
+ game.addChild(bottomCoral);
+ game.obstacles.push(bottomCoral);
+ // Increase difficulty as game progresses
+ game.difficulty += 0.1;
+ // Increase speed slightly
+ game.speed = Math.min(game.speed + 0.1, 12);
+ // Update all obstacle speeds
+ for (var i = 0; i < game.obstacles.length; i++) {
+ game.obstacles[i].speed = -game.speed;
+ }
+ // Update all bubble speeds
+ for (var i = 0; i < game.bubbles.length; i++) {
+ game.bubbles[i].speed = -game.speed;
+ }
+}
+// Function to spawn a bubble
+function spawnBubble() {
+ var bubble = new Bubble();
+ bubble.x = 2200;
+ bubble.y = 300 + Math.random() * (2732 - 600);
+ bubble.speed = -game.speed;
+ game.addChild(bubble);
+ game.bubbles.push(bubble);
+}
+// Check for collisions
+function checkCollisions() {
+ if (fish.isDead) {
+ return;
+ }
+ // Check collision with obstacles
+ for (var i = 0; i < game.obstacles.length; i++) {
+ if (fish.intersects(game.obstacles[i])) {
+ fish.die();
+ gameOver();
+ return;
+ }
+ }
+ // Check collision with bubbles
+ for (var i = game.bubbles.length - 1; i >= 0; i--) {
+ if (!game.bubbles[i].collected && fish.intersects(game.bubbles[i])) {
+ game.bubbles[i].collect();
+ }
+ }
+}
+// Game over function
+function gameOver() {
+ game.gameOver = true;
+ // Save high score
+ var highScore = storage.highScore || 0;
+ if (game.score > highScore) {
+ storage.highScore = game.score;
+ }
+ // Show game over screen
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1000);
+}
+// Handle input
+game.down = function (x, y, obj) {
+ if (!gameStarted) {
+ startGame();
+ }
+ fish.jump();
+};
+// Game update function
+game.update = function () {
+ if (!gameStarted) {
+ return;
+ }
+ // Spawn obstacles
+ if (LK.ticks - game.lastObstacleTime > 120) {
+ game.lastObstacleTime = LK.ticks;
+ spawnObstacle();
+ }
+ // Spawn bubbles
+ if (LK.ticks - game.lastBubbleTime > 60) {
+ game.lastBubbleTime = LK.ticks;
+ if (Math.random() < 0.3) {
+ // 30% chance to spawn a bubble
+ spawnBubble();
+ }
+ }
+ // Check collisions
+ checkCollisions();
+};
\ No newline at end of file
A fish. Single Game Texture. In-Game asset. Blank background. High contrast. No shadows
A bubble. Single Game Texture. In-Game asset. No shadows
Blue coral. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Awesome. Cool
Water. Single Game Texture. In-Game asset. 2d. High contrast. No shadows. Water