User prompt
Fiz it
User prompt
Disable the ability to attack and jump when player is special idle
User prompt
Please fix the bug: 'Timeout.tick error: LK.effects.shakeScreen is not a function' in or related to this line: 'LK.effects.shakeScreen(10, 500); // Small screen shake effect' Line Number: 436
User prompt
Please fix the bug: 'TypeError: requestAnimationFrame is not a function' in or related to this line: 'requestAnimationFrame(shakeScreen);' Line Number: 415
User prompt
Please fix the bug: 'TypeError: LK.effects.shakeScreen is not a function' in or related to this line: 'LK.effects.shakeScreen(10, 500); // Small screen shake effect' Line Number: 400
User prompt
Add a white flash and small screen shake when switching to and back from special idle
User prompt
Make special idle last one more seconds
User prompt
play warcry sound when collecting helmet
Code edit (4 edits merged)
Please save this source code
User prompt
play warcry sound when collecting helmet
Code edit (1 edits merged)
Please save this source code
User prompt
spawn helmet every 20 seconds
User prompt
make sure helmet always spawns near the 2/3 of the playspace and scale in pulses by 50 %on top of floating
User prompt
make the feathers fly not only horizontally but add a little bit of verticality
User prompt
scale special_idle up by 25%
User prompt
there should be more feathers and they should also kill enemys if they intersect
User prompt
Introducing a dedicated flag (e.g., specialIdleActive) that you set and unset when swapping assets, or Using the updated visual container’s properties (making sure you reference the child that holds the new asset)
Code edit (2 edits merged)
Please save this source code
User prompt
doesn't work, when an enemy intersected with special_idle the game over was triggered
Code edit (1 edits merged)
Please save this source code
User prompt
any enemy who touches special_idle should die
User prompt
i'm not sure what feather effect is but ideally its a powerful attack where feathers are spawn on either side of the character and fly towards the exteriors of the playspace
User prompt
move it higher again
User prompt
move special_idle higher
User prompt
if i mouse over helmet to collect it nothing happens, it doesn't seem to work, can you fix it
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Shape = Container.expand(function (options) { var self = Container.call(this); self.attachAsset('shape', { width: options.width, height: options.height, anchorX: options.anchorX || 0, anchorY: options.anchorY || 0, color: options.color || 0x66ff00, alpha: typeof options.alpha === 'number' ? options.alpha : 0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ /**** * Utility: findChildByName ****/ function findChildByName(container, name) { for (var i = 0; i < container.children.length; i++) { if (container.children[i].name === name) { return container.children[i]; } } return null; } /**** * Global Variables ****/ var jumpColGlobal = null; var isPressHeld = false; var pressHoldStartTime = 0; var pressDownX = 0; var pressDownY = 0; var mouseX = 0; var mouseY = 0; game.move = function (x, y) { mouseX = x; mouseY = y; }; // Score setup var score = 0; var scoreTxt; function updateScoreDisplay() { game.removeChild(scoreTxt); scoreTxt = createScoreText(score); scoreTxt.scaleX = 1.0; scoreTxt.scaleY = 1.0; game.addChild(scoreTxt); tween(scoreTxt, { scaleX: 1.5, scaleY: 1.5 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100, easing: tween.easeIn }); } }); } function createScoreText(value) { var shadow = new Text2(String(value), { size: 600, fill: 0x000000, fontFamily: "Arial" }); shadow.name = "shadow"; shadow.anchor.set(0.5, 0); shadow.x = 4; shadow.y = 4; var main = new Text2(String(value), { size: 600, fill: 0xFF69B4, fontFamily: "Arial" }); main.name = "main"; main.anchor.set(0.5, 0); var container = new Container(); container.name = "scoreTxt"; container.x = 1024; container.y = 50; container.addChild(shadow); container.addChild(main); return container; } scoreTxt = createScoreText(score); scoreTxt.scaleX = 1.0; scoreTxt.scaleY = 1.0; LK.playMusic('bgm', { loop: true }); var bg01 = LK.getAsset('bg01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 }); game.addChild(bg01); game.addChild(scoreTxt); // High score display var highScore = storage.highScore || 0; var highScoreTxt = new Text2('High Score: ' + highScore, { size: 50, fill: 0xFFFFFF }); highScoreTxt.name = 'highScoreTxt'; highScoreTxt.anchor.set(1, 1); highScoreTxt.x = 1900; highScoreTxt.y = 2720; game.addChild(highScoreTxt); /**** * Petals ****/ var petals = []; for (var i = 0; i < 50; i++) { var petal = new Container(); petal.attachAsset('petals', { anchorX: 0.5, anchorY: 0.5, rotation: Math.random() * Math.PI * 2 }); petal.x = Math.random() * 2048; petal.y = Math.random() * 2732; petal.speedY = Math.random() * 2 + 1; petal.speedX = Math.random() * 2 - 1; petal.update = function () { this.y += this.speedY; this.x += this.speedX; if (this.y > 2732) { this.y = -50; this.x = Math.random() * 2048; } }; petals.push(petal); game.addChild(petal); } /**** * Player Setup ****/ var player = new Container(); var visualContainer = new Container(); visualContainer.name = 'visual'; var playerSprite = visualContainer.attachAsset('player_idle', { anchorX: 0.5, anchorY: 0.5 }); player.addChild(visualContainer); player.x = 1024; player.y = 2732 - 250; game.addChild(player); /**** * Idle Animations with idleActive flag ****/ var idleActive = true; function startBreathingAnimation() { if (!idleActive) { return; } tween(player, { scaleX: 1.05, scaleY: 1.05 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { if (!idleActive) { return; } tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 1000, easing: tween.easeInOut, onFinish: startBreathingAnimation }); } }); } function startTiltAnimation() { if (!idleActive) { return; } tween(player, { rotation: Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { if (!idleActive) { return; } tween(player, { rotation: -Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { if (!idleActive) { return; } tween(player, { rotation: 0 }, { duration: 500, easing: tween.easeInOut, onFinish: startTiltAnimation }); } }); } }); } startBreathingAnimation(); startTiltAnimation(); /**** * Attack Collider ****/ var attackCol = LK.getAsset('attackcol', { anchorX: 0.5, anchorY: 0.5, alpha: 0.75 }); game.addChild(attackCol); attackCol.visible = false; attackCol.alpha = 0; /**** * POWER-UP: Helmet ****/ // Helmets will be collected using the same mouse-pointer collision as coins. var helmets = []; function spawnHelmet() { if (helmets.length > 0) { return; } // Only one at a time var helmet = new Container(); helmet.attachAsset('helmet', { anchorX: 0.5, anchorY: 0.5 }); helmet.x = Math.random() * 2048; helmet.y = Math.random() * (2732 - 200) + 100; game.addChild(helmet); helmets.push(helmet); tween(helmet, { y: helmet.y - 20 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(helmet, { y: helmet.y + 20 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { // Loop floating animation tween(helmet, { y: helmet.y - 20 }, { duration: 1000, easing: tween.easeInOut }); } }); } }); } LK.setInterval(spawnHelmet, 10000); var helmetActive = false; function activateHelmetPowerUp() { if (helmetActive) { return; } helmetActive = true; idleActive = false; // pause idle animations swapPlayerVisual('special_idle', player.x, player.y, visualContainer.scaleX); LK.setTimeout(function () { // Special attack: spawn feather effects var leftFeather = new Container(); leftFeather.attachAsset('feather', { anchorX: 0.5, anchorY: 0.5 }); leftFeather.x = player.x - 50; leftFeather.y = player.y; game.addChild(leftFeather); var rightFeather = new Container(); rightFeather.attachAsset('feather', { anchorX: 0.5, anchorY: 0.5 }); rightFeather.x = player.x + 50; rightFeather.y = player.y; game.addChild(rightFeather); tween(leftFeather, { x: leftFeather.x - 500, alpha: 0 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { leftFeather.destroy(); } }); tween(rightFeather, { x: rightFeather.x + 500, alpha: 0 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { rightFeather.destroy(); } }); swapPlayerVisual('player_idle', player.x, player.y, visualContainer.scaleX); idleActive = true; startBreathingAnimation(); startTiltAnimation(); helmetActive = false; }, 5000); } /**** * Swap Player Sprite Function ****/ function swapPlayerVisual(newVisualId, x, y) { var flip = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; var onDone = arguments.length > 3 ? arguments[3] : undefined; var visualContainer = player.findChildByName('visual'); if (!visualContainer) { visualContainer = new Container(); visualContainer.name = 'visual'; player.addChild(visualContainer); } else { visualContainer.removeChildAt(0); } playerSprite = visualContainer.attachAsset(newVisualId, { anchorX: 0.5, anchorY: 0.5, y: newVisualId === 'special_idle' ? -100 : 0 }); visualContainer.scaleX = flip; player.x = x; player.y = y; if (newVisualId === 'player_jump') { flip = Math.random() < 0.5 ? -1 : 1; visualContainer.scaleX = flip; jumpColGlobal = LK.getAsset('jumpcol', { anchorX: 0.5, anchorY: 0.5, x: x, y: y + player.height / 2, alpha: 0 }); game.addChild(jumpColGlobal); tween(jumpColGlobal, { y: jumpColGlobal.y - 600 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(jumpColGlobal, { y: 2732 - 250 + player.height / 2 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { jumpColGlobal.destroy(); jumpColGlobal = null; } }); } }); } if (typeof onDone === 'function') { if (newVisualId === 'player_idle') { idleActive = true; startBreathingAnimation(); startTiltAnimation(); } onDone(); } } /**** * Input Logic ****/ var isSequenceRunning = false; var isJumping = false; var playerState = 'idle'; game.down = function (x, y) { if (isSequenceRunning) { return; } isPressHeld = true; pressHoldStartTime = Date.now(); pressDownX = x; pressDownY = y; // Jump if tapped in top 2/3 if (y < 2732 * 2 / 3 && !isJumping) { isJumping = true; LK.getSound('hup').play(); idleActive = false; swapPlayerVisual('player_jump', player.x, player.y); for (var i = 0; i < 10; i++) { var p = LK.getAsset('dust', { anchorX: 0.5, anchorY: 0.5, x: player.x + (Math.random() * 100 - 50), y: player.y + (Math.random() * 100 - 50) }); game.addChild(p); tween(p, { alpha: 0, x: p.x + (Math.random() * 200 - 100), y: p.y - Math.random() * 200 }, { duration: 500, onFinish: function onFinish() { p.destroy(); } }); } tween(player, { y: player.y - 600 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(player, { y: 2732 - 250 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { for (var j = 0; j < 10; j++) { var pp = LK.getAsset('dust', { anchorX: 0.5, anchorY: 0.5, x: player.x + (Math.random() * 100 - 50), y: player.y + (Math.random() * 100 - 50) }); game.addChild(pp); tween(pp, { alpha: 0, x: pp.x + (Math.random() * 200 - 100), y: pp.y + Math.random() * 200 }, { duration: 500, onFinish: function onFinish() { pp.destroy(); } }); } isJumping = false; idleActive = true; var landingFlip = Math.random() < 0.5 ? -1 : 1; swapPlayerVisual('player_idle', 1024, 2732 - 250, landingFlip, function () { startBreathingAnimation(); startTiltAnimation(); }); var v = player.findChildByName('visual'); if (v) { var dir = v.scaleX < 0 ? -1 : 1; tween(v, { scaleX: dir * 1.3, scaleY: 1.3 }, { duration: 50, onFinish: function onFinish() { tween(v, { scaleX: dir * 1.0, scaleY: 1.0 }, { duration: 100 }); } }); } } }); } }); return; } // Attack if tapped in bottom 1/3 isSequenceRunning = true; idleActive = false; var flip = x < 1024 ? -1 : 1; swapPlayerVisual('player_attackf01', 1024, 2732 - 250, flip); LK.getSound('retroslash').play(); var vis = player.findChildByName('visual'); if (vis) { tween(vis, { scaleX: flip * 1.3, scaleY: 1.3 }, { duration: 50, onFinish: function onFinish() { tween(vis, { scaleX: flip * 1.0, scaleY: 1.0 }, { duration: 100 }); } }); } LK.setTimeout(function () { swapPlayerVisual('player_attackf02', 1024, 2732 - 250, flip); attackCol.width = 180; attackCol.height = 180; attackCol.x = flip === -1 ? 874 : 1174; attackCol.y = 2732 - 250; attackCol.scaleX = flip; attackCol.visible = true; LK.setTimeout(function () { if (attackCol) { attackCol.visible = false; } swapPlayerVisual('player_idle', 1024, 2732 - 250, 1, function () { idleActive = true; startBreathingAnimation(); startTiltAnimation(); }); isSequenceRunning = false; playerState = 'idle'; }, 250); }, 250); }; /**** * Enemies & Spawn ****/ var enemies = []; function spawnEnemy() { var e = new Container(); var hitbox = new Shape({ width: 200, height: 209, anchorX: 0.5, anchorY: 0.5, color: 0x00FF00, alpha: 0 }); hitbox.x = 0; hitbox.y = 0; e.addChild(hitbox); var gfx = e.attachAsset('enemy01', { anchorX: 0.5, anchorY: 0.5 }); var fromLeft = Math.random() < 0.5; e.x = fromLeft ? -gfx.width / 2 : 2048 + gfx.width / 2; e.y = 2732 - 225; e.speedX = fromLeft ? Math.random() * 4 + 2 : -(Math.random() * 4 + 2); gfx.scaleX = fromLeft ? 1 : -1; var baseY = e.y; function bounce() { tween(e, { y: baseY - 50 }, { duration: 500, easing: tween.bounceInOut, onFinish: function onFinish() { tween(e, { y: baseY }, { duration: 500, easing: tween.bounceInOut, onFinish: bounce }); } }); } bounce(); enemies.push(e); game.addChild(e); } LK.setInterval(spawnEnemy, Math.random() * 1500 + 1000); /**** * Projectile Logic ****/ var projectiles = []; function spawnProjectile(targetX, targetY) { var proj = new Container(); proj.attachAsset('player_throw', { anchorX: 0.5, anchorY: 0.5 }); LK.getSound('throwsnd').play(); proj.x = player.x; proj.y = player.y; var cloudSmoke = LK.getAsset('cloudsmoke', { anchorX: 0.5, anchorY: 0.5, x: proj.x, y: proj.y, alpha: 0.75 }); game.addChild(cloudSmoke); tween(cloudSmoke, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { cloudSmoke.destroy(); } }); proj.x = player.x; proj.y = player.y; var dx = targetX - player.x, dy = targetY - player.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist !== 0) { dx /= dist; dy /= dist; } var speed = 25; proj.vx = dx * speed; proj.vy = dy * speed; proj.scaleX = targetX < player.x ? -1 : 1; proj.distanceTraveled = 0; proj.maxDistance = 1000; projectiles.push(proj); game.addChild(proj); } /**** * Coins ****/ var coins = []; function dropCoin(x, y) { var rand = Math.random(); if (rand < 0.5) { var coin = new Container(); coin.type = 'silver'; coin.attachAsset('silver_coin', { anchorX: 0.5, anchorY: 0.5 }); coin.x = x; coin.y = y; game.addChild(coin); coins.push(coin); tween(coin, { y: coin.y - 20 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(coin, { y: coin.y + 20 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(coin, { y: coin.y - 20 }, { duration: 1000, easing: tween.easeInOut }); } }); } }); } else if (rand < 0.6) { var coin = new Container(); coin.type = 'gold'; coin.attachAsset('gold_coin', { anchorX: 0.5, anchorY: 0.5 }); coin.x = x; coin.y = y; game.addChild(coin); coins.push(coin); } } /**** * Enemy Hit Logic ****/ function handleEnemyHit(enemy, index, attackType) { if (!enemies.includes(enemy)) { return; } LK.getSound('slimedeath').play(); if (enemy.bounceTween && typeof enemy.bounceTween.cancel === 'function') { enemy.bounceTween.cancel(); } tween(enemy, { tint: 0xFF0000 }, { duration: 0, onFinish: function onFinish() { tween(enemy, { scaleX: 1.3, scaleY: 1.3 }, { duration: 50, onFinish: function onFinish() { tween(enemy, { scaleX: 0.5, scaleY: 0.5, alpha: 0 }, { duration: 100, onFinish: function onFinish() { var idx = enemies.indexOf(enemy); if (idx !== -1) { enemies.splice(idx, 1); } enemy.destroy(); if (!enemy.coinsDropped) { dropCoin(enemy.x, enemy.y); enemy.coinsDropped = true; } if (!enemy.scoreCounted) { if (attackType === 'melee') { score += 2; } else if (attackType === 'throw') { score += 1; } else { score++; } updateScoreDisplay(); enemy.scoreCounted = true; } } }); } }); } }); } function handleEnemyJumpHit(enemy, index) { if (!enemies.includes(enemy)) { return; } LK.getSound('boing').play(); if (enemy.bounceTween && typeof enemy.bounceTween.cancel === 'function') { enemy.bounceTween.cancel(); } tween(enemy, { tint: 0xFF0000 }, { duration: 0, onFinish: function onFinish() { var targetX = enemy.x < 1024 ? -300 : 2048 + 300; var targetY = enemy.y - 600; tween(enemy, { x: targetX, y: targetY, alpha: 0 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { var idx = enemies.indexOf(enemy); if (idx !== -1) { enemies.splice(idx, 1); } enemy.destroy(); if (!enemy.coinsDropped) { dropCoin(enemy.x, enemy.y); enemy.coinsDropped = true; } if (!enemy.scoreCounted) { score += 3; updateScoreDisplay(); enemy.scoreCounted = true; } } }); } }); } /**** * findChildByName Helper ****/ Container.prototype.findChildByName = function (name) { for (var i = 0; i < this.children.length; i++) { if (this.children[i].name === name) { return this.children[i]; } } return null; }; /**** * game.up to Reset Press ****/ game.up = function (x, y) { isPressHeld = false; pressHoldStartTime = 0; }; /**** * Main Update ****/ game.update = function () { // Check hold for long press projectile if (isPressHeld) { var holdDuration = Date.now() - pressHoldStartTime; if (holdDuration > 500) { console.log("Long press detected, spawn projectile!"); isPressHeld = false; spawnProjectile(pressDownX, pressDownY); } } // Update projectiles for (var p = projectiles.length - 1; p >= 0; p--) { var proj = projectiles[p]; proj.x += proj.vx; proj.y += proj.vy; var stepDist = Math.sqrt(proj.vx * proj.vx + proj.vy * proj.vy); proj.distanceTraveled += stepDist; if (proj.distanceTraveled > proj.maxDistance) { projectiles.splice(p, 1); proj.destroy(); continue; } if (proj.x < -100 || proj.x > 2148 || proj.y < -100 || proj.y > 2832) { projectiles.splice(p, 1); proj.destroy(); continue; } for (var ei = enemies.length - 1; ei >= 0; ei--) { var enemy = enemies[ei]; if (proj.intersects(enemy)) { handleEnemyHit(enemy, ei, 'throw'); projectiles.splice(p, 1); proj.destroy(); break; } } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.x += e.speedX; if (e.x < -300 || e.x > 2048 + 300) { var index = enemies.indexOf(e); if (index !== -1) { enemies.splice(index, 1); } e.destroy(); continue; } if (jumpColGlobal && jumpColGlobal.visible && e.intersects(jumpColGlobal)) { handleEnemyJumpHit(e, i); continue; } if (attackCol.visible && e.intersects(attackCol)) { handleEnemyHit(e, i, 'melee'); } // Collision with player: // If player sprite is "special_idle", then kill enemy; else, game over. if (!isJumping && !attackCol.visible && e.intersects(player)) { if (playerSprite && playerSprite.assetId === 'special_idle') { handleEnemyHit(e, i, 'special_idle'); continue; } storage.lastScore = score; LK.showGameOver(); } } // Update coins (using mouse-pointer collision) for (var i = coins.length - 1; i >= 0; i--) { var coin = coins[i]; if (!coin.collecting && Math.abs(coin.x - mouseX) < 32.5 && Math.abs(coin.y - mouseY) < 32.5) { coin.collecting = true; tween(coin, { x: scoreTxt.x, y: scoreTxt.y, alpha: 0 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { var index = coins.indexOf(coin); if (index !== -1) { coins.splice(index, 1); } if (coin.type === 'silver') { LK.getSound('silversnd').play(); score += 5; } else if (coin.type === 'gold') { LK.getSound('goldsnd').play(); score += 10; } updateScoreDisplay(); coin.destroy(); } }); } } // Update helmets (using same mouse-pointer collision) for (var i = helmets.length - 1; i >= 0; i--) { var helm = helmets[i]; if (!helm.collecting && Math.abs(helm.x - mouseX) < 50 && Math.abs(helm.y - mouseY) < 50) { helm.collecting = true; tween(helm, { x: scoreTxt.x, y: scoreTxt.y, alpha: 0 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { var index = helmets.indexOf(helm); if (index !== -1) { helmets.splice(index, 1); } activateHelmetPowerUp(); updateScoreDisplay(); helm.destroy(); } }); } } };
===================================================================
--- original.js
+++ change.js
@@ -6,18 +6,17 @@
/****
* Classes
****/
-// Basic Shape class (so "Shape" is defined)
var Shape = Container.expand(function (options) {
var self = Container.call(this);
self.attachAsset('shape', {
width: options.width,
height: options.height,
anchorX: options.anchorX || 0,
anchorY: options.anchorY || 0,
color: options.color || 0x66ff00,
- alpha: typeof options.alpha === 'number' ? options.alpha : 0 // invisible shape
+ alpha: typeof options.alpha === 'number' ? options.alpha : 0
});
return self;
});
@@ -45,14 +44,12 @@
/****
* Global Variables
****/
var jumpColGlobal = null;
-// For projectile input tracking
var isPressHeld = false;
var pressHoldStartTime = 0;
var pressDownX = 0;
var pressDownY = 0;
-// Global mouse coordinates
var mouseX = 0;
var mouseY = 0;
game.move = function (x, y) {
mouseX = x;
@@ -174,18 +171,25 @@
player.x = 1024;
player.y = 2732 - 250;
game.addChild(player);
/****
-* Idle Animations
+* Idle Animations with idleActive flag
****/
+var idleActive = true;
function startBreathingAnimation() {
+ if (!idleActive) {
+ return;
+ }
tween(player, {
scaleX: 1.05,
scaleY: 1.05
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
+ if (!idleActive) {
+ return;
+ }
tween(player, {
scaleX: 1.0,
scaleY: 1.0
}, {
@@ -196,20 +200,29 @@
}
});
}
function startTiltAnimation() {
+ if (!idleActive) {
+ return;
+ }
tween(player, {
rotation: Math.PI / 32
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
+ if (!idleActive) {
+ return;
+ }
tween(player, {
rotation: -Math.PI / 32
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
+ if (!idleActive) {
+ return;
+ }
tween(player, {
rotation: 0
}, {
duration: 500,
@@ -234,22 +247,21 @@
game.addChild(attackCol);
attackCol.visible = false;
attackCol.alpha = 0;
/****
-* Power-Up: Helmet
+* POWER-UP: Helmet
****/
-// Global array for helmet powerups
+// Helmets will be collected using the same mouse-pointer collision as coins.
var helmets = [];
function spawnHelmet() {
if (helmets.length > 0) {
- return; // Exit if there's already a helmet on screen
- }
+ return;
+ } // Only one at a time
var helmet = new Container();
helmet.attachAsset('helmet', {
anchorX: 0.5,
anchorY: 0.5
});
- // Spawn at a random position within visible bounds
helmet.x = Math.random() * 2048;
helmet.y = Math.random() * (2732 - 200) + 100;
game.addChild(helmet);
helmets.push(helmet);
@@ -264,48 +276,31 @@
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
+ // Loop floating animation
tween(helmet, {
y: helmet.y - 20
}, {
duration: 1000,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(helmet, {
- y: helmet.y + 20
- }, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(helmet, {
- y: helmet.y - 20
- }, {
- duration: 1000,
- easing: tween.easeInOut
- });
- }
- });
- }
+ easing: tween.easeInOut
});
}
});
}
});
}
-LK.setInterval(spawnHelmet, 10000); // spawn a helmet every 10 seconds
-// Power-up activation flag to prevent re-triggering
+LK.setInterval(spawnHelmet, 10000);
var helmetActive = false;
function activateHelmetPowerUp() {
if (helmetActive) {
return;
- } // already active
+ }
helmetActive = true;
- // Change player's sprite to special_idle
+ idleActive = false; // pause idle animations
swapPlayerVisual('special_idle', player.x, player.y, visualContainer.scaleX);
- // Remain in power-up state for 5 seconds, then perform special attack (feather) and revert
LK.setTimeout(function () {
- // Spawn feather effects on either side of the player
+ // Special attack: spawn feather effects
var leftFeather = new Container();
leftFeather.attachAsset('feather', {
anchorX: 0.5,
anchorY: 0.5
@@ -320,9 +315,8 @@
});
rightFeather.x = player.x + 50;
rightFeather.y = player.y;
game.addChild(rightFeather);
- // Animate feathers moving outward
tween(leftFeather, {
x: leftFeather.x - 500,
alpha: 0
}, {
@@ -341,19 +335,21 @@
onFinish: function onFinish() {
rightFeather.destroy();
}
});
- // Revert player's sprite back to normal idle
swapPlayerVisual('player_idle', player.x, player.y, visualContainer.scaleX);
+ idleActive = true;
+ startBreathingAnimation();
+ startTiltAnimation();
helmetActive = false;
}, 5000);
}
/****
* Swap Player Sprite Function
****/
function swapPlayerVisual(newVisualId, x, y) {
- var flip = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
- var onDone = arguments.length > 4 ? arguments[4] : undefined;
+ var flip = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+ var onDone = arguments.length > 3 ? arguments[3] : undefined;
var visualContainer = player.findChildByName('visual');
if (!visualContainer) {
visualContainer = new Container();
visualContainer.name = 'visual';
@@ -363,9 +359,9 @@
}
playerSprite = visualContainer.attachAsset(newVisualId, {
anchorX: 0.5,
anchorY: 0.5,
- y: newVisualId === 'special_idle' ? -100 : 0 // Move special_idle higher
+ y: newVisualId === 'special_idle' ? -100 : 0
});
visualContainer.scaleX = flip;
player.x = x;
player.y = y;
@@ -400,8 +396,9 @@
});
}
if (typeof onDone === 'function') {
if (newVisualId === 'player_idle') {
+ idleActive = true;
startBreathingAnimation();
startTiltAnimation();
}
onDone();
@@ -424,10 +421,10 @@
// Jump if tapped in top 2/3
if (y < 2732 * 2 / 3 && !isJumping) {
isJumping = true;
LK.getSound('hup').play();
+ idleActive = false;
swapPlayerVisual('player_jump', player.x, player.y);
- // Dust effect
for (var i = 0; i < 10; i++) {
var p = LK.getAsset('dust', {
anchorX: 0.5,
anchorY: 0.5,
@@ -457,9 +454,8 @@
}, {
duration: 300,
easing: tween.bounceOut,
onFinish: function onFinish() {
- // Landing dust effect
for (var j = 0; j < 10; j++) {
var pp = LK.getAsset('dust', {
anchorX: 0.5,
anchorY: 0.5,
@@ -478,8 +474,9 @@
}
});
}
isJumping = false;
+ idleActive = true;
var landingFlip = Math.random() < 0.5 ? -1 : 1;
swapPlayerVisual('player_idle', 1024, 2732 - 250, landingFlip, function () {
startBreathingAnimation();
startTiltAnimation();
@@ -509,8 +506,9 @@
return;
}
// Attack if tapped in bottom 1/3
isSequenceRunning = true;
+ idleActive = false;
var flip = x < 1024 ? -1 : 1;
swapPlayerVisual('player_attackf01', 1024, 2732 - 250, flip);
LK.getSound('retroslash').play();
var vis = player.findChildByName('visual');
@@ -542,8 +540,9 @@
if (attackCol) {
attackCol.visible = false;
}
swapPlayerVisual('player_idle', 1024, 2732 - 250, 1, function () {
+ idleActive = true;
startBreathingAnimation();
startTiltAnimation();
});
isSequenceRunning = false;
@@ -551,9 +550,9 @@
}, 250);
}, 250);
};
/****
-* Enemies Array & Spawn
+* Enemies & Spawn
****/
var enemies = [];
function spawnEnemy() {
var e = new Container();
@@ -821,9 +820,9 @@
/****
* Main Update
****/
game.update = function () {
- // Check hold duration for long press projectile
+ // Check hold for long press projectile
if (isPressHeld) {
var holdDuration = Date.now() - pressHoldStartTime;
if (holdDuration > 500) {
console.log("Long press detected, spawn projectile!");
@@ -876,18 +875,20 @@
}
if (attackCol.visible && e.intersects(attackCol)) {
handleEnemyHit(e, i, 'melee');
}
+ // Collision with player:
+ // If player sprite is "special_idle", then kill enemy; else, game over.
if (!isJumping && !attackCol.visible && e.intersects(player)) {
- if (playerSprite && playerSprite.assetId === 'special_idle' && e.intersects(playerSprite)) {
+ if (playerSprite && playerSprite.assetId === 'special_idle') {
handleEnemyHit(e, i, 'special_idle');
continue;
}
storage.lastScore = score;
LK.showGameOver();
}
}
- // Update coins (using mouse collision)
+ // Update coins (using mouse-pointer collision)
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (!coin.collecting && Math.abs(coin.x - mouseX) < 32.5 && Math.abs(coin.y - mouseY) < 32.5) {
coin.collecting = true;
@@ -915,9 +916,9 @@
}
});
}
}
- // Update helmets (power-up) by checking collision with player
+ // Update helmets (using same mouse-pointer collision)
for (var i = helmets.length - 1; i >= 0; i--) {
var helm = helmets[i];
if (!helm.collecting && Math.abs(helm.x - mouseX) < 50 && Math.abs(helm.y - mouseY) < 50) {
helm.collecting = true;
high definition super nintendo background of a japanese sakura tree forest Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
2d snes dust particle. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
silver coin, $ sign on it, snes art. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
gold coin, $ sign on it, snes art. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
snes white feather. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
add a wooden shield
white 3d questionmark with a shadow. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
caligraphy paper front facing flat. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
the letters 'Ready' in 3d with a japanese cartoon cherry blossom flair. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
add eyebrows