User prompt
Please fix the bug: 'TypeError: tween.to is not a function. (In 'tween.to(plusText, { y: plusText.y - 100, alpha: 0, duration: 1000, onComplete: function onComplete() { __$(236); plusText.destroy(); } })', 'tween.to' is undefined)' in or related to this line: 'tween.to(plusText, {' Line Number: 432
User prompt
Please fix the bug: 'TypeError: tween.to is not a function. (In 'tween.to(self.scale, { x: 1.2, y: 1.2, duration: 500, repeat: -1, yoyo: true })', 'tween.to' is undefined)' in or related to this line: 'tween.to(self.scale, {' Line Number: 177 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'storage.get is not a function. (In 'storage.get("highScore", 0)', 'storage.get' is undefined)' in or related to this line: 'var highScore = storage.get("highScore", 0);' Line Number: 206 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'storage.getNumber is not a function. (In 'storage.getNumber("highScore", 0)', 'storage.getNumber' is undefined)' in or related to this line: 'var highScore = storage.getNumber("highScore", 0);' Line Number: 206
User prompt
Please fix the bug: 'storage.get is not a function. (In 'storage.get("highScore", 0)', 'storage.get' is undefined)' in or related to this line: 'var highScore = storage.get("highScore", 0);' Line Number: 206 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'storage.getNumber is not a function. (In 'storage.getNumber("highScore", 0)', 'storage.getNumber' is undefined)' in or related to this line: 'var highScore = storage.getNumber("highScore", 0);' Line Number: 206 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Hook up the assets to the game
User prompt
Add assets
User prompt
Flappy Penguin
User prompt
Please continue polishing my design document.
Initial prompt
Pvz
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Fish = Container.expand(function () {
var self = Container.call(this);
// Attach fish asset
var fishGraphics = self.attachAsset('fish', {
anchorX: 0.5,
anchorY: 0.5
});
// Set fish properties
self.speed = 5;
self.collected = false;
// Add some animation
self.bobAmount = 20;
self.bobSpeed = 0.05;
self.startY = 0;
self.bobPhase = Math.random() * Math.PI * 2; // Random starting phase
self.update = function () {
// Move fish to the left
self.x -= self.speed;
// Bob up and down
if (self.startY) {
self.bobPhase += self.bobSpeed;
self.y = self.startY + Math.sin(self.bobPhase) * self.bobAmount;
} else {
self.startY = self.y;
}
};
return self;
});
var Ground = Container.expand(function () {
var self = Container.call(this);
// Attach ground asset
var groundGraphics = self.attachAsset('ground', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
// Game state variables
var Penguin = Container.expand(function () {
var self = Container.call(this);
// Attach penguin asset
var penguinGraphics = self.attachAsset('penguin', {
anchorX: 0.5,
anchorY: 0.5
});
// Physics properties
self.velocity = 0;
self.gravity = 0.5;
self.flapStrength = -10;
self.rotation = 0;
self.isShielded = false;
self.shieldTimer = 0;
// Initialize last positions for collision detection
self.lastY = 0;
self.lastWasColliding = false;
// Create shield visual (initially hidden)
var shield = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
shield.scale.set(2);
self.flap = function () {
self.velocity = self.flapStrength;
LK.getSound('flap').play();
};
self.activateShield = function (duration) {
self.isShielded = true;
self.shieldTimer = duration;
shield.alpha = 0.7;
LK.getSound('powerup').play();
};
self.update = function () {
// Store last position
self.lastY = self.y;
// Apply gravity and update position
self.velocity += self.gravity;
self.y += self.velocity;
// Update rotation based on velocity
var targetRotation = Math.min(Math.max(self.velocity * 0.04, -0.5), 0.5);
self.rotation += (targetRotation - self.rotation) * 0.1;
penguinGraphics.rotation = self.rotation;
// Update shield timer
if (self.isShielded) {
self.shieldTimer--;
if (self.shieldTimer <= 0) {
self.isShielded = false;
shield.alpha = 0;
}
}
};
// Collision check method
self.checkCollision = function (object) {
return self.intersects(object);
};
return self;
});
var Pillar = Container.expand(function () {
var self = Container.call(this);
// Create top and bottom pillars
var topPillar = self.attachAsset('pillarTop', {
anchorX: 0.5,
anchorY: 1.0
});
var bottomPillar = self.attachAsset('pillarBottom', {
anchorX: 0.5,
anchorY: 0.0
});
// Set pillar properties
self.speed = 5;
self.passed = false;
self.gap = 550; // Gap between pillars
// Position the pillars
self.setGapPosition = function (yPosition) {
topPillar.y = yPosition - self.gap / 2;
bottomPillar.y = yPosition + self.gap / 2;
};
self.update = function () {
// Move pillar to the left
self.x -= self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
// Initialize with default type
self.type = "shield";
self.speed = 5;
self.collected = false;
// Method to set the power-up type
self.setType = function (type) {
self.type = type;
// Remove existing graphic if any
while (self.children.length > 0) {
self.removeChild(self.children[0]);
}
// Add new graphic based on type
var assetId;
if (type === "shield") {
assetId = 'shield';
} else if (type === "slowMotion") {
assetId = 'slowMotion';
} else if (type === "magnet") {
assetId = 'magnet';
}
self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// Add pulsing animation
tween.to(self.scale, {
x: 1.2,
y: 1.2,
duration: 500,
repeat: -1,
yoyo: true
});
};
self.update = function () {
// Move power-up to the left
self.x -= self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game state variables
var gameStarted = false;
var gameOver = false;
var score = 0;
var highScore = storage.getNumber("highScore", 0);
// Game speed (for slow motion power-up)
var gameSpeed = 1;
var normalSpeed = 1;
var slowMotionSpeed = 0.6;
var slowMotionTimer = 0;
// Game object arrays
var pillars = [];
var fishes = [];
var powerUps = [];
// Magnet power-up variables
var magnetActive = false;
var magnetTimer = 0;
var magnetRange = 300;
// Set up the game background
game.setBackgroundColor(0x87CEEB); // Sky blue background
// Create the penguin
var penguin = new Penguin();
penguin.x = 400;
penguin.y = 1366;
game.addChild(penguin);
// Create the ground
var ground = new Ground();
ground.x = 1024;
ground.y = 2650;
game.addChild(ground);
// Spawn timers
var pillarSpawnTimer = 0;
var pillarSpawnInterval = 120; // 2 seconds at 60 FPS
var fishSpawnTimer = 0;
var powerUpSpawnTimer = 0;
// Create score text
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create tap to start text
var startTxt = new Text2('TAP TO FLAP', {
size: 80,
fill: 0xFFFFFF
});
startTxt.anchor.set(0.5, 0.5);
startTxt.y = 200;
LK.gui.center.addChild(startTxt);
// Start the background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.5,
duration: 1000
}
});
// Handle game input events
game.down = function (x, y, obj) {
if (!gameOver) {
if (!gameStarted) {
gameStarted = true;
startTxt.visible = false;
}
penguin.flap();
}
};
// Spawn a new pillar
function spawnPillar() {
var pillar = new Pillar();
pillar.x = 2300; // Just off-screen to the right
// Random y position for the gap
var minY = 900;
var maxY = 2000;
var gapY = minY + Math.random() * (maxY - minY);
pillar.setGapPosition(gapY);
pillars.push(pillar);
game.addChild(pillar);
}
// Spawn a fish
function spawnFish() {
var fish = new Fish();
fish.x = 2300; // Just off-screen to the right
fish.y = 900 + Math.random() * 1000; // Random height
fishes.push(fish);
game.addChild(fish);
}
// Spawn a power-up
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = 2300; // Just off-screen to the right
powerUp.y = 900 + Math.random() * 1000; // Random height
// Random power-up type
var types = ["shield", "slowMotion", "magnet"];
var type = types[Math.floor(Math.random() * types.length)];
powerUp.setType(type);
powerUps.push(powerUp);
game.addChild(powerUp);
}
// Apply power-up effect
function applyPowerUp(type) {
if (type === "shield") {
penguin.activateShield(300); // 5 seconds at 60 FPS
} else if (type === "slowMotion") {
gameSpeed = slowMotionSpeed;
slowMotionTimer = 300; // 5 seconds at 60 FPS
LK.getSound('powerup').play();
} else if (type === "magnet") {
magnetActive = true;
magnetTimer = 300; // 5 seconds at 60 FPS
LK.getSound('powerup').play();
}
}
// Main game update loop
game.update = function () {
if (!gameStarted) return;
// Update game speed (slow motion power-up)
if (slowMotionTimer > 0) {
slowMotionTimer--;
if (slowMotionTimer <= 0) {
gameSpeed = normalSpeed;
}
}
// Update magnet power-up
if (magnetActive) {
magnetTimer--;
if (magnetTimer <= 0) {
magnetActive = false;
}
}
// Update penguin
penguin.update();
// Check if penguin hits the ground
if (!gameOver && penguin.y > 2600) {
endGame();
}
// Check if penguin hits the ceiling
if (!gameOver && penguin.y < 100) {
penguin.y = 100;
penguin.velocity = 0;
}
// Spawn pillars
pillarSpawnTimer++;
if (pillarSpawnTimer >= pillarSpawnInterval * gameSpeed) {
spawnPillar();
pillarSpawnTimer = 0;
}
// Spawn fishes
fishSpawnTimer++;
if (fishSpawnTimer >= 240 * gameSpeed) {
// 4 seconds
spawnFish();
fishSpawnTimer = 0;
}
// Spawn power-ups (less frequently)
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 600 * gameSpeed) {
// 10 seconds
spawnPowerUp();
powerUpSpawnTimer = 0;
}
// Update pillars
for (var i = pillars.length - 1; i >= 0; i--) {
var pillar = pillars[i];
pillar.speed = 5 * gameSpeed;
pillar.update();
// Check for collisions if not game over and not shielded
if (!gameOver && !penguin.isShielded) {
// Check collision with top pillar
if (penguin.checkCollision(pillar.children[0])) {
endGame();
break;
}
// Check collision with bottom pillar
if (penguin.checkCollision(pillar.children[1])) {
endGame();
break;
}
}
// Check if penguin passed the pillar
if (!pillar.passed && pillar.x < penguin.x) {
score++;
scoreTxt.setText(score.toString());
pillar.passed = true;
}
// Remove pillars that are off-screen
if (pillar.x < -200) {
pillar.destroy();
pillars.splice(i, 1);
}
}
// Update fishes
for (var j = fishes.length - 1; j >= 0; j--) {
var fish = fishes[j];
fish.speed = 5 * gameSpeed;
fish.update();
// Apply magnet effect if active
if (magnetActive) {
var dx = penguin.x - fish.x;
var dy = penguin.y - fish.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < magnetRange) {
// Move fish toward penguin
fish.x += dx * 0.1;
fish.y += dy * 0.1;
}
}
// Check if penguin collected the fish
if (!fish.collected && penguin.checkCollision(fish)) {
fish.collected = true;
fish.alpha = 0;
// Award points
score += 3;
scoreTxt.setText(score.toString());
// Play collect sound
LK.getSound('collect').play();
// Show a +3 text effect
var plusText = new Text2('+3', {
size: 60,
fill: 0xFFFF00
});
plusText.x = fish.x;
plusText.y = fish.y;
plusText.anchor.set(0.5, 0.5);
game.addChild(plusText);
// Animate and remove the text
tween.to(plusText, {
y: plusText.y - 100,
alpha: 0,
duration: 1000,
onComplete: function onComplete() {
plusText.destroy();
}
});
}
// Remove fishes that are off-screen
if (fish.x < -100) {
fish.destroy();
fishes.splice(j, 1);
}
}
// Update power-ups
for (var k = powerUps.length - 1; k >= 0; k--) {
var powerUp = powerUps[k];
powerUp.speed = 5 * gameSpeed;
powerUp.update();
// Check if penguin collected the power-up
if (!powerUp.collected && penguin.checkCollision(powerUp)) {
powerUp.collected = true;
powerUp.alpha = 0;
// Apply the power-up effect
applyPowerUp(powerUp.type);
}
// Remove power-ups that are off-screen
if (powerUp.x < -100) {
powerUp.destroy();
powerUps.splice(k, 1);
}
}
};
// End the game
function endGame() {
if (gameOver) return;
gameOver = true;
LK.getSound('crash').play();
// Flash the screen
LK.effects.flashScreen(0xFF0000, 500);
// Update high score
if (score > highScore) {
highScore = score;
storage.set("highScore", highScore);
}
// Show game over screen
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
} ===================================================================
--- original.js
+++ change.js
@@ -4,9 +4,459 @@
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
+* Classes
+****/
+var Fish = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach fish asset
+ var fishGraphics = self.attachAsset('fish', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Set fish properties
+ self.speed = 5;
+ self.collected = false;
+ // Add some animation
+ self.bobAmount = 20;
+ self.bobSpeed = 0.05;
+ self.startY = 0;
+ self.bobPhase = Math.random() * Math.PI * 2; // Random starting phase
+ self.update = function () {
+ // Move fish to the left
+ self.x -= self.speed;
+ // Bob up and down
+ if (self.startY) {
+ self.bobPhase += self.bobSpeed;
+ self.y = self.startY + Math.sin(self.bobPhase) * self.bobAmount;
+ } else {
+ self.startY = self.y;
+ }
+ };
+ return self;
+});
+var Ground = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach ground asset
+ var groundGraphics = self.attachAsset('ground', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ return self;
+});
+// Game state variables
+var Penguin = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach penguin asset
+ var penguinGraphics = self.attachAsset('penguin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Physics properties
+ self.velocity = 0;
+ self.gravity = 0.5;
+ self.flapStrength = -10;
+ self.rotation = 0;
+ self.isShielded = false;
+ self.shieldTimer = 0;
+ // Initialize last positions for collision detection
+ self.lastY = 0;
+ self.lastWasColliding = false;
+ // Create shield visual (initially hidden)
+ var shield = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ shield.scale.set(2);
+ self.flap = function () {
+ self.velocity = self.flapStrength;
+ LK.getSound('flap').play();
+ };
+ self.activateShield = function (duration) {
+ self.isShielded = true;
+ self.shieldTimer = duration;
+ shield.alpha = 0.7;
+ LK.getSound('powerup').play();
+ };
+ self.update = function () {
+ // Store last position
+ self.lastY = self.y;
+ // Apply gravity and update position
+ self.velocity += self.gravity;
+ self.y += self.velocity;
+ // Update rotation based on velocity
+ var targetRotation = Math.min(Math.max(self.velocity * 0.04, -0.5), 0.5);
+ self.rotation += (targetRotation - self.rotation) * 0.1;
+ penguinGraphics.rotation = self.rotation;
+ // Update shield timer
+ if (self.isShielded) {
+ self.shieldTimer--;
+ if (self.shieldTimer <= 0) {
+ self.isShielded = false;
+ shield.alpha = 0;
+ }
+ }
+ };
+ // Collision check method
+ self.checkCollision = function (object) {
+ return self.intersects(object);
+ };
+ return self;
+});
+var Pillar = Container.expand(function () {
+ var self = Container.call(this);
+ // Create top and bottom pillars
+ var topPillar = self.attachAsset('pillarTop', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ var bottomPillar = self.attachAsset('pillarBottom', {
+ anchorX: 0.5,
+ anchorY: 0.0
+ });
+ // Set pillar properties
+ self.speed = 5;
+ self.passed = false;
+ self.gap = 550; // Gap between pillars
+ // Position the pillars
+ self.setGapPosition = function (yPosition) {
+ topPillar.y = yPosition - self.gap / 2;
+ bottomPillar.y = yPosition + self.gap / 2;
+ };
+ self.update = function () {
+ // Move pillar to the left
+ self.x -= self.speed;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ // Initialize with default type
+ self.type = "shield";
+ self.speed = 5;
+ self.collected = false;
+ // Method to set the power-up type
+ self.setType = function (type) {
+ self.type = type;
+ // Remove existing graphic if any
+ while (self.children.length > 0) {
+ self.removeChild(self.children[0]);
+ }
+ // Add new graphic based on type
+ var assetId;
+ if (type === "shield") {
+ assetId = 'shield';
+ } else if (type === "slowMotion") {
+ assetId = 'slowMotion';
+ } else if (type === "magnet") {
+ assetId = 'magnet';
+ }
+ self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Add pulsing animation
+ tween.to(self.scale, {
+ x: 1.2,
+ y: 1.2,
+ duration: 500,
+ repeat: -1,
+ yoyo: true
+ });
+ };
+ self.update = function () {
+ // Move power-up to the left
+ self.x -= self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
-});
\ No newline at end of file
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var gameStarted = false;
+var gameOver = false;
+var score = 0;
+var highScore = storage.getNumber("highScore", 0);
+// Game speed (for slow motion power-up)
+var gameSpeed = 1;
+var normalSpeed = 1;
+var slowMotionSpeed = 0.6;
+var slowMotionTimer = 0;
+// Game object arrays
+var pillars = [];
+var fishes = [];
+var powerUps = [];
+// Magnet power-up variables
+var magnetActive = false;
+var magnetTimer = 0;
+var magnetRange = 300;
+// Set up the game background
+game.setBackgroundColor(0x87CEEB); // Sky blue background
+// Create the penguin
+var penguin = new Penguin();
+penguin.x = 400;
+penguin.y = 1366;
+game.addChild(penguin);
+// Create the ground
+var ground = new Ground();
+ground.x = 1024;
+ground.y = 2650;
+game.addChild(ground);
+// Spawn timers
+var pillarSpawnTimer = 0;
+var pillarSpawnInterval = 120; // 2 seconds at 60 FPS
+var fishSpawnTimer = 0;
+var powerUpSpawnTimer = 0;
+// Create score text
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Create tap to start text
+var startTxt = new Text2('TAP TO FLAP', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+startTxt.anchor.set(0.5, 0.5);
+startTxt.y = 200;
+LK.gui.center.addChild(startTxt);
+// Start the background music
+LK.playMusic('bgMusic', {
+ fade: {
+ start: 0,
+ end: 0.5,
+ duration: 1000
+ }
+});
+// Handle game input events
+game.down = function (x, y, obj) {
+ if (!gameOver) {
+ if (!gameStarted) {
+ gameStarted = true;
+ startTxt.visible = false;
+ }
+ penguin.flap();
+ }
+};
+// Spawn a new pillar
+function spawnPillar() {
+ var pillar = new Pillar();
+ pillar.x = 2300; // Just off-screen to the right
+ // Random y position for the gap
+ var minY = 900;
+ var maxY = 2000;
+ var gapY = minY + Math.random() * (maxY - minY);
+ pillar.setGapPosition(gapY);
+ pillars.push(pillar);
+ game.addChild(pillar);
+}
+// Spawn a fish
+function spawnFish() {
+ var fish = new Fish();
+ fish.x = 2300; // Just off-screen to the right
+ fish.y = 900 + Math.random() * 1000; // Random height
+ fishes.push(fish);
+ game.addChild(fish);
+}
+// Spawn a power-up
+function spawnPowerUp() {
+ var powerUp = new PowerUp();
+ powerUp.x = 2300; // Just off-screen to the right
+ powerUp.y = 900 + Math.random() * 1000; // Random height
+ // Random power-up type
+ var types = ["shield", "slowMotion", "magnet"];
+ var type = types[Math.floor(Math.random() * types.length)];
+ powerUp.setType(type);
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+}
+// Apply power-up effect
+function applyPowerUp(type) {
+ if (type === "shield") {
+ penguin.activateShield(300); // 5 seconds at 60 FPS
+ } else if (type === "slowMotion") {
+ gameSpeed = slowMotionSpeed;
+ slowMotionTimer = 300; // 5 seconds at 60 FPS
+ LK.getSound('powerup').play();
+ } else if (type === "magnet") {
+ magnetActive = true;
+ magnetTimer = 300; // 5 seconds at 60 FPS
+ LK.getSound('powerup').play();
+ }
+}
+// Main game update loop
+game.update = function () {
+ if (!gameStarted) return;
+ // Update game speed (slow motion power-up)
+ if (slowMotionTimer > 0) {
+ slowMotionTimer--;
+ if (slowMotionTimer <= 0) {
+ gameSpeed = normalSpeed;
+ }
+ }
+ // Update magnet power-up
+ if (magnetActive) {
+ magnetTimer--;
+ if (magnetTimer <= 0) {
+ magnetActive = false;
+ }
+ }
+ // Update penguin
+ penguin.update();
+ // Check if penguin hits the ground
+ if (!gameOver && penguin.y > 2600) {
+ endGame();
+ }
+ // Check if penguin hits the ceiling
+ if (!gameOver && penguin.y < 100) {
+ penguin.y = 100;
+ penguin.velocity = 0;
+ }
+ // Spawn pillars
+ pillarSpawnTimer++;
+ if (pillarSpawnTimer >= pillarSpawnInterval * gameSpeed) {
+ spawnPillar();
+ pillarSpawnTimer = 0;
+ }
+ // Spawn fishes
+ fishSpawnTimer++;
+ if (fishSpawnTimer >= 240 * gameSpeed) {
+ // 4 seconds
+ spawnFish();
+ fishSpawnTimer = 0;
+ }
+ // Spawn power-ups (less frequently)
+ powerUpSpawnTimer++;
+ if (powerUpSpawnTimer >= 600 * gameSpeed) {
+ // 10 seconds
+ spawnPowerUp();
+ powerUpSpawnTimer = 0;
+ }
+ // Update pillars
+ for (var i = pillars.length - 1; i >= 0; i--) {
+ var pillar = pillars[i];
+ pillar.speed = 5 * gameSpeed;
+ pillar.update();
+ // Check for collisions if not game over and not shielded
+ if (!gameOver && !penguin.isShielded) {
+ // Check collision with top pillar
+ if (penguin.checkCollision(pillar.children[0])) {
+ endGame();
+ break;
+ }
+ // Check collision with bottom pillar
+ if (penguin.checkCollision(pillar.children[1])) {
+ endGame();
+ break;
+ }
+ }
+ // Check if penguin passed the pillar
+ if (!pillar.passed && pillar.x < penguin.x) {
+ score++;
+ scoreTxt.setText(score.toString());
+ pillar.passed = true;
+ }
+ // Remove pillars that are off-screen
+ if (pillar.x < -200) {
+ pillar.destroy();
+ pillars.splice(i, 1);
+ }
+ }
+ // Update fishes
+ for (var j = fishes.length - 1; j >= 0; j--) {
+ var fish = fishes[j];
+ fish.speed = 5 * gameSpeed;
+ fish.update();
+ // Apply magnet effect if active
+ if (magnetActive) {
+ var dx = penguin.x - fish.x;
+ var dy = penguin.y - fish.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < magnetRange) {
+ // Move fish toward penguin
+ fish.x += dx * 0.1;
+ fish.y += dy * 0.1;
+ }
+ }
+ // Check if penguin collected the fish
+ if (!fish.collected && penguin.checkCollision(fish)) {
+ fish.collected = true;
+ fish.alpha = 0;
+ // Award points
+ score += 3;
+ scoreTxt.setText(score.toString());
+ // Play collect sound
+ LK.getSound('collect').play();
+ // Show a +3 text effect
+ var plusText = new Text2('+3', {
+ size: 60,
+ fill: 0xFFFF00
+ });
+ plusText.x = fish.x;
+ plusText.y = fish.y;
+ plusText.anchor.set(0.5, 0.5);
+ game.addChild(plusText);
+ // Animate and remove the text
+ tween.to(plusText, {
+ y: plusText.y - 100,
+ alpha: 0,
+ duration: 1000,
+ onComplete: function onComplete() {
+ plusText.destroy();
+ }
+ });
+ }
+ // Remove fishes that are off-screen
+ if (fish.x < -100) {
+ fish.destroy();
+ fishes.splice(j, 1);
+ }
+ }
+ // Update power-ups
+ for (var k = powerUps.length - 1; k >= 0; k--) {
+ var powerUp = powerUps[k];
+ powerUp.speed = 5 * gameSpeed;
+ powerUp.update();
+ // Check if penguin collected the power-up
+ if (!powerUp.collected && penguin.checkCollision(powerUp)) {
+ powerUp.collected = true;
+ powerUp.alpha = 0;
+ // Apply the power-up effect
+ applyPowerUp(powerUp.type);
+ }
+ // Remove power-ups that are off-screen
+ if (powerUp.x < -100) {
+ powerUp.destroy();
+ powerUps.splice(k, 1);
+ }
+ }
+};
+// End the game
+function endGame() {
+ if (gameOver) return;
+ gameOver = true;
+ LK.getSound('crash').play();
+ // Flash the screen
+ LK.effects.flashScreen(0xFF0000, 500);
+ // Update high score
+ if (score > highScore) {
+ highScore = score;
+ storage.set("highScore", highScore);
+ }
+ // Show game over screen
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1000);
+}
\ No newline at end of file