User prompt
make an individual asset for healthbars and enemy
User prompt
Create HealthbarAsset and EnemyHealthbarAsset classes for styled healthbars Replace enemy healthbar GUI with EnemyHealthbarAsset instance Replace healthbar GUI with HealthbarAsset instance
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'setText')' in or related to this line: 'self.valueTxt.setText(val + "/" + max);' Line Number: 214
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'setText')' in or related to this line: 'self.labelTxt.setText(txt);' Line Number: 218
User prompt
Please fix the bug: 'self.init is not a function' in or related to this line: 'self.init({' Line Number: 76
User prompt
make the healthbar and enemy an asset
User prompt
put an enemy asset above the arena and give it a health too
User prompt
make the healthbar box styled and visible under the arena
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'width')' in or related to this line: 'healthbarFg.children[0].width = Math.max(0, healthbarWidth * ratio);' Line Number: 172
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'healthbarBg.addChild(healthbarBgRect);' Line Number: 119
User prompt
add a healthbar and hp for the sol
User prompt
make the game over screen 5 seconds after dying
User prompt
make the texture change 2 the seconds after dieing
User prompt
change the souls texture asset if the soul is died
User prompt
make the bullet moving pattern closer to the middel of the arena ,n wave 2
User prompt
make the line moving unpredictable
User prompt
make the bullet lines go rihgt and left in fisrt wave
User prompt
make tyhe bullets symetric again in first weave
User prompt
make the first wave harder
User prompt
make the bllets line go up and down in 2nd wave
User prompt
Move one of the bullet lines in the first wave a little to the right so that it looks diagonal and the player has to move
User prompt
more
User prompt
more
User prompt
lşower it more
User prompt
lower the frequency
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Arena border (visual only)
var ArenaBorder = Container.expand(function () {
var self = Container.call(this);
var border = self.attachAsset('arenaBorder', {
anchorX: 0.5,
anchorY: 0.5
});
border.alpha = 0.7;
return self;
});
// Bullet class
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletSprite = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.vx = 0;
self.vy = 0;
self.update = function () {
self.x += self.vx;
self.y += self.vy;
};
return self;
});
// Enemy (boss) class
var Enemy = Container.expand(function () {
var self = Container.call(this);
// Use arenaBorder as a placeholder, but you can swap to a unique asset if available
var enemySprite = self.attachAsset('arenaBorder', {
anchorX: 0.5,
anchorY: 0.5,
width: 220,
height: 120,
color: 0xff4444
});
// Health property
self.maxHP = 20;
self.hp = self.maxHP;
// For hit flash
self.flash = function () {
tween(self, {
alpha: 0.3
}, {
duration: 80,
onFinish: function onFinish() {
tween(self, {
alpha: 1
}, {
duration: 120
});
}
});
};
return self;
});
// EnemyAsset: individual asset for enemy visual
var EnemyAsset = Container.expand(function () {
var self = Container.call(this);
// Main body
var body = LK.getAsset('arenaBorder', {
width: 220,
height: 120,
color: 0xff4444,
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(body);
// Face/eyes (simple style)
var eyeL = LK.getAsset('bullet', {
width: 24,
height: 24,
color: 0xffffff,
anchorX: 0.5,
anchorY: 0.5
});
eyeL.x = -40;
eyeL.y = -20;
self.addChild(eyeL);
var eyeR = LK.getAsset('bullet', {
width: 24,
height: 24,
color: 0xffffff,
anchorX: 0.5,
anchorY: 0.5
});
eyeR.x = 40;
eyeR.y = -20;
self.addChild(eyeR);
// Angry brow (simple rectangle)
var browL = LK.getAsset('arenaBorder', {
width: 32,
height: 8,
color: 0x222222,
anchorX: 0.5,
anchorY: 0.5
});
browL.x = -40;
browL.y = -36;
browL.rotation = -0.3;
self.addChild(browL);
var browR = LK.getAsset('arenaBorder', {
width: 32,
height: 8,
color: 0x222222,
anchorX: 0.5,
anchorY: 0.5
});
browR.x = 40;
browR.y = -36;
browR.rotation = 0.3;
self.addChild(browR);
return self;
});
// EnemyHealthbarAsset: styled healthbar for enemy
var EnemyHealthbarAsset = Container.expand(function () {
var self = Container.call(this);
// Props
self.width = 400;
self.height = 36;
self.bgColor = 0x222222;
self.borderColor = 0xffffff;
self.fgColor = 0xff4444;
self.labelText = "ENEMY";
self.valueText = "";
self.maxValue = 20;
self.value = 20;
// Background
var bgRect = LK.getAsset('arenaBorder', {
width: self.width + 8,
height: self.height + 8,
color: self.bgColor,
anchorX: 0,
anchorY: 0
});
self.addChild(bgRect);
// Border
var borderRect = LK.getAsset('arenaBorder', {
width: self.width + 4,
height: self.height + 4,
color: self.borderColor,
anchorX: 0,
anchorY: 0
});
borderRect.x = 2;
borderRect.y = 2;
self.addChild(borderRect);
// Foreground (actual health)
var fgRect = LK.getAsset('arenaBorder', {
width: self.width,
height: self.height,
color: self.fgColor,
anchorX: 0,
anchorY: 0
});
self.fgRect = fgRect;
fgRect.x = 4;
fgRect.y = 4;
self.addChild(fgRect);
// Label (left)
var label = new Text2(self.labelText, {
size: 48,
fill: "#fff"
});
label.anchor.set(1, 0.5);
label.x = -24;
label.y = self.height / 2 + 4;
self.addChild(label);
// Value (right)
var valueTxt = new Text2(self.valueText, {
size: 48,
fill: "#fff"
});
valueTxt.anchor.set(0, 0.5);
valueTxt.x = self.width + 24;
valueTxt.y = self.height / 2 + 4;
self.valueTxt = valueTxt;
self.addChild(valueTxt);
// Set value and update bar
self.set = function (value, maxValue) {
if (typeof maxValue !== "undefined") self.maxValue = maxValue;
self.value = Math.max(0, Math.min(self.maxValue, value));
var ratio = self.maxValue > 0 ? self.value / self.maxValue : 0;
if (self.fgRect) self.fgRect.width = Math.max(0, self.width * ratio);
if (self.valueTxt) self.valueTxt.setText(self.value + "/" + self.maxValue);
};
// Set label text
self.setLabel = function (txt) {
label.setText(txt);
};
// Set bar color
self.setColor = function (color) {
self.fgColor = color;
if (self.fgRect) self.fgRect.color = color;
};
return self;
});
// HealthbarAsset: styled healthbar for player
var HealthbarAsset = Container.expand(function () {
var self = Container.call(this);
// Props
self.width = 400;
self.height = 36;
self.bgColor = 0x222222;
self.borderColor = 0xffffff;
self.fgColor = 0x44ff44;
self.labelText = "HP";
self.valueText = "";
self.maxValue = 5;
self.value = 5;
// Background
var bgRect = LK.getAsset('arenaBorder', {
width: self.width + 8,
height: self.height + 8,
color: self.bgColor,
anchorX: 0,
anchorY: 0
});
self.addChild(bgRect);
// Border
var borderRect = LK.getAsset('arenaBorder', {
width: self.width + 4,
height: self.height + 4,
color: self.borderColor,
anchorX: 0,
anchorY: 0
});
borderRect.x = 2;
borderRect.y = 2;
self.addChild(borderRect);
// Foreground (actual health)
var fgRect = LK.getAsset('arenaBorder', {
width: self.width,
height: self.height,
color: self.fgColor,
anchorX: 0,
anchorY: 0
});
self.fgRect = fgRect;
fgRect.x = 4;
fgRect.y = 4;
self.addChild(fgRect);
// Label (left)
var label = new Text2(self.labelText, {
size: 48,
fill: "#fff"
});
label.anchor.set(1, 0.5);
label.x = -24;
label.y = self.height / 2 + 4;
self.addChild(label);
// Value (right)
var valueTxt = new Text2(self.valueText, {
size: 48,
fill: "#fff"
});
valueTxt.anchor.set(0, 0.5);
valueTxt.x = self.width + 24;
valueTxt.y = self.height / 2 + 4;
self.valueTxt = valueTxt;
self.addChild(valueTxt);
// Set value and update bar
self.set = function (value, maxValue) {
if (typeof maxValue !== "undefined") self.maxValue = maxValue;
self.value = Math.max(0, Math.min(self.maxValue, value));
var ratio = self.maxValue > 0 ? self.value / self.maxValue : 0;
if (self.fgRect) self.fgRect.width = Math.max(0, self.width * ratio);
if (self.valueTxt) self.valueTxt.setText(self.value + "/" + self.maxValue);
};
// Set label text
self.setLabel = function (txt) {
label.setText(txt);
};
// Set bar color
self.setColor = function (color) {
self.fgColor = color;
if (self.fgRect) self.fgRect.color = color;
};
return self;
});
// HealthbarBoxAsset: individual asset for healthbar box background/border
var HealthbarBoxAsset = Container.expand(function () {
var self = Container.call(this);
// Outer border
var border = LK.getAsset('arenaBorder', {
width: 412,
height: 48,
color: 0xffffff,
anchorX: 0,
anchorY: 0
});
self.addChild(border);
// Background
var bg = LK.getAsset('arenaBorder', {
width: 408,
height: 44,
color: 0x222222,
anchorX: 0,
anchorY: 0
});
bg.x = 2;
bg.y = 2;
self.addChild(bg);
return self;
});
// Soul (player) class
var Soul = Container.expand(function () {
var self = Container.call(this);
var soulSprite = self.attachAsset('soul', {
anchorX: 0.5,
anchorY: 0.5
});
// For hit flash
self.flash = function () {
tween(self, {
alpha: 0.3
}, {
duration: 80,
onFinish: function onFinish() {
tween(self, {
alpha: 1
}, {
duration: 120
});
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Enemy warning (yellow, for telegraphing)
// Bullet (white circle)
// Arena border (white rectangle, thin)
// Heart-shaped soul (red)
// Arena dimensions (centered)
var ARENA_W = 1200;
var ARENA_H = 900;
var ARENA_X = 2048 / 2 - ARENA_W / 2;
var ARENA_Y = 2732 / 2 - ARENA_H / 2;
// Add arena border
var arenaBorder = new ArenaBorder();
arenaBorder.x = 2048 / 2;
arenaBorder.y = 2732 / 2;
game.addChild(arenaBorder);
// Add enemy (boss) above the arena
var enemy = new Enemy();
enemy.x = 2048 / 2;
enemy.y = ARENA_Y - 90; // 90px above arena top
game.addChild(enemy);
// Enemy healthbar (styled asset above arena)
var enemyHealthbar = new EnemyHealthbarAsset();
var enemyHealthbarX = 2048 / 2 - enemyHealthbar.width / 2;
var enemyHealthbarY = ARENA_Y - 80; // 80px above arena
enemyHealthbar.x = enemyHealthbarX;
enemyHealthbar.y = enemyHealthbarY;
game.addChild(enemyHealthbar);
// Enemy healthbar update function
function updateEnemyHealthbar() {
if (enemy.hp < 0) enemy.hp = 0;
if (enemy.hp > enemy.maxHP) enemy.hp = enemy.maxHP;
enemyHealthbar.set(enemy.hp, enemy.maxHP);
}
updateEnemyHealthbar();
// Add soul (player)
var soul = new Soul();
soul.x = 2048 / 2;
soul.y = 2732 / 2;
game.addChild(soul);
// GUI: Timer (shows wave time left)
var timerTxt = new Text2('', {
size: 80,
fill: "#fff"
});
timerTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(timerTxt);
// GUI: Wave counter
var waveTxt = new Text2('', {
size: 80,
fill: "#fff"
});
waveTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(waveTxt);
waveTxt.y = 90;
// Healthbar (styled asset under arena)
var healthbar = new HealthbarAsset();
var healthbarX = 2048 / 2 - healthbar.width / 2;
var healthbarY = ARENA_Y + ARENA_H + 48; // 48px below arena
healthbar.x = healthbarX;
healthbar.y = healthbarY;
game.addChild(healthbar);
// Healthbar update function
function updateHealthbar() {
if (soulHP < 0) soulHP = 0;
if (soulHP > soulMaxHP) soulHP = soulMaxHP;
healthbar.set(soulHP, soulMaxHP);
}
updateHealthbar();
// Game state
var bullets = [];
var currentWave = 0;
var waveTime = 0;
var waveTimer = 0;
var waveActive = false;
var soulAlive = true;
var dragSoul = false;
var dragOffsetX = 0;
var dragOffsetY = 0;
// Soul health
var soulMaxHP = 5;
var soulHP = soulMaxHP;
// Healthbar GUI
// (removed duplicate healthbarBg, healthbarFg, healthbarWidth, healthbarHeight, healthbarX, healthbarY declarations)
// Arena bounds (for clamping soul)
function clampSoul(x, y) {
var hw = 50,
hh = 50; // soul half size
var minX = ARENA_X + hw;
var maxX = ARENA_X + ARENA_W - hw;
var minY = ARENA_Y + hh;
var maxY = ARENA_Y + ARENA_H - hh;
return {
x: Math.max(minX, Math.min(maxX, x)),
y: Math.max(minY, Math.min(maxY, y))
};
}
// Touch/drag controls
function handleSoulMove(x, y, obj) {
if (!dragSoul || !soulAlive) return;
var pos = clampSoul(x - dragOffsetX, y - dragOffsetY);
soul.x = pos.x;
soul.y = pos.y;
}
game.move = function (x, y, obj) {
handleSoulMove(x, y, obj);
};
game.down = function (x, y, obj) {
// Only start drag if inside soul
var dx = x - soul.x,
dy = y - soul.y;
if (dx * dx + dy * dy <= 60 * 60) {
dragSoul = true;
dragOffsetX = x - soul.x;
dragOffsetY = y - soul.y;
handleSoulMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragSoul = false;
};
// Waves definition
// Each wave: {duration, spawnFunc(tick, bulletsArr)}
var waves = [
// Wave 1: Simple slow bullets from top
{
duration: 180,
// 3s
spawnFunc: function spawnFunc(tick, arr) {
// Unpredictable horizontal movement for the whole line
if (typeof spawnFunc._targetX === "undefined") {
spawnFunc._targetX = 0;
spawnFunc._currentX = 0;
spawnFunc._tween = null;
spawnFunc._lastTick = 0;
}
if (tick - spawnFunc._lastTick > 40 || Math.abs(spawnFunc._targetX - spawnFunc._currentX) < 5) {
// Pick a new random target X offset within [-180, 180]
var newTarget = (Math.random() * 2 - 1) * 180;
spawnFunc._lastTick = tick;
spawnFunc._targetX = newTarget;
// Tween smoothly to new target over 30-60 frames
if (spawnFunc._tween) spawnFunc._tween.stop();
spawnFunc._tween = tween(spawnFunc, {
_currentX: newTarget
}, {
duration: 30 + Math.floor(Math.random() * 30)
});
}
var lineXOffset = spawnFunc._currentX;
if (tick % 24 === 0) {
// Wave 1: faster and more bullets, with unpredictable horizontal movement
var speed = 8;
for (var i = 0; i < 6; ++i) {
var b = new Bullet();
b.x = ARENA_X + 120 + i * 180 + lineXOffset;
b.y = ARENA_Y + 30;
b.vx = 0;
b.vy = speed;
arr.push(b);
game.addChild(b);
}
}
}
},
// Wave 2: Bullets from left/right
{
duration: 210,
// 3.5s
spawnFunc: function spawnFunc(tick, arr) {
// Make the whole line go up and down using a vertical offset
var lineOscAmp = 120; // amplitude of up/down movement
var lineOscFreq = 0.025; // frequency of up/down movement
var lineYOffset = Math.sin(tick * lineOscFreq) * lineOscAmp;
// Center the bullet lines vertically in the arena, closer to the middle
var centerY1 = ARENA_Y + ARENA_H / 2 - 120;
var centerY2 = ARENA_Y + ARENA_H / 2 + 120;
if (tick % 24 === 0) {
// S-shape: bullets from left and right, with vy oscillating as a sine wave
var speed = 10;
var amplitude = 60; // increased vertical amplitude of S
var freq = 0.012; // lowered frequency of S even more (even slower oscillation)
// Left to right
var b1 = new Bullet();
b1.x = ARENA_X + 30;
b1.y = (tick % 2 === 0 ? centerY1 : centerY2) + lineYOffset;
b1.vx = speed;
b1.vy = amplitude * Math.sin((tick + 0) * freq);
// Store phase for S motion
b1._sPhase = (tick + 0) * freq;
b1._sDir = 1;
// Override update for S shape
b1._baseY = b1.y;
b1._baseX = b1.x;
b1._t = 0;
b1._lineOscAmp = lineOscAmp;
b1._lineOscFreq = lineOscFreq;
b1._spawnTick = tick;
b1.update = function () {
this.x += this.vx;
this._t += 1;
// S shape: y = baseY + amplitude * sin((x - baseX) * freq) + line oscillation
var lineYOffset = Math.sin((this._spawnTick + this._t) * this._lineOscFreq) * this._lineOscAmp;
this.y = this._baseY + amplitude * Math.sin((this.x - this._baseX) * freq) + (lineYOffset - Math.sin(this._spawnTick * this._lineOscFreq) * this._lineOscAmp);
};
arr.push(b1);
game.addChild(b1);
// Right to left
var b2 = new Bullet();
b2.x = ARENA_X + ARENA_W - 30;
b2.y = (tick % 2 === 0 ? centerY2 : centerY1) + lineYOffset;
b2.vx = -speed;
b2.vy = amplitude * Math.sin((tick + 60) * freq);
b2._sPhase = (tick + 60) * freq;
b2._sDir = -1;
b2._baseY = b2.y;
b2._baseX = b2.x;
b2._t = 0;
b2._lineOscAmp = lineOscAmp;
b2._lineOscFreq = lineOscFreq;
b2._spawnTick = tick;
b2.update = function () {
this.x += this.vx;
this._t += 1;
var lineYOffset = Math.sin((this._spawnTick + this._t) * this._lineOscFreq) * this._lineOscAmp;
this.y = this._baseY + amplitude * Math.sin((this.x - this._baseX) * freq) + (lineYOffset - Math.sin(this._spawnTick * this._lineOscFreq) * this._lineOscAmp);
};
arr.push(b2);
game.addChild(b2);
}
}
},
// Wave 3: Diagonal bullets from corners
{
duration: 240,
// 4s
spawnFunc: function spawnFunc(tick, arr) {
if (tick % 36 === 0) {
// Wave 3: diagonal, medium speed
var speed = 7.5;
var diag = speed / Math.sqrt(2);
// Top-left
var b1 = new Bullet();
b1.x = ARENA_X + 40;
b1.y = ARENA_Y + 40;
b1.vx = diag;
b1.vy = diag;
arr.push(b1);
game.addChild(b1);
// Top-right
var b2 = new Bullet();
b2.x = ARENA_X + ARENA_W - 40;
b2.y = ARENA_Y + 40;
b2.vx = -diag;
b2.vy = diag;
arr.push(b2);
game.addChild(b2);
// Bottom-left
var b3 = new Bullet();
b3.x = ARENA_X + 40;
b3.y = ARENA_Y + ARENA_H - 40;
b3.vx = diag;
b3.vy = -diag;
arr.push(b3);
game.addChild(b3);
// Bottom-right
var b4 = new Bullet();
b4.x = ARENA_X + ARENA_W - 40;
b4.y = ARENA_Y + ARENA_H - 40;
b4.vx = -diag;
b4.vy = -diag;
arr.push(b4);
game.addChild(b4);
}
}
},
// Wave 4: Random rain
{
duration: 210,
// 3.5s
spawnFunc: function spawnFunc(tick, arr) {
if (tick % 10 === 0) {
// Wave 4: fast random rain
var minSpeed = 12,
maxSpeed = 16;
var b = new Bullet();
b.x = ARENA_X + 80 + Math.floor(Math.random() * (ARENA_W - 160));
b.y = ARENA_Y + 30;
b.vx = 0;
b.vy = minSpeed + Math.random() * (maxSpeed - minSpeed);
arr.push(b);
game.addChild(b);
}
}
},
// Wave 5: Spiral (center out)
{
duration: 270,
// 4.5s
spawnFunc: function spawnFunc(tick, arr) {
if (tick % 12 === 0) {
// Wave 5: spiral, moderate speed
var speed = 9;
var angle = tick / 12 * 0.5;
for (var i = 0; i < 4; ++i) {
var a = angle + i * Math.PI / 2;
var b = new Bullet();
b.x = 2048 / 2;
b.y = 2732 / 2;
b.vx = Math.cos(a) * speed;
b.vy = Math.sin(a) * speed;
arr.push(b);
game.addChild(b);
}
}
}
}];
// Start first wave
function startWave(idx) {
currentWave = idx;
waveTime = 0;
waveActive = true;
waveTimer = 0;
// Remove all bullets
for (var i = bullets.length - 1; i >= 0; --i) {
bullets[i].destroy();
bullets.splice(i, 1);
}
// Update GUI
waveTxt.setText("Wave " + (currentWave + 1) + "/" + waves.length);
// Reset HP and healthbar if starting first wave (new game)
if (currentWave === 0) {
soulHP = soulMaxHP;
soulAlive = true;
updateHealthbar();
// Restore soul sprite if needed
if (soul.children && soul.children.length > 0) {
var firstChild = soul.children[0];
if (firstChild.assetId === 'warning') {
soul.removeChild(firstChild);
var newSoulSprite = LK.getAsset('soul', {
anchorX: 0.5,
anchorY: 0.5
});
soul.addChildAt(newSoulSprite, 0);
}
}
}
}
startWave(0);
// Main update loop
game.update = function () {
if (!soulAlive) return;
// Wave logic
if (waveActive) {
var wave = waves[currentWave];
wave.spawnFunc(waveTime, bullets);
waveTime++;
// Update timer GUI
var tleft = Math.max(0, Math.ceil((wave.duration - waveTime) / 60));
timerTxt.setText("Time: " + tleft + "s");
// End wave?
if (waveTime >= wave.duration) {
waveActive = false;
// Remove all bullets after short delay
LK.setTimeout(function () {
for (var i = bullets.length - 1; i >= 0; --i) {
bullets[i].destroy();
bullets.splice(i, 1);
}
// Next wave or win
if (currentWave + 1 < waves.length) {
startWave(currentWave + 1);
} else {
// Win!
LK.showYouWin();
}
}, 600);
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; --i) {
var b = bullets[i];
b.update();
// Remove if out of arena (immediately on leaving the border)
if (b.x < ARENA_X || b.x > ARENA_X + ARENA_W || b.y < ARENA_Y || b.y > ARENA_Y + ARENA_H) {
b.destroy();
bullets.splice(i, 1);
continue;
}
// Collision with soul
var dx = b.x - soul.x,
dy = b.y - soul.y;
if (dx * dx + dy * dy < 45 * 45) {
// Hit!
soul.flash();
soulHP -= 1;
updateHealthbar();
// Remove bullet on hit
b.destroy();
bullets.splice(i, 1);
if (soulHP <= 0 && soulAlive) {
soulAlive = false;
// Delay soul's texture asset change to 2 seconds after dying
LK.setTimeout(function () {
if (soul.children && soul.children.length > 0) {
var deadSprite = LK.getAsset('warning', {
anchorX: 0.5,
anchorY: 0.5
});
var oldSprite = soul.children[0];
deadSprite.x = oldSprite.x;
deadSprite.y = oldSprite.y;
soul.removeChild(oldSprite);
soul.addChildAt(deadSprite, 0);
}
}, 2000);
LK.effects.flashScreen(0xff0000, 800);
LK.setTimeout(function () {
LK.showGameOver();
}, 5000);
break;
} else {
// Flash screen for hit, but not game over
LK.effects.flashScreen(0xff0000, 300);
}
}
}
};
// Initial GUI text
timerTxt.setText("Time: ");
waveTxt.setText("Wave 1/" + waves.length);
var bgRect = new HealthbarBoxAsset();
self.addChild(bgRect);
var bgRect = new HealthbarBoxAsset();
self.addChild(bgRect); ===================================================================
--- original.js
+++ change.js
@@ -61,8 +61,66 @@
});
};
return self;
});
+// EnemyAsset: individual asset for enemy visual
+var EnemyAsset = Container.expand(function () {
+ var self = Container.call(this);
+ // Main body
+ var body = LK.getAsset('arenaBorder', {
+ width: 220,
+ height: 120,
+ color: 0xff4444,
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.addChild(body);
+ // Face/eyes (simple style)
+ var eyeL = LK.getAsset('bullet', {
+ width: 24,
+ height: 24,
+ color: 0xffffff,
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ eyeL.x = -40;
+ eyeL.y = -20;
+ self.addChild(eyeL);
+ var eyeR = LK.getAsset('bullet', {
+ width: 24,
+ height: 24,
+ color: 0xffffff,
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ eyeR.x = 40;
+ eyeR.y = -20;
+ self.addChild(eyeR);
+ // Angry brow (simple rectangle)
+ var browL = LK.getAsset('arenaBorder', {
+ width: 32,
+ height: 8,
+ color: 0x222222,
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ browL.x = -40;
+ browL.y = -36;
+ browL.rotation = -0.3;
+ self.addChild(browL);
+ var browR = LK.getAsset('arenaBorder', {
+ width: 32,
+ height: 8,
+ color: 0x222222,
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ browR.x = 40;
+ browR.y = -36;
+ browR.rotation = 0.3;
+ self.addChild(browR);
+ return self;
+});
// EnemyHealthbarAsset: styled healthbar for enemy
var EnemyHealthbarAsset = Container.expand(function () {
var self = Container.call(this);
// Props
@@ -227,8 +285,33 @@
if (self.fgRect) self.fgRect.color = color;
};
return self;
});
+// HealthbarBoxAsset: individual asset for healthbar box background/border
+var HealthbarBoxAsset = Container.expand(function () {
+ var self = Container.call(this);
+ // Outer border
+ var border = LK.getAsset('arenaBorder', {
+ width: 412,
+ height: 48,
+ color: 0xffffff,
+ anchorX: 0,
+ anchorY: 0
+ });
+ self.addChild(border);
+ // Background
+ var bg = LK.getAsset('arenaBorder', {
+ width: 408,
+ height: 44,
+ color: 0x222222,
+ anchorX: 0,
+ anchorY: 0
+ });
+ bg.x = 2;
+ bg.y = 2;
+ self.addChild(bg);
+ return self;
+});
// Soul (player) class
var Soul = Container.expand(function () {
var self = Container.call(this);
var soulSprite = self.attachAsset('soul', {
@@ -691,5 +774,9 @@
}
};
// Initial GUI text
timerTxt.setText("Time: ");
-waveTxt.setText("Wave 1/" + waves.length);
\ No newline at end of file
+waveTxt.setText("Wave 1/" + waves.length);
+var bgRect = new HealthbarBoxAsset();
+self.addChild(bgRect);
+var bgRect = new HealthbarBoxAsset();
+self.addChild(bgRect);
\ No newline at end of file