User prompt
In the top-right corner of the screen, place a gold coin icon. To the left of the icon, attach a white rectangular area that displays the current amount of gold. The gold amount starts at 0. Each time an enemy is defeated, increase the gold by 10. The icon and the gold display should be visually connected, forming a single HUD component. Use simple, readable fonts and make sure it is clearly visible against any background.
User prompt
Add a gold chest to the top right of the background and every time a monster is killed, 10 gold will be added.
User prompt
Make the '+10' icon the top layer
User prompt
Set the '+10' icon to appear everywhere on the screen, so that every time a monster dies they spawn somewhere else and not just appear in the background. Make the icon a bit bigger
Code edit (3 edits merged)
Please save this source code
User prompt
The '+10' icon should be before the monsters' layer and even be the frontmost layer
User prompt
Center the '+10' icon on the screen
User prompt
Move the '+10' icon down a bit
User prompt
Move the '+10' icon up a bit
User prompt
Move the '+10' icon down a much
User prompt
Move the '+10' icon down a bit
User prompt
'+10' icon appears on the monster
User prompt
Add an icon to the top right showing the user's gold and earn 10 gold for each monster killed. Earn 10 gold and after the monster dies it will show '+10'.
User prompt
Add an icon showing the user's horse to the top right and earn 10 gold for each monster killed. Earn 10 gold and after the monster dies, it will say '+10'.
User prompt
i can't hear hit sound. Pls add the game hit sound perfectly
User prompt
change the number font
Code edit (1 edits merged)
Please save this source code
User prompt
add hit sound on my assets
User prompt
move the background down a bit
User prompt
move the monsters up a bit
User prompt
move the monsters up a bit
User prompt
move the monsters up a bit
User prompt
Match the monsters to the background stone and make them a little smaller
User prompt
just take it back 2 steps back
User prompt
make the game phone screen ratio
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Monster class
var Monster = Container.expand(function () {
var self = Container.call(this);
// Default monster uses 'monster' asset
var monsterBody = self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5
});
// Monster hit overlay (hidden by default)
var monsterHit = self.attachAsset('monsterHit', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
// Health values
self.maxHealth = 10;
self.health = self.maxHealth;
// Hit animation
self.hitAnim = function () {
// Show hit overlay quickly, then fade out
monsterHit.alpha = 0.6;
tween(monsterHit, {
alpha: 0
}, {
duration: 180,
easing: tween.linear
});
// Slight scale pop
tween.stop(monsterBody, {
scaleX: true,
scaleY: true
});
monsterBody.scaleX = 1.1;
monsterBody.scaleY = 1.1;
tween(monsterBody, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeOut
});
};
// Take damage
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health < 0) {
self.health = 0;
}
self.hitAnim();
var hitSound = LK.getSound('hit');
if (hitSound && typeof hitSound.play === "function") {
hitSound.play();
}
};
// Reset monster health
self.resetHealth = function (newMax) {
self.maxHealth = newMax;
self.health = self.maxHealth;
};
// On tap/click
self.down = function (x, y, obj) {
self.takeDamage(1);
};
// Initialize health bar
return self;
});
// Monster2 class
var Monster2 = Container.expand(function () {
var self = Container.call(this);
var monsterBody = self.attachAsset('monster2', {
anchorX: 0.5,
anchorY: 0.5
});
var monsterHit = self.attachAsset('monster2', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
self.maxHealth = 12;
self.health = self.maxHealth;
self.hitAnim = function () {
monsterHit.alpha = 0.7;
tween(monsterHit, {
alpha: 0.3
}, {
duration: 180,
easing: tween.linear
});
tween.stop(monsterBody, {
scaleX: true,
scaleY: true
});
monsterBody.scaleX = 1.15;
monsterBody.scaleY = 1.15;
tween(monsterBody, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeOut
});
};
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health < 0) {
self.health = 0;
}
self.hitAnim();
var hitSound = LK.getSound('hit');
if (hitSound && typeof hitSound.play === "function") {
hitSound.play();
}
};
self.resetHealth = function (newMax) {
self.maxHealth = newMax;
self.health = self.maxHealth;
};
self.down = function (x, y, obj) {
self.takeDamage(1);
};
return self;
});
// Monster3 class
var Monster3 = Container.expand(function () {
var self = Container.call(this);
var monsterBody = self.attachAsset('monster3', {
anchorX: 0.5,
anchorY: 0.5
});
var monsterHit = self.attachAsset('monster3', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
self.maxHealth = 15;
self.health = self.maxHealth;
self.hitAnim = function () {
monsterHit.alpha = 0.7;
tween(monsterHit, {
alpha: 0.3
}, {
duration: 180,
easing: tween.linear
});
tween.stop(monsterBody, {
scaleX: true,
scaleY: true
});
monsterBody.scaleX = 1.2;
monsterBody.scaleY = 1.2;
tween(monsterBody, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeOut
});
};
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health < 0) {
self.health = 0;
}
self.hitAnim();
var hitSound = LK.getSound('hit');
if (hitSound && typeof hitSound.play === "function") {
hitSound.play();
}
};
self.resetHealth = function (newMax) {
self.maxHealth = newMax;
self.health = self.maxHealth;
};
self.down = function (x, y, obj) {
self.takeDamage(1);
};
return self;
});
// Monster4 class
var Monster4 = Container.expand(function () {
var self = Container.call(this);
var monsterBody = self.attachAsset('monster4', {
anchorX: 0.5,
anchorY: 0.5
});
var monsterHit = self.attachAsset('monster4', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
self.maxHealth = 18;
self.health = self.maxHealth;
self.hitAnim = function () {
monsterHit.alpha = 0.7;
tween(monsterHit, {
alpha: 0.3
}, {
duration: 180,
easing: tween.linear
});
tween.stop(monsterBody, {
scaleX: true,
scaleY: true
});
monsterBody.scaleX = 1.25;
monsterBody.scaleY = 1.25;
tween(monsterBody, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeOut
});
};
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health < 0) {
self.health = 0;
}
self.hitAnim();
var hitSound = LK.getSound('hit');
if (hitSound && typeof hitSound.play === "function") {
hitSound.play();
}
};
self.resetHealth = function (newMax) {
self.maxHealth = newMax;
self.health = self.maxHealth;
};
self.down = function (x, y, obj) {
self.takeDamage(1);
};
return self;
});
// Monster5 class (using 'monster5' asset)
var Monster5 = Container.expand(function () {
var self = Container.call(this);
var monsterBody = self.attachAsset('monster5', {
anchorX: 0.5,
anchorY: 0.5
});
var monsterHit = self.attachAsset('monster5', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
self.maxHealth = 20;
self.health = self.maxHealth;
self.hitAnim = function () {
monsterHit.alpha = 0.7;
tween(monsterHit, {
alpha: 0.3
}, {
duration: 180,
easing: tween.linear
});
tween.stop(monsterBody, {
scaleX: true,
scaleY: true
});
monsterBody.scaleX = 1.3;
monsterBody.scaleY = 1.3;
tween(monsterBody, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.easeOut
});
};
self.takeDamage = function (amount) {
self.health -= amount;
if (self.health < 0) {
self.health = 0;
}
self.hitAnim();
var hitSound = LK.getSound('hit');
if (hitSound && typeof hitSound.play === "function") {
hitSound.play();
}
};
self.resetHealth = function (newMax) {
self.maxHealth = newMax;
self.health = self.maxHealth;
};
self.down = function (x, y, obj) {
self.takeDamage(1);
};
return self;
});
/****
* Initialize Game
****/
// MonsterFactory to spawn a random monster type
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// MonsterFactory to spawn a random monster type
// Keep track of last monster type index
var lastMonsterIdx = -1;
function MonsterFactory() {
// List of monster constructors, one for each asset
// We'll define Monster5 inline below
var monsterTypes = [Monster, Monster2, Monster3, Monster4, Monster5];
var idx;
// Pick a random type different from last
if (monsterTypes.length > 1) {
do {
idx = Math.floor(Math.random() * monsterTypes.length);
} while (idx === lastMonsterIdx);
} else {
idx = 0;
}
lastMonsterIdx = idx;
return new monsterTypes[idx]();
}
var score = 0;
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff",
font: "'Impact','Arial Black',Tahoma"
});
scoreTxt.anchor.set(0.5, 0);
// Place at top center, but not in top 100px (avoid menu)
scoreTxt.y = 20;
LK.gui.top.addChild(scoreTxt);
// Gold variable and text
var gold = 0;
var goldTxt = new Text2('0', {
size: 90,
fill: 0xFFD700,
font: "'Impact','Arial Black',Tahoma"
});
goldTxt.anchor.set(1, 0);
goldTxt.x = LK.gui.width - 160;
goldTxt.y = 40;
LK.gui.topRight.addChild(goldTxt);
// Function to show +10 gold popup
function showGoldPopup(x, y) {
// Show '+10' popup at monster position, animating upward
var popup = new Text2('+10', {
size: 100,
fill: 0xFFD700,
font: "'Impact','Arial Black',Tahoma"
});
popup.anchor.set(0.5, 1);
popup.x = x;
// Move popup up a bit (e.g. +120 instead of +220)
popup.y = y + 120;
// Always add as the last child so it is in front of all monsters and health bars
game.addChild(popup, game.children.length);
tween(popup, {
y: popup.y - 120,
alpha: 0
}, {
duration: 900,
easing: tween.easeOut,
onComplete: function onComplete() {
popup.destroy();
}
});
}
// Add horse icon to top right
var horseIcon = LK.getAsset('horse', {
anchorX: 1,
anchorY: 0,
x: LK.gui.width - 20,
y: 20,
width: 120,
height: 120
});
LK.gui.topRight.addChild(horseIcon);
// Add gold icon to top right, left of horse icon
var goldIcon = LK.getAsset('healthBarBg', {
anchorX: 1,
anchorY: 0,
x: LK.gui.width - 170,
y: 50,
width: 70,
height: 70
});
LK.gui.topRight.addChild(goldIcon);
// Move gold text to be next to gold icon
goldTxt.x = LK.gui.width - 180;
goldTxt.y = 60;
// Add background image as a background layer, scaled to always fill the phone screen (game area 2048x2732)
var background = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
width: 2048,
height: 2732
});
game.addChild(background, 0); // Add at index 0 to ensure it's behind everything
// Center position for monster (adjusted for large monster size)
var centerX = 2048 / 2;
var centerY = 2732 / 2 + 100;
// Current monster
var monster = null;
// Function to spawn a new monster
function spawnMonster() {
// Remove old monster if exists
if (monster) {
monster.destroy();
monster = null;
}
// Remove old health bar if exists
if (game.monsterHealthBarBg) {
game.monsterHealthBarBg.destroy();
game.monsterHealthBarBg = null;
}
if (game.monsterHealthBarFg) {
game.monsterHealthBarFg.destroy();
game.monsterHealthBarFg = null;
}
// Increase difficulty: every 10 monsters, +2 health
var baseHealth = 10 + Math.floor(score / 10) * 2;
// Use MonsterFactory to get a random monster type
monster = MonsterFactory();
monster.x = centerX;
monster.y = centerY;
// Set health scaling for all monsters
if (typeof monster.resetHealth === "function") {
monster.resetHealth(baseHealth);
}
game.addChild(monster);
// Add health bar background and foreground above monster
var barWidth = 600;
var barHeight = 60;
var barOffsetY = -monster.height / 2 - 60; // above monster
// Health bar background
var healthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0.5,
width: barWidth,
height: barHeight,
x: monster.x,
y: monster.y + barOffsetY
});
game.addChild(healthBarBg);
// Health bar foreground
var healthBarFg = LK.getAsset('healthBarFg', {
anchorX: 0.5,
anchorY: 0.5,
width: barWidth - 16,
height: barHeight - 16,
x: monster.x,
y: monster.y + barOffsetY
});
game.addChild(healthBarFg);
// Store for update/removal
game.monsterHealthBarBg = healthBarBg;
game.monsterHealthBarFg = healthBarFg;
// Attach update function to monster for health bar
monster.updateHealthBar = function () {
// Update bar position to follow monster
healthBarBg.x = monster.x;
healthBarBg.y = monster.y + barOffsetY;
healthBarFg.x = monster.x;
healthBarFg.y = monster.y + barOffsetY;
// Update bar width to reflect health
var pct = Math.max(0, monster.health / monster.maxHealth);
healthBarFg.width = (barWidth - 16) * pct;
};
}
// Game update loop
game.update = function () {
if (!monster) {
return;
}
// If monster is dead, increment score and spawn new
if (monster.health <= 0) {
score += 1;
scoreTxt.setText(score);
gold += 10;
goldTxt.setText(gold);
// Show +10 gold popup centered on the screen
showGoldPopup(2048 / 2, 2732 / 2);
spawnMonster();
} else if (monster && typeof monster.updateHealthBar === "function") {
monster.updateHealthBar();
}
};
// Start first monster
spawnMonster(); ===================================================================
--- original.js
+++ change.js
@@ -360,9 +360,10 @@
popup.anchor.set(0.5, 1);
popup.x = x;
// Move popup up a bit (e.g. +120 instead of +220)
popup.y = y + 120;
- game.addChild(popup);
+ // Always add as the last child so it is in front of all monsters and health bars
+ game.addChild(popup, game.children.length);
tween(popup, {
y: popup.y - 120,
alpha: 0
}, {