User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Fix line 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Fix all errors
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 60
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'var pop = LK.getAsset('pop', {' Line Number: 61
Code edit (1 edits merged)
Please save this source code
User prompt
Tap Smash: Avoid the Bomb!
Initial prompt
IX Create a game where you tap to break items that appear on your screen but you dont tap on bombs and spikes because they hurt you and you have 3 lives. Better items give more points
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Item class for all falling items
var Item = Container.expand(function () {
var self = Container.call(this);
// Asset id and score are set on creation
self.assetId = 'item_basic';
self.scoreValue = 1;
self.isBad = false; // true for bomb/spike
self.isTapped = false;
// Attach asset
var itemGfx = self.attachAsset(self.assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// For pop effect
self.popEffect = null;
// Set up item visuals
self.setType = function (type) {
// type: {assetId, scoreValue, isBad}
self.assetId = type.assetId;
self.scoreValue = type.scoreValue;
self.isBad = type.isBad;
// Remove old asset if any
if (itemGfx && itemGfx.parent) itemGfx.parent.removeChild(itemGfx);
var newGfx = self.attachAsset(self.assetId, {
anchorX: 0.5,
anchorY: 0.5
});
// For bomb/spike, add a little rotation
if (self.isBad) {
newGfx.rotation = Math.PI / 8 * (Math.random() > 0.5 ? 1 : -1);
}
};
// Animate pop effect
self.showPop = function (color) {
var pop = LK.getAsset('pop', {
anchorX: 0.5,
anchorY: 0.5,
tint: color
});
pop.alpha = 0.7;
pop.scaleX = pop.scaleY = 0.5;
self.addChild(pop);
tween(pop, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 350,
easing: tween.easeOut,
onFinish: function onFinish() {
if (pop.parent) pop.parent.removeChild(pop);
}
});
};
// Called when tapped
self.onTap = function () {
if (self.isTapped) return;
self.isTapped = true;
if (self.isBad) {
self.showPop(0xff0000);
} else {
self.showPop(0xffffff);
}
};
// Called every tick
self.update = function () {
// Movement handled in game loop
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Music
// Sounds
// Pop effect
// Bad items
// Good items
// Item types
var ITEM_TYPES = [{
assetId: 'item_basic',
scoreValue: 1,
isBad: false,
weight: 60
}, {
assetId: 'item_rare',
scoreValue: 3,
isBad: false,
weight: 20
}, {
assetId: 'item_legend',
scoreValue: 7,
isBad: false,
weight: 5
}, {
assetId: 'item_bomb',
scoreValue: 0,
isBad: true,
weight: 10
}, {
assetId: 'item_spike',
scoreValue: 0,
isBad: true,
weight: 5
}];
// Weighted random selection
function pickItemType() {
var total = 0;
for (var i = 0; i < ITEM_TYPES.length; i++) total += ITEM_TYPES[i].weight;
var r = Math.random() * total;
var acc = 0;
for (var i = 0; i < ITEM_TYPES.length; i++) {
acc += ITEM_TYPES[i].weight;
if (r < acc) return ITEM_TYPES[i];
}
return ITEM_TYPES[0];
}
// Game state
var items = [];
var lives = 3;
var score = 0;
var spawnInterval = 1000; // ms
var minSpawnInterval = 350;
var spawnTimer = null;
var itemFallSpeed = 7; // px per frame
var itemSpeedInc = 0.15;
var itemSpawnDec = 30;
var lastTapTime = 0;
// GUI
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var livesTxt = new Text2('♥♥♥', {
size: 90,
fill: 0xFF5252
});
livesTxt.anchor.set(1, 0);
livesTxt.x = -40; // right padding
LK.gui.topRight.addChild(livesTxt);
// Prevent elements in top left 100x100
// (No elements added to gui.topLeft or at (0,0))
// Music
LK.playMusic('bgmusic');
// Spawn a new item
function spawnItem() {
var type = pickItemType();
var item = new Item();
item.setType(type);
// Random X, avoid edges
var margin = 120;
var x = margin + Math.random() * (2048 - 2 * margin);
item.x = x;
item.y = -100;
// For touch detection
item.width = LK.getAsset(type.assetId, {
anchorX: 0.5,
anchorY: 0.5
}).width;
item.height = LK.getAsset(type.assetId, {
anchorX: 0.5,
anchorY: 0.5
}).height;
// Add to game
game.addChild(item);
items.push(item);
}
// Update lives display
function updateLives() {
var s = '';
for (var i = 0; i < lives; i++) s += '♥';
livesTxt.setText(s);
}
// Handle tap
function handleTap(x, y, obj) {
// Find topmost item under tap
for (var i = items.length - 1; i >= 0; i--) {
var item = items[i];
// Simple bounding box check
var dx = x - item.x;
var dy = y - item.y;
var w = item.width / 2;
var h = item.height / 2;
if (dx * dx / (w * w) + dy * dy / (h * h) <= 1.1) {
// Tapped this item
if (item.isTapped) continue;
item.onTap();
if (item.isBad) {
// Lose a life
lives--;
updateLives();
LK.getSound('bad').play();
LK.effects.flashScreen(0xff0000, 350);
if (lives <= 0) {
LK.getSound('lose').play();
LK.showGameOver();
return;
}
} else {
// Score!
score += item.scoreValue;
LK.setScore(score);
scoreTxt.setText(score);
LK.getSound('score').play();
// Animate item
tween(item, {
scaleX: 1.3,
scaleY: 1.3,
alpha: 0
}, {
duration: 220,
easing: tween.easeOut,
onFinish: function onFinish() {
if (item.parent) item.parent.removeChild(item);
}
});
}
// Remove item from array
items.splice(i, 1);
break;
}
}
}
// Game move/tap handler
game.down = function (x, y, obj) {
handleTap(x, y, obj);
};
// Main update loop
game.update = function () {
// Move items
for (var i = items.length - 1; i >= 0; i--) {
var item = items[i];
item.y += itemFallSpeed;
// If not tapped and off screen
if (!item.isTapped && item.y > 2732 + 100) {
// If good item missed, lose a life
if (!item.isBad) {
lives--;
updateLives();
LK.getSound('life').play();
LK.effects.flashScreen(0xff9800, 250);
if (lives <= 0) {
LK.getSound('lose').play();
LK.showGameOver();
return;
}
}
// Remove from game
if (item.parent) item.parent.removeChild(item);
items.splice(i, 1);
}
}
// Difficulty ramp: every 10 points, increase speed and spawn rate
var level = Math.floor(score / 10);
var targetSpeed = 7 + level * itemSpeedInc;
if (itemFallSpeed < targetSpeed) itemFallSpeed += 0.02;
var targetInterval = Math.max(minSpawnInterval, 1000 - level * itemSpawnDec);
if (spawnInterval > targetInterval) spawnInterval -= 1.5;
};
// Spawn timer
function startSpawnTimer() {
if (spawnTimer) LK.clearInterval(spawnTimer);
spawnTimer = LK.setInterval(function () {
spawnItem();
// Adjust interval
LK.clearInterval(spawnTimer);
startSpawnTimer();
}, spawnInterval);
}
startSpawnTimer();
// Reset on game over
LK.on('gameover', function () {
// Clean up
for (var i = 0; i < items.length; i++) {
if (items[i].parent) items[i].parent.removeChild(items[i]);
}
items = [];
lives = 3;
score = 0;
spawnInterval = 1000;
itemFallSpeed = 7;
updateLives();
scoreTxt.setText(score);
startSpawnTimer();
LK.playMusic('bgmusic');
});
// Reset on win (not used, but for completeness)
LK.on('youwin', function () {
for (var i = 0; i < items.length; i++) {
if (items[i].parent) items[i].parent.removeChild(items[i]);
}
items = [];
lives = 3;
score = 0;
spawnInterval = 1000;
itemFallSpeed = 7;
updateLives();
scoreTxt.setText(score);
startSpawnTimer();
LK.playMusic('bgmusic');
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,319 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Item class for all falling items
+var Item = Container.expand(function () {
+ var self = Container.call(this);
+ // Asset id and score are set on creation
+ self.assetId = 'item_basic';
+ self.scoreValue = 1;
+ self.isBad = false; // true for bomb/spike
+ self.isTapped = false;
+ // Attach asset
+ var itemGfx = self.attachAsset(self.assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // For pop effect
+ self.popEffect = null;
+ // Set up item visuals
+ self.setType = function (type) {
+ // type: {assetId, scoreValue, isBad}
+ self.assetId = type.assetId;
+ self.scoreValue = type.scoreValue;
+ self.isBad = type.isBad;
+ // Remove old asset if any
+ if (itemGfx && itemGfx.parent) itemGfx.parent.removeChild(itemGfx);
+ var newGfx = self.attachAsset(self.assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // For bomb/spike, add a little rotation
+ if (self.isBad) {
+ newGfx.rotation = Math.PI / 8 * (Math.random() > 0.5 ? 1 : -1);
+ }
+ };
+ // Animate pop effect
+ self.showPop = function (color) {
+ var pop = LK.getAsset('pop', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: color
+ });
+ pop.alpha = 0.7;
+ pop.scaleX = pop.scaleY = 0.5;
+ self.addChild(pop);
+ tween(pop, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 350,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ if (pop.parent) pop.parent.removeChild(pop);
+ }
+ });
+ };
+ // Called when tapped
+ self.onTap = function () {
+ if (self.isTapped) return;
+ self.isTapped = true;
+ if (self.isBad) {
+ self.showPop(0xff0000);
+ } else {
+ self.showPop(0xffffff);
+ }
+ };
+ // Called every tick
+ self.update = function () {
+ // Movement handled in game loop
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0x181818
+});
+
+/****
+* Game Code
+****/
+// Music
+// Sounds
+// Pop effect
+// Bad items
+// Good items
+// Item types
+var ITEM_TYPES = [{
+ assetId: 'item_basic',
+ scoreValue: 1,
+ isBad: false,
+ weight: 60
+}, {
+ assetId: 'item_rare',
+ scoreValue: 3,
+ isBad: false,
+ weight: 20
+}, {
+ assetId: 'item_legend',
+ scoreValue: 7,
+ isBad: false,
+ weight: 5
+}, {
+ assetId: 'item_bomb',
+ scoreValue: 0,
+ isBad: true,
+ weight: 10
+}, {
+ assetId: 'item_spike',
+ scoreValue: 0,
+ isBad: true,
+ weight: 5
+}];
+// Weighted random selection
+function pickItemType() {
+ var total = 0;
+ for (var i = 0; i < ITEM_TYPES.length; i++) total += ITEM_TYPES[i].weight;
+ var r = Math.random() * total;
+ var acc = 0;
+ for (var i = 0; i < ITEM_TYPES.length; i++) {
+ acc += ITEM_TYPES[i].weight;
+ if (r < acc) return ITEM_TYPES[i];
+ }
+ return ITEM_TYPES[0];
+}
+// Game state
+var items = [];
+var lives = 3;
+var score = 0;
+var spawnInterval = 1000; // ms
+var minSpawnInterval = 350;
+var spawnTimer = null;
+var itemFallSpeed = 7; // px per frame
+var itemSpeedInc = 0.15;
+var itemSpawnDec = 30;
+var lastTapTime = 0;
+// GUI
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var livesTxt = new Text2('♥♥♥', {
+ size: 90,
+ fill: 0xFF5252
+});
+livesTxt.anchor.set(1, 0);
+livesTxt.x = -40; // right padding
+LK.gui.topRight.addChild(livesTxt);
+// Prevent elements in top left 100x100
+// (No elements added to gui.topLeft or at (0,0))
+// Music
+LK.playMusic('bgmusic');
+// Spawn a new item
+function spawnItem() {
+ var type = pickItemType();
+ var item = new Item();
+ item.setType(type);
+ // Random X, avoid edges
+ var margin = 120;
+ var x = margin + Math.random() * (2048 - 2 * margin);
+ item.x = x;
+ item.y = -100;
+ // For touch detection
+ item.width = LK.getAsset(type.assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }).width;
+ item.height = LK.getAsset(type.assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }).height;
+ // Add to game
+ game.addChild(item);
+ items.push(item);
+}
+// Update lives display
+function updateLives() {
+ var s = '';
+ for (var i = 0; i < lives; i++) s += '♥';
+ livesTxt.setText(s);
+}
+// Handle tap
+function handleTap(x, y, obj) {
+ // Find topmost item under tap
+ for (var i = items.length - 1; i >= 0; i--) {
+ var item = items[i];
+ // Simple bounding box check
+ var dx = x - item.x;
+ var dy = y - item.y;
+ var w = item.width / 2;
+ var h = item.height / 2;
+ if (dx * dx / (w * w) + dy * dy / (h * h) <= 1.1) {
+ // Tapped this item
+ if (item.isTapped) continue;
+ item.onTap();
+ if (item.isBad) {
+ // Lose a life
+ lives--;
+ updateLives();
+ LK.getSound('bad').play();
+ LK.effects.flashScreen(0xff0000, 350);
+ if (lives <= 0) {
+ LK.getSound('lose').play();
+ LK.showGameOver();
+ return;
+ }
+ } else {
+ // Score!
+ score += item.scoreValue;
+ LK.setScore(score);
+ scoreTxt.setText(score);
+ LK.getSound('score').play();
+ // Animate item
+ tween(item, {
+ scaleX: 1.3,
+ scaleY: 1.3,
+ alpha: 0
+ }, {
+ duration: 220,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ if (item.parent) item.parent.removeChild(item);
+ }
+ });
+ }
+ // Remove item from array
+ items.splice(i, 1);
+ break;
+ }
+ }
+}
+// Game move/tap handler
+game.down = function (x, y, obj) {
+ handleTap(x, y, obj);
+};
+// Main update loop
+game.update = function () {
+ // Move items
+ for (var i = items.length - 1; i >= 0; i--) {
+ var item = items[i];
+ item.y += itemFallSpeed;
+ // If not tapped and off screen
+ if (!item.isTapped && item.y > 2732 + 100) {
+ // If good item missed, lose a life
+ if (!item.isBad) {
+ lives--;
+ updateLives();
+ LK.getSound('life').play();
+ LK.effects.flashScreen(0xff9800, 250);
+ if (lives <= 0) {
+ LK.getSound('lose').play();
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Remove from game
+ if (item.parent) item.parent.removeChild(item);
+ items.splice(i, 1);
+ }
+ }
+ // Difficulty ramp: every 10 points, increase speed and spawn rate
+ var level = Math.floor(score / 10);
+ var targetSpeed = 7 + level * itemSpeedInc;
+ if (itemFallSpeed < targetSpeed) itemFallSpeed += 0.02;
+ var targetInterval = Math.max(minSpawnInterval, 1000 - level * itemSpawnDec);
+ if (spawnInterval > targetInterval) spawnInterval -= 1.5;
+};
+// Spawn timer
+function startSpawnTimer() {
+ if (spawnTimer) LK.clearInterval(spawnTimer);
+ spawnTimer = LK.setInterval(function () {
+ spawnItem();
+ // Adjust interval
+ LK.clearInterval(spawnTimer);
+ startSpawnTimer();
+ }, spawnInterval);
+}
+startSpawnTimer();
+// Reset on game over
+LK.on('gameover', function () {
+ // Clean up
+ for (var i = 0; i < items.length; i++) {
+ if (items[i].parent) items[i].parent.removeChild(items[i]);
+ }
+ items = [];
+ lives = 3;
+ score = 0;
+ spawnInterval = 1000;
+ itemFallSpeed = 7;
+ updateLives();
+ scoreTxt.setText(score);
+ startSpawnTimer();
+ LK.playMusic('bgmusic');
+});
+// Reset on win (not used, but for completeness)
+LK.on('youwin', function () {
+ for (var i = 0; i < items.length; i++) {
+ if (items[i].parent) items[i].parent.removeChild(items[i]);
+ }
+ items = [];
+ lives = 3;
+ score = 0;
+ spawnInterval = 1000;
+ itemFallSpeed = 7;
+ updateLives();
+ scoreTxt.setText(score);
+ startSpawnTimer();
+ LK.playMusic('bgmusic');
});
\ No newline at end of file