User prompt
put the life counter on the bottom right hand corner of the screen - put the countdown time beneath the Level counter/ indicator
User prompt
Please fix the bug: 'Timeout.tick error: timerTxt.style is undefined' in or related to this line: 'timerTxt.style.fill = 0xFFFFFF;' Line Number: 171
User prompt
show countdown timer and number of lives. number of lives should be shown as life icons
User prompt
use a separate sound for each instrument when hit (create new sound assets)
User prompt
add bomb and xylophone to random instruments. lose one life when bomb is hit
Code edit (1 edits merged)
Please save this source code
User prompt
Guitar Hunter
Initial prompt
A shooting game where the player tries to shoot a guitar. He needs to shoot as many guitars as possible within 30 seconds. Counter counts the time down to zero. At the beginning, player's gun is at the bottom of the screen and can only shoot straight up. Player opens their mouth to shoot a bullet. Player turns head right to move right and turns head left to move left. At the top of the screen, the guitar slides from left to right. Guitar is destroyed when player's bullet hit it. Other random instruments also appear and disappear at random at various positions on the screen. Shooting any instruments other than a guitar (e.g drum, flute, piano, saxophone) earns the user 1 point. Shooting the guitar earns 5 points. If the player can shoot up to 3 guitars, he goes to a new level and the counter resets with a faster moving guitar and more random instruments spawned.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -15;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Guitar = Container.expand(function () {
var self = Container.call(this);
var guitarGraphics = self.attachAsset('guitar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.points = 5;
self.instrumentType = 'guitar';
self.update = function () {
self.x += self.speed;
};
return self;
});
var Gun = Container.expand(function () {
var self = Container.call(this);
var gunGraphics = self.attachAsset('gun', {
anchorX: 0.5,
anchorY: 1
});
self.update = function () {
if (facekit.mouthCenter.x > 0) {
self.x = facekit.mouthCenter.x;
}
};
return self;
});
var Instrument = Container.expand(function (type) {
var self = Container.call(this);
var instrumentGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.points = 1;
self.instrumentType = type;
self.lifespan = 180; // 3 seconds at 60fps
self.update = function () {
self.lifespan--;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a2e
});
/****
* Game Code
****/
var gun;
var bullets = [];
var guitars = [];
var instruments = [];
var level = 1;
var guitarsHit = 0;
var timeRemaining = 30;
var guitarSpeed = 3;
var instrumentSpawnRate = 120;
var lastMouthOpen = false;
var gameTimer;
var spawnTimer = 0;
var lives = 3;
// Initialize gun
gun = game.addChild(new Gun());
gun.x = 1024;
gun.y = 2600;
// Score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Level display
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(1, 0);
levelTxt.x = -20;
LK.gui.topRight.addChild(levelTxt);
// Timer display - larger and more prominent
var timerTxt = new Text2('30', {
size: 120,
fill: 0xFFFFFF
});
timerTxt.anchor.set(1, 0);
timerTxt.x = -20;
timerTxt.y = 80;
LK.gui.topRight.addChild(timerTxt);
// Guitars hit display
var guitarsHitTxt = new Text2('Guitars: 0/3', {
size: 60,
fill: 0xFFFFFF
});
guitarsHitTxt.anchor.set(0.5, 0);
guitarsHitTxt.y = 100;
LK.gui.top.addChild(guitarsHitTxt);
// Lives display container
var livesContainer = new Container();
livesContainer.x = -100;
livesContainer.y = -100;
LK.gui.bottomRight.addChild(livesContainer);
// Create life icons
var lifeIcons = [];
for (var i = 0; i < 3; i++) {
var lifeIcon = LK.getAsset('life', {
anchorX: 0.5,
anchorY: 0.5
});
lifeIcon.x = i * 70;
lifeIcon.y = 0;
lifeIcons.push(lifeIcon);
livesContainer.addChild(lifeIcon);
}
// Start game timer
gameTimer = LK.setInterval(function () {
timeRemaining--;
timerTxt.setText(timeRemaining.toString());
// Add color change when time is running out
if (timeRemaining <= 10) {
timerTxt.setStyle({
fill: 0xFF0000
});
} else {
timerTxt.setStyle({
fill: 0xFFFFFF
});
}
if (timeRemaining <= 0) {
LK.showGameOver();
}
}, 1000);
// Play background music
LK.playMusic('bgmusic');
game.update = function () {
// Check mouth open to shoot
if (facekit.mouthOpen && !lastMouthOpen) {
var newBullet = new Bullet();
newBullet.x = gun.x;
newBullet.y = gun.y - 120;
bullets.push(newBullet);
game.addChild(newBullet);
LK.getSound('shoot').play();
}
lastMouthOpen = facekit.mouthOpen;
// Spawn guitars
if (LK.ticks % 180 === 0) {
// Every 3 seconds
var newGuitar = new Guitar();
newGuitar.x = -60;
newGuitar.y = 300;
newGuitar.speed = guitarSpeed;
guitars.push(newGuitar);
game.addChild(newGuitar);
}
// Spawn random instruments
spawnTimer++;
if (spawnTimer >= instrumentSpawnRate) {
spawnTimer = 0;
var types = ['drum', 'flute', 'piano', 'saxophone', 'bomb', 'xylophone'];
var type = types[Math.floor(Math.random() * types.length)];
var newInstrument = new Instrument(type);
newInstrument.x = 200 + Math.random() * 1648;
newInstrument.y = 400 + Math.random() * 1800;
// Set special properties for bomb
if (type === 'bomb') {
newInstrument.points = -1; // Special marker for bomb
newInstrument.instrumentType = 'bomb';
}
instruments.push(newInstrument);
game.addChild(newInstrument);
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
if (bullet.y < -20) {
bullet.destroy();
bullets.splice(i, 1);
continue;
}
// Check guitar collisions
for (var j = guitars.length - 1; j >= 0; j--) {
var guitar = guitars[j];
if (bullet.intersects(guitar)) {
LK.setScore(LK.getScore() + guitar.points);
scoreTxt.setText('Score: ' + LK.getScore());
guitarsHit++;
guitarsHitTxt.setText('Guitars: ' + guitarsHit + '/3');
LK.getSound('guitarHit').play();
LK.effects.flashObject(guitar, 0xFFFFFF, 300);
guitar.destroy();
guitars.splice(j, 1);
bullet.destroy();
bullets.splice(i, 1);
// Check level advancement
if (guitarsHit >= 3) {
level++;
levelTxt.setText('Level: ' + level);
guitarsHit = 0;
guitarsHitTxt.setText('Guitars: 0/3');
timeRemaining = 30;
guitarSpeed += 2;
instrumentSpawnRate = Math.max(60, instrumentSpawnRate - 20);
}
break;
}
}
if (i < 0 || i >= bullets.length) continue;
// Check instrument collisions
for (var k = instruments.length - 1; k >= 0; k--) {
var instrument = instruments[k];
if (bullet.intersects(instrument)) {
// Handle bomb collision
if (instrument.instrumentType === 'bomb') {
lives--;
// Remove a life icon
if (lifeIcons.length > 0 && lives >= 0) {
var removedLife = lifeIcons.pop();
removedLife.destroy();
}
LK.effects.flashScreen(0xFF0000, 500);
LK.getSound('bombHit').play();
if (lives <= 0) {
LK.showGameOver();
}
} else {
// Normal instrument hit
LK.setScore(LK.getScore() + instrument.points);
scoreTxt.setText('Score: ' + LK.getScore());
// Play specific sound based on instrument type
if (instrument.instrumentType === 'drum') {
LK.getSound('drumHit').play();
} else if (instrument.instrumentType === 'flute') {
LK.getSound('fluteHit').play();
} else if (instrument.instrumentType === 'piano') {
LK.getSound('pianoHit').play();
} else if (instrument.instrumentType === 'saxophone') {
LK.getSound('saxophoneHit').play();
} else if (instrument.instrumentType === 'xylophone') {
LK.getSound('xylophoneHit').play();
}
}
LK.effects.flashObject(instrument, 0xFFFFFF, 300);
instrument.destroy();
instruments.splice(k, 1);
bullet.destroy();
bullets.splice(i, 1);
break;
}
}
}
// Update guitars
for (var i = guitars.length - 1; i >= 0; i--) {
var guitar = guitars[i];
if (guitar.x > 2108) {
guitar.destroy();
guitars.splice(i, 1);
}
}
// Update instruments
for (var i = instruments.length - 1; i >= 0; i--) {
var instrument = instruments[i];
if (instrument.lifespan <= 0) {
instrument.destroy();
instruments.splice(i, 1);
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -108,11 +108,12 @@
var timerTxt = new Text2('30', {
size: 120,
fill: 0xFFFFFF
});
-timerTxt.anchor.set(0.5, 0);
-timerTxt.y = 200;
-LK.gui.top.addChild(timerTxt);
+timerTxt.anchor.set(1, 0);
+timerTxt.x = -20;
+timerTxt.y = 80;
+LK.gui.topRight.addChild(timerTxt);
// Guitars hit display
var guitarsHitTxt = new Text2('Guitars: 0/3', {
size: 60,
fill: 0xFFFFFF
@@ -121,11 +122,11 @@
guitarsHitTxt.y = 100;
LK.gui.top.addChild(guitarsHitTxt);
// Lives display container
var livesContainer = new Container();
-livesContainer.x = -200;
-livesContainer.y = 20;
-LK.gui.topRight.addChild(livesContainer);
+livesContainer.x = -100;
+livesContainer.y = -100;
+LK.gui.bottomRight.addChild(livesContainer);
// Create life icons
var lifeIcons = [];
for (var i = 0; i < 3; i++) {
var lifeIcon = LK.getAsset('life', {
vertical bullet. In-Game asset. 2d. High contrast. No shadows
drum. In-Game asset. 2d. High contrast. No shadows
Guitar. In-Game asset. 2d. High contrast. No shadows
futuristic space cannon gun vertical top view. In-Game asset. 2d. High contrast. No shadows
piano. In-Game asset. 2d. High contrast. No shadows
saxophone. In-Game asset. 2d. High contrast. No shadows
red bomb. In-Game asset. 2d. High contrast. No shadows
xylophone. In-Game asset. 2d. High contrast. No shadows
gold musical note. In-Game asset. 3d. High contrast. No shadows
red musical note. In-Game asset. 3d. High contrast. No shadows
flute. In-Game asset. 3d. High contrast. No shadows
harp. In-Game asset. 3d. High contrast. No shadows
tuba. In-Game asset. 3d. High contrast. No shadows
Triple vertical bullet. In-Game asset. 3d. High contrast. No shadows
Music maestro monster head . 3d.. In-Game asset. High contrast. No shadows
Dark space background with stars
Bright green glowing musical note. In-Game asset. 3d. High contrast. No shadows