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() * 2 + 1;
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 = 3;
}
} 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 = 4;
}
} 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() * 2 + 1;
}
// 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) {
dragNode.x = x;
dragNode.y = y;
}
}
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
@@ -1,6 +1,272 @@
-/****
+/****
+* 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() * 2 + 1;
+ 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 = 3;
+ }
+ } 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 = 4;
+ }
+ } 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() * 2 + 1;
+ }
+ // 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: 0x000000
-});
\ No newline at end of file
+ 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) {
+ dragNode.x = x;
+ dragNode.y = y;
+ }
+}
+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();
+}
\ No newline at end of file