User prompt
Make a start screen
User prompt
Once destroy the spike balls in your power up form, they make an explosion animation
User prompt
Perfect adjust once you get the golden bird power up you turn into a golden bird
User prompt
Make the golden bird as separate asset
User prompt
Make a power up called the golden Bird when touched it, grant the bird immunity to the obstacle
User prompt
Make obstacles slower
User prompt
Make less projectiles of the Ogbugh
User prompt
Make the obstacles faster and make more of them
User prompt
Please fix the bug: 'TypeError: obs.update is not a function. (In 'obs.update()', 'obs.update' is undefined)' in or related to this line: 'obs.update();' Line Number: 170
User prompt
Make more obstacles
User prompt
Instead of bouncing off objects, and she just falls straight down
Code edit (1 edits merged)
Please save this source code
User prompt
Head Dodge: Face Tracker Challenge
Initial prompt
OK, so I have an idea so basically it’s gonna be an object tracking my head move and they’re gonna be these little obstacles that I have to die using my head tracking
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var facekit = LK.import("@upit/facekit.v1"); /**** * Classes ****/ // Fast obstacle (normal size, very fast) var FastObstacle = Container.expand(function () { var self = Container.call(this); // Tint to distinguish var asset = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); asset.tint = 0x3498db; return self; }); // Large obstacle (slower, bigger) var LargeObstacle = Container.expand(function () { var self = Container.call(this); // Override asset var asset = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); return self; }); // Obstacle base class var Obstacle = Container.expand(function () { var self = Container.call(this); // Default asset, can be overridden by subclasses var obstacleAsset = self.attachAsset('obstacle', { 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; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerAsset = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); // No update needed; position is set by facekit in main game loop return self; }); // Small obstacle (faster, smaller) var SmallObstacle = Container.expand(function () { var self = Container.call(this); // Override asset var asset = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.7, scaleY: 0.7 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181818 }); /**** * Game Code ****/ // Obstacle: red box // Player avatar: green ellipse // Score display var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Player instance var player = new Player(); game.addChild(player); // Start at center player.x = 2048 / 2; player.y = 2732 / 2; // Obstacles array var obstacles = []; // Game state var isGameOver = false; var lastScore = 0; // Helper: Clamp value between min and max function clamp(val, min, max) { if (val < min) return min; if (val > max) return max; return val; } // Helper: Spawn a new obstacle from a random edge function spawnObstacle() { // Randomly choose obstacle type var typeRand = Math.random(); var obs, speed; var x = 200 + Math.random() * (2048 - 400); var y = -80; if (typeRand < 0.2) { // 20% Large, slow obs = new LargeObstacle(); speed = 6 + Math.random() * 2; // 6-8 px/frame } else if (typeRand < 0.5) { // 30% Small, fast obs = new SmallObstacle(); speed = 12 + Math.random() * 4; // 12-16 px/frame } else if (typeRand < 0.7) { // 20% Fast, normal size, blue obs = new FastObstacle(); speed = 16 + Math.random() * 4; // 16-20 px/frame } else { // 30% Normal obs = new Obstacle(); speed = 8 + Math.random() * 6; // 8-14 px/frame } obs.x = x; obs.y = y; obs.vx = 0; obs.vy = speed; obstacles.push(obs); game.addChild(obs); } // Score logic function setScore(val) { LK.setScore(val); scoreTxt.setText(val); } // Main update loop game.update = function () { if (isGameOver) return; // Facekit: update player position // Use noseTip if available, else mouthCenter var fx = facekit.noseTip && facekit.noseTip.x ? facekit.noseTip.x : facekit.mouthCenter.x; var fy = facekit.noseTip && facekit.noseTip.y ? facekit.noseTip.y : facekit.mouthCenter.y; // Clamp to keep player inside screen (with margin for player size) var margin = player.width / 2 + 10; player.x = clamp(fx, margin, 2048 - margin); player.y = clamp(fy, margin, 2732 - margin); // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obs = obstacles[i]; obs.update(); // Remove if out of bounds if (obs.x < -200 || obs.x > 2048 + 200 || obs.y < -200 || obs.y > 2732 + 200) { obs.destroy(); obstacles.splice(i, 1); continue; } // Collision detection if (obs.intersects(player)) { // Game over isGameOver = true; LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } // Score: survive longer = higher score if (LK.ticks % 6 === 0) { // ~10 times per second setScore(LK.getScore() + 1); } // Spawn obstacles at intervals, increase frequency over time var spawnInterval = 90 - Math.min(60, Math.floor(LK.getScore() / 30) * 10); // Faster as score increases if (LK.ticks % spawnInterval === 0) { spawnObstacle(); } }; // Reset state on new game game.on('reset', function () { // Remove all obstacles for (var i = 0; i < obstacles.length; i++) { obstacles[i].destroy(); } obstacles = []; setScore(0); isGameOver = false; // Center player player.x = 2048 / 2; player.y = 2732 / 2; }); // Ensure player is not in top-left 100x100 area player.x = 2048 / 2; player.y = 2732 / 2; if (player.x < 180) player.x = 180; if (player.y < 180) player.y = 180;
===================================================================
--- original.js
+++ change.js
@@ -6,16 +6,39 @@
/****
* Classes
****/
-// Obstacle class
+// Fast obstacle (normal size, very fast)
+var FastObstacle = Container.expand(function () {
+ var self = Container.call(this);
+ // Tint to distinguish
+ var asset = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ asset.tint = 0x3498db;
+ return self;
+});
+// Large obstacle (slower, bigger)
+var LargeObstacle = Container.expand(function () {
+ var self = Container.call(this);
+ // Override asset
+ var asset = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ return self;
+});
+// Obstacle base class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
+ // Default asset, can be overridden by subclasses
var obstacleAsset = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
- // Direction and speed will be set on creation
self.vx = 0;
self.vy = 0;
self.update = function () {
self.x += self.vx;
@@ -32,8 +55,20 @@
});
// No update needed; position is set by facekit in main game loop
return self;
});
+// Small obstacle (faster, smaller)
+var SmallObstacle = Container.expand(function () {
+ var self = Container.call(this);
+ // Override asset
+ var asset = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.7,
+ scaleY: 0.7
+ });
+ return self;
+});
/****
* Initialize Game
****/
@@ -71,13 +106,30 @@
return val;
}
// Helper: Spawn a new obstacle from a random edge
function spawnObstacle() {
- // Always spawn from the top, fall straight down
- var obs = new Obstacle();
- var speed = 8 + Math.random() * 6; // 8-14 px/frame
+ // Randomly choose obstacle type
+ var typeRand = Math.random();
+ var obs, speed;
var x = 200 + Math.random() * (2048 - 400);
var y = -80;
+ if (typeRand < 0.2) {
+ // 20% Large, slow
+ obs = new LargeObstacle();
+ speed = 6 + Math.random() * 2; // 6-8 px/frame
+ } else if (typeRand < 0.5) {
+ // 30% Small, fast
+ obs = new SmallObstacle();
+ speed = 12 + Math.random() * 4; // 12-16 px/frame
+ } else if (typeRand < 0.7) {
+ // 20% Fast, normal size, blue
+ obs = new FastObstacle();
+ speed = 16 + Math.random() * 4; // 16-20 px/frame
+ } else {
+ // 30% Normal
+ obs = new Obstacle();
+ speed = 8 + Math.random() * 6; // 8-14 px/frame
+ }
obs.x = x;
obs.y = y;
obs.vx = 0;
obs.vy = speed;