/****
* Classes
****/
var AngelFish = Container.expand(function () {
var self = Container.call(this);
self.getWaterBounds = function () {
var waterGraphics = LK.getAsset('water', {});
return {
left: (2048 - waterGraphics.width) / 2,
right: (2048 + waterGraphics.width) / 2,
top: (2732 - waterGraphics.height) / 2 - 150,
bottom: (2732 + waterGraphics.height) / 2 - 150
};
};
var fishGraphics = self.attachAsset('angelFish', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0.75;
self._move_migrated = function () {
// Obstacle avoidance logic
var obstacles = aquarium.children.filter(function (child) {
return child !== self && child !== fishGraphics;
});
var avoidVector = {
x: 0,
y: 0
};
obstacles.forEach(function (obstacle) {
var dx = self.x - obstacle.x;
var dy = self.y - obstacle.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Avoid if within 100 pixels
avoidVector.x += dx / distance;
avoidVector.y += dy / distance;
}
});
if (avoidVector.x !== 0 || avoidVector.y !== 0) {
var avoidAngle = Math.atan2(avoidVector.y, avoidVector.x);
self.targetRotation = avoidAngle;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 60 + 30;
}
// Obstacle avoidance logic
var obstacles = aquarium.children.filter(function (child) {
return child !== self && child !== fishGraphics;
});
var avoidVector = {
x: 0,
y: 0
};
obstacles.forEach(function (obstacle) {
var dx = self.x - obstacle.x;
var dy = self.y - obstacle.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Avoid if within 100 pixels
avoidVector.x += dx / distance;
avoidVector.y += dy / distance;
}
});
if (avoidVector.x !== 0 || avoidVector.y !== 0) {
var avoidAngle = Math.atan2(avoidVector.y, avoidVector.x);
self.targetRotation = avoidAngle;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 60 + 30;
}
if (self.targetRotation === undefined || LK.ticks - self.rotationStartTime >= self.rotationDuration) {
self.targetRotation = Math.random() * Math.PI * 2;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 180 + 90;
}
var progress = (LK.ticks - self.rotationStartTime) / self.rotationDuration;
if (progress < 1) {
var deltaRotation = (self.targetRotation - self.rotation) * progress;
self.rotation += deltaRotation;
} else {
self.rotation = self.targetRotation;
}
self.x += Math.cos(self.rotation) * self.speed;
self.y += Math.sin(self.rotation) * self.speed;
var waterBounds = aquarium.getWaterBounds();
if (self.x < waterBounds.left || self.x > waterBounds.right) {
self.rotation = Math.PI - self.rotation;
}
if (self.y < waterBounds.top || self.y > waterBounds.bottom) {
self.rotation = -self.rotation;
}
self.rotation = self.rotation % (Math.PI * 2);
if (Math.cos(self.rotation) < 0) {
fishGraphics.scale.x = -1;
} else {
fishGraphics.scale.x = 1;
}
fishGraphics.rotation = self.rotation;
};
});
var Aquarium = Container.expand(function () {
var self = Container.call(this);
this.getWaterBounds = function () {
var waterGraphics = self.children.find(function (child) {
return child.name === 'Water Graphics';
});
if (!waterGraphics) {
console.error("Water Graphics not found");
return {
left: 0,
right: 0,
top: 0,
bottom: 0
};
}
return {
left: (2048 - waterGraphics.width) / 2,
right: (2048 + waterGraphics.width) / 2,
top: (2732 - waterGraphics.height) / 2 - 150,
bottom: (2732 + waterGraphics.height) / 2 - 150
};
};
var aquariumGraphics = self.attachAsset('aquarium', {});
aquariumGraphics.width = 2048 * 1.3;
aquariumGraphics.height = 2732 * 1.3;
aquariumGraphics.x = (2048 - aquariumGraphics.width) / 2;
aquariumGraphics.y = (2732 - aquariumGraphics.height) / 2;
self.addChild(aquariumGraphics);
var waterGraphics = self.attachAsset('water', {});
waterGraphics.width = 2048 / 3 * 2 * 1.2;
waterGraphics.height = 2732 / 3 * 1.4;
waterGraphics.x = (2048 - waterGraphics.width) / 2;
waterGraphics.y = (2732 - waterGraphics.height) / 2 - 150;
waterGraphics.alpha = 0;
self.addChild(waterGraphics);
});
var ClownFish = Container.expand(function () {
var self = Container.call(this);
var fishGraphics = self.attachAsset('clownFish', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0.5;
self._move_migrated = function () {
// Obstacle avoidance logic
var obstacles = aquarium.children.filter(function (child) {
return child !== self && child !== fishGraphics;
});
var avoidVector = {
x: 0,
y: 0
};
obstacles.forEach(function (obstacle) {
var dx = self.x - obstacle.x;
var dy = self.y - obstacle.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Avoid if within 100 pixels
avoidVector.x += dx / distance;
avoidVector.y += dy / distance;
}
});
if (avoidVector.x !== 0 || avoidVector.y !== 0) {
var avoidAngle = Math.atan2(avoidVector.y, avoidVector.x);
self.targetRotation = avoidAngle;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 60 + 30;
}
if (self.targetRotation === undefined || LK.ticks - self.rotationStartTime >= self.rotationDuration) {
self.targetRotation = Math.random() * Math.PI * 2;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 180 + 90;
}
var progress = (LK.ticks - self.rotationStartTime) / self.rotationDuration;
if (progress < 1) {
var deltaRotation = (self.targetRotation - self.rotation) * progress;
self.rotation += deltaRotation;
} else {
self.rotation = self.targetRotation;
}
self.x += Math.cos(self.rotation) * self.speed;
self.y += Math.sin(self.rotation) * self.speed;
var waterBounds = aquarium.getWaterBounds();
if (self.x < waterBounds.left || self.x > waterBounds.right) {
self.rotation = Math.PI - self.rotation;
}
if (self.y < waterBounds.top || self.y > waterBounds.bottom) {
self.rotation = -self.rotation;
}
self.rotation = self.rotation % (Math.PI * 2);
if (Math.cos(self.rotation) < 0) {
fishGraphics.scale.x = -1;
} else {
fishGraphics.scale.x = 1;
}
fishGraphics.rotation = self.rotation;
};
});
var Fish = Container.expand(function () {
var self = Container.call(this);
self.getWaterBounds = function () {
var waterGraphics = LK.getAsset('water', {});
return {
left: (2048 - waterGraphics.width) / 2,
right: (2048 + waterGraphics.width) / 2,
top: (2732 - waterGraphics.height) / 2 - 150,
bottom: (2732 + waterGraphics.height) / 2 - 150
};
};
var fishGraphics = self.attachAsset('fish', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0.625;
self._move_migrated = function () {
if (self.targetRotation === undefined || LK.ticks - self.rotationStartTime >= self.rotationDuration) {
self.targetRotation = Math.random() * Math.PI * 2;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 120 + 60;
}
var progress = (LK.ticks - self.rotationStartTime) / self.rotationDuration;
if (progress < 1) {
var deltaRotation = (self.targetRotation - self.rotation) * progress;
self.rotation += deltaRotation;
} else {
self.rotation = self.targetRotation;
}
self.x += Math.cos(self.rotation) * self.speed;
self.y += Math.sin(self.rotation) * self.speed;
var waterBounds = aquarium.getWaterBounds();
if (self.x < waterBounds.left || self.x > waterBounds.right) {
self.rotation = Math.PI - self.rotation;
}
if (self.y < waterBounds.top || self.y > waterBounds.bottom) {
self.rotation = -self.rotation;
}
self.rotation = self.rotation % (Math.PI * 2);
if (Math.cos(self.rotation) < 0) {
fishGraphics.scale.x = -1;
} else {
fishGraphics.scale.x = 1;
}
fishGraphics.rotation = self.rotation;
};
});
var TangFish = Container.expand(function () {
var self = Container.call(this);
var fishGraphics = self.attachAsset('tangFish', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0.65;
self._move_migrated = function () {
// Obstacle avoidance logic
var obstacles = aquarium.children.filter(function (child) {
return child !== self && child !== fishGraphics;
});
var avoidVector = {
x: 0,
y: 0
};
obstacles.forEach(function (obstacle) {
var dx = self.x - obstacle.x;
var dy = self.y - obstacle.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
// Avoid if within 100 pixels
avoidVector.x += dx / distance;
avoidVector.y += dy / distance;
}
});
if (avoidVector.x !== 0 || avoidVector.y !== 0) {
var avoidAngle = Math.atan2(avoidVector.y, avoidVector.x);
self.targetRotation = avoidAngle;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 60 + 30;
}
if (self.targetRotation === undefined || LK.ticks - self.rotationStartTime >= self.rotationDuration) {
self.targetRotation = Math.random() * Math.PI * 2;
self.rotationStartTime = LK.ticks;
self.rotationDuration = Math.random() * 180 + 90;
}
var progress = (LK.ticks - self.rotationStartTime) / self.rotationDuration;
if (progress < 1) {
var deltaRotation = (self.targetRotation - self.rotation) * progress;
self.rotation += deltaRotation;
} else {
self.rotation = self.targetRotation;
}
self.x += Math.cos(self.rotation) * self.speed;
self.y += Math.sin(self.rotation) * self.speed;
var waterBounds = aquarium.getWaterBounds();
if (self.x < waterBounds.left || self.x > waterBounds.right) {
self.rotation = Math.PI - self.rotation;
}
if (self.y < waterBounds.top || self.y > waterBounds.bottom) {
self.rotation = -self.rotation;
}
self.rotation = self.rotation % (Math.PI * 2);
if (Math.cos(self.rotation) < 0) {
fishGraphics.scale.x = -1;
} else {
fishGraphics.scale.x = 1;
}
fishGraphics.rotation = self.rotation;
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var aquarium = game.addChild(new Aquarium());
game.setBackgroundColor(0x008080);
var fishes = [];
var fishTypes = [Fish, AngelFish, ClownFish, TangFish];
for (var i = 0; i < fishTypes.length; i++) {
for (var j = 0; j < 20; j++) {
var fish = new fishTypes[i]();
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var maxDistance = 600;
var angle = Math.random() * Math.PI * 2;
var distance = Math.random() * maxDistance;
fish.x = centerX + distance * Math.cos(angle);
fish.y = centerY + distance * Math.sin(angle);
fishes.push(fish);
game.addChild(fish);
}
}
LK.on('tick', function () {
for (var i = 0; i < fishes.length; i++) {
fishes[i]._move_migrated();
}
});
An aquarium with no fish on a sheel in a photorealistic style. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic goldfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic Angelfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic koyfish swiming to the right. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic gupyfish swiming to the right. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic bettafish swiming to the right. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic clownfish swiming to the right. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic pufferfish swiming to the right. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic surgeonfish swiming to the right. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic buble of water. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic fish egg. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic celestial pearl danio. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic Parrotfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic dartfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic moorishidol. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic tangfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic bannerfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic butterflyfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A realistic mandarinfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a realistic lionfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a realistic emperorFish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a realistic sunfish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a realistic discusFish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a realistic neonTetra. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a realistic oscarFish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a cardinal tetra. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a tang fish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a clown fish. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.