User prompt
Let it come slowly to where I touch and let it be slow with the other fish. โช๐ก Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Ocean Survivor: Fish Eat Fish
Initial prompt
Make me a fish eat fish game complete
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Fish = Container.expand(function (fishType, size) {
var self = Container.call(this);
self.fishType = fishType;
self.size = size;
self.speed = Math.random() * 1 + 0.5;
self.direction = Math.random() * Math.PI * 2;
self.targetX = Math.random() * 2048;
self.targetY = Math.random() * 2732;
self.chaseTarget = null;
self.fleeTarget = null;
var fishGraphics = self.attachAsset(fishType, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: size,
scaleY: size
});
self.update = function () {
// AI behavior
if (self.chaseTarget && self.chaseTarget.parent) {
// Chase smaller fish
var dx = self.chaseTarget.x - self.x;
var dy = self.chaseTarget.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 300) {
self.chaseTarget = null;
} else {
self.direction = Math.atan2(dy, dx);
self.speed = 1.5;
}
} else if (self.fleeTarget && self.fleeTarget.parent) {
// Flee from larger fish
var dx = self.x - self.fleeTarget.x;
var dy = self.y - self.fleeTarget.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 400) {
self.fleeTarget = null;
} else {
self.direction = Math.atan2(dy, dx);
self.speed = 2;
}
} else {
// Random movement
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 50) {
self.targetX = Math.random() * 2048;
self.targetY = Math.random() * 2732;
}
self.direction = Math.atan2(dy, dx);
self.speed = Math.random() * 1 + 0.5;
}
// Move fish
self.x += Math.cos(self.direction) * self.speed;
self.y += Math.sin(self.direction) * self.speed;
// Flip fish based on direction
fishGraphics.scaleX = Math.cos(self.direction) > 0 ? size : -size;
// Wrap around screen edges
if (self.x < -100) self.x = 2148;
if (self.x > 2148) self.x = -100;
if (self.y < -100) self.y = 2832;
if (self.y > 2832) self.y = -100;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
self.size = 1.0;
self.fishEaten = 0;
var playerGraphics = self.attachAsset('playerFish', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.0,
scaleY: 1.0
});
self.grow = function () {
self.size += 0.1;
self.fishEaten++;
tween(playerGraphics, {
scaleX: self.size,
scaleY: self.size
}, {
duration: 300,
easing: tween.easeOut
});
// Flash effect when eating
LK.effects.flashObject(self, 0xFFFFFF, 200);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x006B96
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 1024;
player.y = 1366;
var fishes = [];
var dragNode = null;
var gameTime = 0;
var spawnTimer = 0;
var highScore = storage.highScore || 0;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var sizeTxt = new Text2('Size: 1.0', {
size: 60,
fill: 0xFFFFFF
});
sizeTxt.anchor.set(0, 0);
sizeTxt.x = 150;
sizeTxt.y = 100;
LK.gui.topLeft.addChild(sizeTxt);
var highScoreTxt = new Text2('Best: ' + highScore, {
size: 50,
fill: 0xFFFF00
});
highScoreTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(highScoreTxt);
function spawnFish() {
var fishTypes = ['smallFish', 'mediumFish', 'largeFish'];
var fishSizes = [0.8, 1.5, 2.2];
var typeIndex = Math.floor(Math.random() * 3);
var fish = new Fish(fishTypes[typeIndex], fishSizes[typeIndex]);
// Spawn from edges
var edge = Math.floor(Math.random() * 4);
switch (edge) {
case 0:
// Top
fish.x = Math.random() * 2048;
fish.y = -50;
break;
case 1:
// Right
fish.x = 2098;
fish.y = Math.random() * 2732;
break;
case 2:
// Bottom
fish.x = Math.random() * 2048;
fish.y = 2782;
break;
case 3:
// Left
fish.x = -50;
fish.y = Math.random() * 2732;
break;
}
fishes.push(fish);
game.addChild(fish);
}
function handleMove(x, y, obj) {
if (dragNode) {
// Stop any existing movement tween
tween.stop(dragNode, {
x: true,
y: true
});
// Smoothly move to touch position
tween(dragNode, {
x: x,
y: y
}, {
duration: 800,
easing: tween.easeOut
});
}
}
function checkCollisions() {
for (var i = fishes.length - 1; i >= 0; i--) {
var fish = fishes[i];
if (player.intersects(fish)) {
if (player.size >= fish.size) {
// Player eats fish
LK.setScore(LK.getScore() + Math.floor(fish.size * 10));
player.grow();
LK.getSound('eat').play();
fish.destroy();
fishes.splice(i, 1);
scoreTxt.setText('Score: ' + LK.getScore());
sizeTxt.setText('Size: ' + player.size.toFixed(1));
} else {
// Fish eats player - Game Over
LK.getSound('death').play();
LK.effects.flashScreen(0xFF0000, 1000);
if (LK.getScore() > highScore) {
storage.highScore = LK.getScore();
}
LK.showGameOver();
}
}
}
}
function updateFishAI() {
for (var i = 0; i < fishes.length; i++) {
var fish = fishes[i];
// Clear previous targets
fish.chaseTarget = null;
fish.fleeTarget = null;
if (fish.size < player.size) {
// Fish should flee from player
var dx = fish.x - player.x;
var dy = fish.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 300) {
fish.fleeTarget = player;
}
} else if (fish.size > player.size) {
// Fish should chase player
var dx = fish.x - player.x;
var dy = fish.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 400) {
fish.chaseTarget = player;
}
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
game.update = function () {
gameTime++;
spawnTimer++;
// Spawn fish periodically
if (spawnTimer > 120) {
// Every 2 seconds at 60fps
spawnFish();
spawnTimer = 0;
}
// Update fish AI every 10 frames
if (gameTime % 10 === 0) {
updateFishAI();
}
// Check collisions
checkCollisions();
// Remove fish that are too far away
for (var i = fishes.length - 1; i >= 0; i--) {
var fish = fishes[i];
var dx = fish.x - player.x;
var dy = fish.y - player.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 1500) {
fish.destroy();
fishes.splice(i, 1);
}
}
// Maintain fish population
if (fishes.length < 8 + Math.floor(gameTime / 1800)) {
spawnFish();
}
};
// Play ambient ocean music
LK.playMusic('oceanAmbient');
// Spawn initial fish
for (var i = 0; i < 6; i++) {
spawnFish();
} ===================================================================
--- original.js
+++ change.js
@@ -10,9 +10,9 @@
var Fish = Container.expand(function (fishType, size) {
var self = Container.call(this);
self.fishType = fishType;
self.size = size;
- self.speed = Math.random() * 2 + 1;
+ self.speed = Math.random() * 1 + 0.5;
self.direction = Math.random() * Math.PI * 2;
self.targetX = Math.random() * 2048;
self.targetY = Math.random() * 2732;
self.chaseTarget = null;
@@ -33,9 +33,9 @@
if (distance > 300) {
self.chaseTarget = null;
} else {
self.direction = Math.atan2(dy, dx);
- self.speed = 3;
+ self.speed = 1.5;
}
} else if (self.fleeTarget && self.fleeTarget.parent) {
// Flee from larger fish
var dx = self.x - self.fleeTarget.x;
@@ -44,9 +44,9 @@
if (distance > 400) {
self.fleeTarget = null;
} else {
self.direction = Math.atan2(dy, dx);
- self.speed = 4;
+ self.speed = 2;
}
} else {
// Random movement
var dx = self.targetX - self.x;
@@ -56,9 +56,9 @@
self.targetX = Math.random() * 2048;
self.targetY = Math.random() * 2732;
}
self.direction = Math.atan2(dy, dx);
- self.speed = Math.random() * 2 + 1;
+ self.speed = Math.random() * 1 + 0.5;
}
// Move fish
self.x += Math.cos(self.direction) * self.speed;
self.y += Math.sin(self.direction) * self.speed;
@@ -170,10 +170,21 @@
game.addChild(fish);
}
function handleMove(x, y, obj) {
if (dragNode) {
- dragNode.x = x;
- dragNode.y = y;
+ // Stop any existing movement tween
+ tween.stop(dragNode, {
+ x: true,
+ y: true
+ });
+ // Smoothly move to touch position
+ tween(dragNode, {
+ x: x,
+ y: y
+ }, {
+ duration: 800,
+ easing: tween.easeOut
+ });
}
}
function checkCollisions() {
for (var i = fishes.length - 1; i >= 0; i--) {