User prompt
bullet bee more speed fast
User prompt
add background asset
User prompt
enemies dont attack from upper
Code edit (1 edits merged)
Please save this source code
User prompt
Hiveguard: Swarm Defense
Initial prompt
javascript. make 2D a simple game. swipe for attack style. a beehive. honeycomb defense. by releasing bee as a bullet to hit enemies. beehive at the midle upper screen
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Bee = Container.expand(function () {
var self = Container.call(this);
var beeGraphics = self.attachAsset('bee', {
anchorX: 0.5,
anchorY: 0.5
});
// Define bee properties
self.velocityX = 0;
self.velocityY = 0;
self.speed = 20;
self.active = true;
// Direction indicators
var wingLeft = self.addChild(LK.getAsset('bee', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.2,
x: -20,
y: 0,
tint: 0xFFFFFF
}));
var wingRight = self.addChild(LK.getAsset('bee', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.2,
x: 20,
y: 0,
tint: 0xFFFFFF
}));
// Wing animation
var _animateWings = function animateWings() {
tween(wingLeft, {
scaleY: 0.4
}, {
duration: 100,
onFinish: function onFinish() {
tween(wingLeft, {
scaleY: 0.2
}, {
duration: 100,
onFinish: _animateWings
});
}
});
tween(wingRight, {
scaleY: 0.4
}, {
duration: 100,
onFinish: function onFinish() {
tween(wingRight, {
scaleY: 0.2
}, {
duration: 100
});
}
});
};
_animateWings();
// Set launch direction
self.launch = function (directionX, directionY) {
var magnitude = Math.sqrt(directionX * directionX + directionY * directionY);
self.velocityX = directionX / magnitude * self.speed;
self.velocityY = directionY / magnitude * self.speed;
// Rotate bee to face direction of travel
self.rotation = Math.atan2(directionY, directionX);
};
self.update = function () {
if (self.active) {
self.x += self.velocityX;
self.y += self.velocityY;
// Check if bee is off screen
if (self.x < -100 || self.x > 2148 || self.y < -100 || self.y > 2832) {
self.active = false;
}
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
// Add some visual interest with a pattern
var pattern = self.addChild(LK.getAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.6,
scaleY: 0.6,
tint: 0xC2185B
}));
// Define enemy properties
self.speed = 2 + Math.random() * 2; // Random speed between 2 and 4
self.health = 1;
self.active = true;
self.targetX = 0;
self.targetY = 0;
// Set target for the enemy to move toward
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
};
self.takeDamage = function () {
self.health -= 1;
if (self.health <= 0) {
self.active = false;
// Flash before destruction
LK.effects.flashObject(self, 0xFFFFFF, 200);
LK.getSound('enemyHit').play();
} else {
// Flash red when hit but not destroyed
LK.effects.flashObject(self, 0xFF0000, 200);
}
};
self.update = function () {
if (self.active) {
// Calculate direction to target
var dx = self.targetX - self.x;
var dy = self.targetY - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Normalize and apply speed
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
// Rotate enemy to face direction of travel
self.rotation = Math.atan2(dy, dx);
}
}
};
return self;
});
var Honeycomb = Container.expand(function () {
var self = Container.call(this);
var honeycombGraphics = self.attachAsset('honeycomb', {
anchorX: 0.5,
anchorY: 0.5
});
// Add beehive in the center of honeycomb
var beehive = self.addChild(LK.getAsset('beehive', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0
}));
// Add honey pots
var honeyPots = [];
for (var i = 0; i < 3; i++) {
var honey = self.addChild(LK.getAsset('honey', {
anchorX: 0.5,
anchorY: 0.5,
x: (i - 1) * 120,
y: 80
}));
honeyPots.push(honey);
}
// Set honeycomb properties
self.health = 3;
self.takeDamage = function () {
if (self.health > 0) {
self.health--;
// Remove a honey pot
if (honeyPots[self.health]) {
tween(honeyPots[self.health], {
alpha: 0
}, {
duration: 500
});
}
// Flash the beehive red
LK.effects.flashObject(beehive, 0xFF0000, 500);
LK.getSound('beehiveHit').play();
// Game over if health reaches 0
if (self.health <= 0) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game variables
// New background asset
var honeycomb;
var bees = [];
var enemies = [];
var score = 0;
var wave = 1;
var enemiesThisWave = 5;
var enemiesRemaining = 0;
var waveDelay = 5000; // 5 seconds between waves
var swipeStartX = 0;
var swipeStartY = 0;
var isSwipeActive = false;
var swipeLine = null;
// Initialize game elements
function initGame() {
// Attach background image
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(background);
// Create honeycomb
honeycomb = new Honeycomb();
honeycomb.x = 2048 / 2;
honeycomb.y = 200;
game.addChild(honeycomb);
// Initialize score display
var scoreTxt = new Text2('Score: 0', {
size: 70,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(1, 0); // Top right alignment
LK.gui.topRight.addChild(scoreTxt);
// Initialize wave display
var waveTxt = new Text2('Wave: 1', {
size: 70,
fill: 0xFFFFFF
});
waveTxt.anchor.set(0, 0); // Top left alignment
waveTxt.x = 120; // Avoid the top-left 100x100 area
LK.gui.topLeft.addChild(waveTxt);
// Start the first wave
startWave();
// Start background music
LK.playMusic('gameMusic', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});
// Update score and wave displays
function updateDisplay() {
scoreTxt.setText('Score: ' + score);
waveTxt.setText('Wave: ' + wave);
}
// Game swipe mechanics
game.down = function (x, y) {
// Start the swipe
swipeStartX = x;
swipeStartY = y;
isSwipeActive = true;
// Create visual indicator for the swipe
if (swipeLine) {
game.removeChild(swipeLine);
}
swipeLine = new Container();
var lineStart = swipeLine.addChild(LK.getAsset('bee', {
anchorX: 0.5,
anchorY: 0.5,
x: swipeStartX,
y: swipeStartY,
scaleX: 0.5,
scaleY: 0.5,
tint: 0xFFFFFF
}));
game.addChild(swipeLine);
};
game.move = function (x, y) {
if (isSwipeActive && swipeLine) {
// Update the visual indicator
if (swipeLine.children.length > 1) {
game.removeChild(swipeLine);
swipeLine = new Container();
game.addChild(swipeLine);
}
var lineStart = swipeLine.addChild(LK.getAsset('bee', {
anchorX: 0.5,
anchorY: 0.5,
x: swipeStartX,
y: swipeStartY,
scaleX: 0.5,
scaleY: 0.5,
tint: 0xFFFFFF
}));
var lineEnd = swipeLine.addChild(LK.getAsset('bee', {
anchorX: 0.5,
anchorY: 0.5,
x: x,
y: y,
scaleX: 0.5,
scaleY: 0.5,
tint: 0xFFFFFF
}));
// Draw a line of small dots between start and end
var dx = x - swipeStartX;
var dy = y - swipeStartY;
var distance = Math.sqrt(dx * dx + dy * dy);
var steps = Math.min(Math.floor(distance / 30), 10);
for (var i = 1; i < steps; i++) {
var dotX = swipeStartX + dx * i / steps;
var dotY = swipeStartY + dy * i / steps;
var dot = swipeLine.addChild(LK.getAsset('bee', {
anchorX: 0.5,
anchorY: 0.5,
x: dotX,
y: dotY,
scaleX: 0.3,
scaleY: 0.3,
tint: 0xFFFFFF
}));
}
}
};
game.up = function (x, y) {
if (isSwipeActive) {
// Calculate swipe direction
var dx = x - swipeStartX;
var dy = y - swipeStartY;
var distance = Math.sqrt(dx * dx + dy * dy);
// Minimum swipe distance to register
if (distance > 50) {
// Launch a bee in the swipe direction
var bee = new Bee();
bee.x = honeycomb.x;
bee.y = honeycomb.y;
bee.launch(dx, dy);
bees.push(bee);
game.addChild(bee);
LK.getSound('beeShoot').play();
}
// Reset swipe
isSwipeActive = false;
if (swipeLine) {
game.removeChild(swipeLine);
swipeLine = null;
}
}
};
// Start a new wave of enemies
function startWave() {
enemiesThisWave = 5 + (wave - 1) * 2; // Increase enemies per wave
enemiesRemaining = enemiesThisWave;
var _spawnEnemy = function spawnEnemy() {
if (enemiesRemaining <= 0) {
return;
}
// Determine spawn position (from edges of the screen)
var spawnSide = Math.floor(Math.random() * 3) + 1; // 1: right, 2: bottom, 3: left
var spawnX, spawnY;
switch (spawnSide) {
case 0:
// Top
spawnX = Math.random() * 2048;
spawnY = -100;
break;
case 1:
// Right
spawnX = 2148;
spawnY = Math.random() * 2732;
break;
case 2:
// Bottom
spawnX = Math.random() * 2048;
spawnY = 2832;
break;
case 3:
// Left
spawnX = -100;
spawnY = Math.random() * 2732;
break;
}
// Create and add enemy
var enemy = new Enemy();
enemy.x = spawnX;
enemy.y = spawnY;
enemy.setTarget(honeycomb.x, honeycomb.y);
enemy.health = Math.min(Math.floor(wave / 3) + 1, 3); // Increase enemy health based on wave
enemies.push(enemy);
game.addChild(enemy);
enemiesRemaining--;
// Schedule next enemy spawn
if (enemiesRemaining > 0) {
LK.setTimeout(_spawnEnemy, 1000 + Math.random() * 1000);
}
};
// Start spawning enemies
_spawnEnemy();
// Update wave display
updateDisplay();
}
// Check if wave is complete
function checkWaveCompletion() {
if (enemiesRemaining <= 0 && enemies.length === 0) {
// Start next wave after delay
wave++;
LK.setTimeout(function () {
startWave();
}, waveDelay);
// Show wave notification
var waveBanner = new Text2('Wave ' + wave + ' incoming!', {
size: 120,
fill: 0xFFFFFF
});
waveBanner.anchor.set(0.5, 0.5);
LK.gui.center.addChild(waveBanner);
// Remove the banner after a delay
LK.setTimeout(function () {
LK.gui.center.removeChild(waveBanner);
}, waveDelay - 500);
}
}
// Game update function
game.update = function () {
// Update bees
for (var i = bees.length - 1; i >= 0; i--) {
var bee = bees[i];
if (!bee.active) {
game.removeChild(bee);
bees.splice(i, 1);
continue;
}
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (!enemy.active) {
game.removeChild(enemy);
enemies.splice(j, 1);
score += 10 * wave; // Score based on wave
updateDisplay();
checkWaveCompletion();
continue;
}
// Check if enemy has reached the honeycomb
if (enemy.active && enemy.intersects(honeycomb)) {
honeycomb.takeDamage();
enemy.active = false;
game.removeChild(enemy);
enemies.splice(j, 1);
continue;
}
// Check for collisions with bees
for (var k = bees.length - 1; k >= 0; k--) {
var bee = bees[k];
if (bee.active && enemy.active && bee.intersects(enemy)) {
enemy.takeDamage();
bee.active = false;
game.removeChild(bee);
bees.splice(k, 1);
break;
}
}
}
};
}
// Initialize the game
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -15,9 +15,9 @@
});
// Define bee properties
self.velocityX = 0;
self.velocityY = 0;
- self.speed = 12;
+ self.speed = 20;
self.active = true;
// Direction indicators
var wingLeft = self.addChild(LK.getAsset('bee', {
anchorX: 0.5,
@@ -199,10 +199,10 @@
/****
* Game Code
****/
-// New background asset
// Game variables
+// New background asset
var honeycomb;
var bees = [];
var enemies = [];
var score = 0;
2d colorfull ghibli image style. forest quite one beehive at a tree body of forest Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
beehive patter 2d color. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows