User prompt
Please fix the bug: 'Timeout.tick error: bounceTween is not defined' in or related to this line: 'e.bounceTween = bounceTween;' Line Number: 352
User prompt
Inside spawnEnemy(), store a reference to the bounce tween and cancel it on hit: function spawnEnemy() { var e = new Container(); 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; // Bounce logic with cancel support var baseY = e.y; let bounceTween; function bounce() { bounceTween = tween(e, { y: baseY - 50 }, { duration: 500, easing: tween.bounceInOut, onFinish: () => { bounceTween = tween(e, { y: baseY }, { duration: 500, easing: tween.bounceInOut, onFinish: bounce }); } }); } bounce(); e.bounceTween = bounceTween; enemies.push(e); game.addChild(e); }
User prompt
Replace your updateScoreText() with this cleaner version: // Create and add score display once var score = 0; var scoreTxt = new Text2(String(score), { size: 300, fill: 0xFF69B4, stroke: 0x000000, strokeThickness: 5 }); scoreTxt.anchor.set(0.5, 0); scoreTxt.x = 1024; scoreTxt.y = 50; LK.gui.top.addChild(scoreTxt); // Update without destroying function updateScoreText(newValue) { score = newValue; scoreTxt.text = String(score); tween(scoreTxt, { scaleX: 1.5, scaleY: 1.5 }, { duration: 100, easing: tween.easeOut, onFinish: () => { tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100, easing: tween.easeIn }); } }); }
User prompt
Replace this block: if (attackCol && e.intersects(attackCol)) { e.update = () => {}; LK.getSound('slimedeath').play(); tween(e, { scaleX: 1.3, scaleY: 1.3 }, { duration: 50, onFinish: () => tween(e, { scaleX: 0.5, scaleY: 0.5, alpha: 0 }, { duration: 100, onFinish: () => e.destroy() }) }); enemies.splice(i, 1); LK.setScore(++score); updateScoreText(score); } With this corrected version: if (attackCol && e.intersects(attackCol)) { e.update = () => {}; LK.getSound('slimedeath').play(); enemies.splice(i, 1); // Remove immediately from array tween(e, { scaleX: 1.3, scaleY: 1.3 }, { duration: 50, onFinish: () => { tween(e, { scaleX: 0.5, scaleY: 0.5, alpha: 0, tint: 0xFF0000 }, { duration: 100, onFinish: () => e.destroy() }); } }); score++; updateScoreText(score); }
User prompt
var score = 0; function updateScoreText(value) { LK.gui.top.removeChild(scoreTxt); scoreTxt = new Text2(String(value), { size: 300, fill: 0xFF69B4, stroke: 0x000000, strokeThickness: 5 }); scoreTxt.anchor.set(0.5, 0); scoreTxt.x = 1024; scoreTxt.y = 50; LK.gui.top.addChild(scoreTxt); tween(scoreTxt, { scaleX: 1.5, scaleY: 1.5 }, { duration: 100, easing: tween.easeOut, onFinish: () => { tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100, easing: tween.easeIn }); } }); }
Code edit (3 edits merged)
Please save this source code
User prompt
// TODO: PASTE THIS BLOCK AFTER YOUR ASSET INITs AND PLUGIN IMPORTS // You already have tween, sounds, and assets defined, so this should replace the current game setup // Game Setup var game = new LK.Game({ backgroundColor: 0x000000 }); LK.playMusic('bgm', { loop: true }); var bg01 = LK.getAsset('bg01', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 }); game.addChild(bg01); // PLAYER SETUP var player = new Container(); var playerSprite = player.attachAsset('player_idle', { anchorX: 0.5, anchorY: 0.5 }); player.x = 1024; player.y = 2732 - 250; game.addChild(player); var isJumping = false; var isSequenceRunning = false; var playerState = 'idle'; var attackCol = null; var playerFlip = 1; function swapPlayerVisual(newVisualId, x, y, cb) { if (player && !player.destroyed) { game.removeChild(player); player.destroy(); } player = new Container(); playerSprite = player.attachAsset(newVisualId, { anchorX: 0.5, anchorY: 0.5 }); player.x = x; player.y = y; player.scaleX = playerFlip; game.addChild(player); if (newVisualId === 'player_jump') { let jumpCol = LK.getAsset('jumpcol', { anchorX: 0.5, anchorY: 0.5, x: x, y: y + player.height / 2, alpha: 0 }); game.addChild(jumpCol); tween(jumpCol, { y: jumpCol.y - 600 }, { duration: 500, easing: tween.bounceOut, onFinish: () => { tween(jumpCol, { y: 2732 - 250 + player.height / 2 }, { duration: 300, easing: tween.bounceOut, onFinish: () => jumpCol.destroy() }); } }); } if (cb) cb(); } function startBreathing() { tween(player, { scaleX: 1.05, scaleY: 1.05 }, { duration: 1000, easing: tween.easeInOut, onFinish: () => { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 1000, easing: tween.easeInOut, onFinish: startBreathing }); } }); } function startTilting() { tween(player, { rotation: Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: () => { tween(player, { rotation: -Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: () => { tween(player, { rotation: 0 }, { duration: 500, easing: tween.easeInOut, onFinish: startTilting }); } }); } }); } startBreathing(); startTilting(); // Jump + Attack input game.down = function (x, y) { if (isSequenceRunning) return; if (y < 2732 * 2 / 3) { if (!isJumping) { isJumping = true; LK.getSound('hup').play(); playerFlip = 1; swapPlayerVisual('player_jump', player.x, player.y); for (let i = 0; i < 10; i++) { let dust = 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(dust); tween(dust, { alpha: 0, x: dust.x + Math.random() * 200 - 100, y: dust.y - Math.random() * 200 }, { duration: 500, onFinish: () => dust.destroy() }); } tween(player, { y: player.y - 600 }, { duration: 500, easing: tween.easeOut, onFinish: () => { tween(player, { y: 2732 - 250 }, { duration: 300, easing: tween.bounceOut, onFinish: () => { LK.effects.flashObject(player, 0xFFFFFF, 100); for (let i = 0; i < 10; i++) { let 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: () => p.destroy() }); } isJumping = false; swapPlayerVisual('player_idle', player.x, player.y, () => { startBreathing(); startTilting(); }); } }); } }); } return; } // Attack isSequenceRunning = true; playerState = 'attacking'; playerFlip = x < 1024 ? -1 : 1; swapPlayerVisual('player_attackf01', 1024, 2732 - 250); LK.getSound('retroslash').play(); LK.setTimeout(() => { swapPlayerVisual('player_attackf02', 1024, 2732 - 250); attackCol = LK.getAsset('attackcol', { anchorX: 0.5, anchorY: 0.5, x: player.x + (playerFlip === -1 ? -150 : 150), y: player.y, alpha: 0 }); attackCol.scaleX = playerFlip; game.addChild(attackCol); LK.setTimeout(() => { if (attackCol) attackCol.destroy(); swapPlayerVisual('player_idle', 1024, 2732 - 250, () => { startBreathing(); startTilting(); isSequenceRunning = false; playerState = 'idle'; }); }, 250); }, 250); }; // Score var scoreTxt = new Text2('0', { size: 300, fill: 0xFF69B4, stroke: 0x000000, strokeThickness: 5 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); function updateScoreText(score) { LK.gui.top.removeChild(scoreTxt); scoreTxt = new Text2(String(score), { size: 300, fill: 0xFF69B4, stroke: 0x000000, strokeThickness: 5 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); tween(scoreTxt, { scaleX: 1.5, scaleY: 1.5 }, { duration: 100, easing: tween.easeOut, onFinish: () => tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100, easing: tween.easeIn }) }); } // Enemies var enemies = []; function spawnEnemy() { var e = new Container(); var gfx = e.attachAsset('enemy01', { anchorX: 0.5, anchorY: 0.5 }); e.y = 2732 - 225; var fromLeft = Math.random() < 0.5; e.x = fromLeft ? -gfx.width : 2048 + gfx.width; e.speedX = fromLeft ? (Math.random() * 4 + 2) : -(Math.random() * 4 + 2); gfx.scaleX = fromLeft ? 1 : -1; enemies.push(e); game.addChild(e); let baseY = e.y; function bounce() { tween(e, { y: baseY - 50 }, { duration: 500, easing: tween.bounceInOut, onFinish: () => { tween(e, { y: baseY }, { duration: 500, easing: tween.bounceInOut, onFinish: bounce }); } }); } bounce(); } LK.setInterval(spawnEnemy, 2000); game.update = function () { for (let i = enemies.length - 1; i >= 0; i--) { let e = enemies[i]; e.x += e.speedX; if (e.x < -300 || e.x > 2348) { e.destroy(); enemies.splice(i, 1); continue; } if (attackCol && e.intersects(attackCol)) { LK.getSound('slimedeath').play(); e.update = () => {}; tween(e, { scaleX: 1.3, scaleY: 1.3 }, { duration: 50, onFinish: () => { tween(e, { scaleX: 0.5, scaleY: 0.5, alpha: 0 }, { duration: 100, onFinish: () => e.destroy() }); } }); enemies.splice(i, 1); LK.setScore(LK.getScore() + 1); updateScoreText(LK.getScore()); } } };
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Timeout.tick error: Maximum call stack size exceeded' in or related to this line: 'swapPlayerVisual('player_idle');' Line Number: 490
User prompt
Clean Up, anywhere there is: player.destroy(); player = LK.getAsset(...); game.addChild(player); replace it with: swapPlayerVisual('player_idle'); // or 'player_jump' or 'player_attackf01', etc.
User prompt
Use swapPlayerVisual() in the Jump and Attack jump: swapPlayerVisual('player_jump'); Idle (after landing or attack):
User prompt
Replace the Existing player Setup var player = new Container(); var playerSprite = player.attachAsset('player_idle', { anchorX: 0.5, anchorY: 0.5 }); player.x = 2048 / 2; player.y = 2732 - 250; game.addChild(player); And replace it with this updated setup, right after initializing the game // Create a player container with swappable visuals var player = new Container(); player.x = 2048 / 2; player.y = 2732 - 250; game.addChild(player); var playerSprite = null; function swapPlayerVisual(assetId) { // Destroy previous visual if it exists if (playerSprite && !playerSprite.destroyed) { player.removeChild(playerSprite); playerSprite.destroy(); } // Attach new sprite to the same container playerSprite = player.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); }
User prompt
Keep the player container alive. Replace only the attached asset (playerSprite). Ensure any tween or logic applies to player, not playerSprite.
User prompt
it doesn't work, i still see two characters...... i jump, i land and attack, the attack animation finishes and there are two characters
User prompt
if i jump and then land and right away attack, theres two characters visible, fix it
User prompt
when the playif i jump and then land and right away attack, theres two characters visible, fix it
User prompt
do not create a player idle when landing
User prompt
prevent the player from attacking while landing
User prompt
prevent the player from attacking while jumping
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of null (setting 'x')' in or related to this line: 'playerAttack.x = 2048 / 2;' Line Number: 549
User prompt
Please fix the bug: 'Uncaught ReferenceError: playerAttack is not defined' in or related to this line: 'playerAttack.scaleX = -1;' Line Number: 544
User prompt
During jump: swapPlayerVisual('player_jump'); After landing: swapPlayerVisual('player_idle'); During attack: swapPlayerVisual('player_attackf01'); After delay: swapPlayerVisual('player_attackf02'); // then after another delay, return to idle: swapPlayerVisual('player_idle'); Do not call player.destroy() unless you're destroying the entire player containerโyou should only be swapping the child visual.
User prompt
Please fix the bug: 'playerSprite is not defined' in or related to this line: 'if (playerSprite) {' Line Number: 126
User prompt
var playerSprite = null; Create a swapPlayerVisual() function that only changes the visual inside player: function swapPlayerVisual(visualId) { if (playerSprite) { player.removeChild(playerSprite); playerSprite.destroy(); } playerSprite = player.attachAsset(visualId, { anchorX: 0.5, anchorY: 0.5 }); } Update your player setup like this: var player = new Container(); player.x = 2048 / 2; player.y = 2732 - 250; swapPlayerVisual('player_idle'); game.addChild(player); Update all attack and jump logic to use swapPlayerVisual() instead of creating new assets directly:
User prompt
make jumpcol invisible
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ LK.playMusic('bgm', { loop: true }); var bg01 = LK.getAsset('bg01', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); game.addChild(bg01); var player = new Container(); var playerSprite = player.attachAsset('player_idle', { anchorX: 0.5, anchorY: 0.5 }); player.x = 2048 / 2; player.y = 2732 - 250; game.addChild(player); var isSequenceRunning = false; var playerState = 'idle'; var attackCol = null; var isJumping = false; function swapPlayerVisual(newVisualId, x, y, callback) { if (player && !player.destroyed) { player.destroy(); } player = new Container(); playerSprite = player.attachAsset(newVisualId, { anchorX: 0.5, anchorY: 0.5 }); player.x = x; player.y = y; game.addChild(player); if (newVisualId === 'player_jump') { var jumpCol = LK.getAsset('jumpcol', { anchorX: 0.5, anchorY: 0.5, x: x, y: y + player.height / 2 }); jumpCol.alpha = 0; game.addChild(jumpCol); tween(jumpCol, { y: jumpCol.y - 600 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(jumpCol, { y: 2732 - 250 + player.height / 2 }, { duration: 300, easing: tween.bounceOut, onFinish: function onFinish() { return jumpCol.destroy(); } }); } }); } if (callback) { callback(); } } function startBreathingAnimation() { tween(player, { scaleX: 1.05, scaleY: 1.05 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(player, { scaleX: 1.0, scaleY: 1.0 }, { duration: 1000, easing: tween.easeInOut, onFinish: startBreathingAnimation }); } }); } startBreathingAnimation(); game.down = function (x, y) { if (isSequenceRunning) { return; } if (y < 2732 * 2 / 3) { if (!isJumping) { isJumping = true; LK.getSound('hup').play(); swapPlayerVisual('player_jump', player.x, player.y); 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() { isJumping = false; swapPlayerVisual('player_idle', 2048 / 2, 2732 - 250, startBreathingAnimation); } }); } }); } return; } isSequenceRunning = true; playerState = 'attacking'; var isLeftClick = x < 2048 / 2; var attack01 = LK.getAsset('player_attackf01', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 - 250 }); if (isLeftClick) { attack01.scaleX = -1; } game.addChild(attack01); LK.getSound('retroslash').play(); LK.setTimeout(function () { attack01.destroy(); var attack02 = LK.getAsset('player_attackf02', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 - 250 }); if (isLeftClick) { attack02.scaleX = -1; } attackCol = LK.getAsset('attackcol', { anchorX: 0.5, anchorY: 0.5, x: isLeftClick ? attack02.x - 150 : attack02.x + 150, y: attack02.y, alpha: 0 }); if (isLeftClick) { attackCol.scaleX = -1; } game.addChild(attackCol); game.addChild(attack02); LK.setTimeout(function () { attack02.destroy(); if (attackCol) { attackCol.destroy(); attackCol = null; } swapPlayerVisual('player_idle', 2048 / 2, 2732 - 250, startBreathingAnimation); isSequenceRunning = false; playerState = 'idle'; }, 250); }, 250); }; var scoreTxt = new Text2('0', { size: 300, fill: 0xFF69B4, stroke: 0x000000, strokeThickness: 5 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); function updateScoreText(value) { LK.gui.top.removeChild(scoreTxt); scoreTxt = new Text2(String(value), { size: 300, fill: 0xFF69B4, stroke: 0x000000, strokeThickness: 5 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); tween(scoreTxt, { scaleX: 1.5, scaleY: 1.5 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { return tween(scoreTxt, { scaleX: 1.0, scaleY: 1.0 }, { duration: 100, easing: tween.easeIn }); } }); } var enemies = []; function spawnEnemy() { var enemy = LK.getAsset('enemy01', { anchorX: 0.5, anchorY: 0.5, x: Math.random() < 0.5 ? -100 : 2048 + 100, y: 2732 - 225 }); enemy.speedX = enemy.x < 0 ? 4 : -4; game.addChild(enemy); enemies.push(enemy); } LK.setInterval(spawnEnemy, 2000); game.update = function () { for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; e.x += e.speedX; if (attackCol && e.intersects(attackCol)) { e.update = function () {}; tween(e, { scaleX: 1.3, scaleY: 1.3 }, { duration: 50, onFinish: function onFinish() { return tween(e, { scaleX: 0.5, scaleY: 0.5, alpha: 0 }, { duration: 100, onFinish: function onFinish() { return e.destroy(); } }); } }); enemies.splice(i, 1); LK.setScore(LK.getScore() + 1); updateScoreText(LK.getScore()); } if (e.destroyed) { enemies.splice(i, 1); } } };
===================================================================
--- original.js
+++ change.js
@@ -3,615 +3,258 @@
****/
var tween = LK.import("@upit/tween.v1");
/****
-* Classes
-****/
-var Enemy = Container.expand(function (spawnFromLeft) {
- var self = Container.call(this);
- var enemyGraphics = self.attachAsset('enemy01', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- self.speedX = Math.random() * 4 + 2; // Random speed between 2 and 6
- // Flip visual and set direction based on spawn side
- if (spawnFromLeft) {
- self.x = -enemyGraphics.width / 2; // start offscreen left
- self.speedX = Math.random() * 4 + 2; // Random speed between 2 and 6
- enemyGraphics.scaleX = -1; // default facing right
- } else {
- self.x = 2048 + enemyGraphics.width / 2; // start offscreen right
- self.speedX = -(Math.random() * 4 + 2); // Random speed between -2 and -6
- enemyGraphics.scaleX = 1 * Math.abs(enemyGraphics.scaleX); // ensure correct flip to face left
- }
- self.y = 2732 - 225;
- self.update = function () {
- self.x += self.speedX;
- if (self.x < -enemyGraphics.width / 2 || self.x > 2048 + enemyGraphics.width / 2) {
- self.destroy();
- }
- };
- // Add a bouncing animation to the enemy
- var originalY = self.y; // Store the original y-coordinate
- tween(self, {
- y: originalY - 50 // Move enemy up by 50 pixels
- }, {
- duration: 500,
- // Duration of 500ms
- easing: tween.bounceInOut,
- // Bouncy easing function
- onFinish: function bounce() {
- // Reverse the tween to create a continuous bounce effect
- tween(self, {
- y: originalY // Move enemy back to original y-coordinate
- }, {
- duration: 500,
- // Duration of 500ms
- easing: tween.bounceInOut,
- // Bouncy easing function
- onFinish: function onFinish() {
- // Repeat the bounce function
- tween(self, {
- y: originalY - 50 // Move enemy up by 50 pixels again
- }, {
- duration: 500,
- // Duration of 500ms
- easing: tween.bounceInOut,
- // Bouncy easing function
- onFinish: bounce
- });
- }
- });
- }
- });
-});
-var Petal = Container.expand(function () {
- var self = Container.call(this);
- var petalGraphics = self.attachAsset('petals', {
- anchorX: 0.5,
- anchorY: 0.5,
- rotation: Math.random() * Math.PI * 2 // Random rotation for each petal
- });
- self.speedY = Math.random() * 2 + 1; // Random speed for falling
- self.speedX = Math.random() * 2 - 1; // Random horizontal drift
- self.update = function () {
- self.y += self.speedY;
- self.x += self.speedX;
- // Reset position if petal goes off screen
- if (self.y > 2732) {
- self.y = -50;
- self.x = Math.random() * 2048;
- }
- };
-});
-// Create a new class for the player_attackf01 asset
-var PlayerAttack = Container.expand(function () {
- var self = Container.call(this);
- // Attach the player_attackf01 asset to the PlayerAttack class
- var playerAttackGraphics = self.attachAsset('player_attackf01', {
- anchorX: 0.5,
- anchorY: 0.5
- });
-});
-
-/****
* Initialize Game
****/
-// Mouse or touch down on the game object
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
-function createScoreText(value) {
- var shadow = new Text2(String(value), {
- size: 300,
- fill: 0x000000,
- fontFamily: "Arial"
- });
- shadow.anchor.set(0.5, 0);
- shadow.x = 1;
- shadow.y = 1;
- var text = new Text2(String(value), {
- size: 300,
- fill: 0xFF69B4,
- fontFamily: "Arial"
- });
- text.anchor.set(0.5, 0);
- var container = new Container();
- container.addChild(shadow);
- container.addChild(text);
- return container;
-}
-function updateScoreText(value) {
- // Remove old text from GUI
- LK.gui.top.removeChild(scoreTxt);
- // Create a new score text container with shadow
- scoreTxt = createScoreText(value);
- LK.gui.top.addChild(scoreTxt);
- // Apply a pop and scale effect to the score text
- 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
- });
- }
- });
-}
-// Declare attackCol in the global scope
-var attackCol = null;
-var enemies = [];
-// Function to spawn a new enemy
-function spawnEnemy() {
- var spawnFromLeft = Math.random() < 0.5; // 50/50 chance
- var enemy = new Enemy(spawnFromLeft);
- enemies.push(enemy);
- game.addChild(enemy);
-}
-// Set an interval to spawn enemies with random frequency between 1 and 3 seconds
-LK.setInterval(spawnEnemy, Math.random() * 2000 + 1000);
-// Update function to move enemies
-game.update = function () {
- for (var i = enemies.length - 1; i >= 0; i--) {
- enemies[i].update();
- // Check for intersection between enemy and attackCol
- if (attackCol && enemies[i].intersects(attackCol)) {
- var enemy = enemies[i];
- enemies.splice(i, 1); // Remove from array first to avoid duplicate checks
- // Optional: freeze movement before effect
- enemy.update = function () {}; // Stop movement
- LK.getSound('slimedeath').play();
- // Apply red tint
- enemy.tint = 0xFF0000;
- // Fade out over 0.1 seconds (100 ms), then destroy
- tween(enemy, {
- scaleX: 1.3,
- scaleY: 1.3
- }, {
- duration: 50,
- onFinish: function onFinish() {
- // Shrink and fade out
- tween(enemy, {
- scaleX: 0.5,
- scaleY: 0.5,
- alpha: 0
- }, {
- duration: 100,
- onFinish: function onFinish() {
- enemy.destroy();
- }
- });
- }
- });
- LK.setScore(LK.getScore() + 1);
- updateScoreText(LK.getScore());
- continue;
- }
- // Check for intersection between enemy and player_idle
- if (enemies[i].intersects(player)) {
- // Trigger game over
- LK.showGameOver();
- // Show score
- updateScoreText(LK.getScore());
- }
- // Remove enemy from array if destroyed
- if (enemies[i].destroyed) {
- enemies.splice(i, 1);
- }
- }
-};
-// Create a score text object and set its initial value to 0
-var scoreTxt = new Text2('0', {
- size: 300,
- fill: 0xFF69B4,
- // Bright flashy pink
- stroke: 0x000000,
- // Ensure black linestroke
- strokeThickness: 5 // Set thickness of the linestroke
-});
-// Center the score text horizontally, anchor point set at the middle of its top edge
-scoreTxt.anchor.set(0.5, 0); // Sets anchor to the center of the top edge of the text
-// Add the score text to the GUI overlay at the top-center of the screen
-LK.gui.top.addChild(scoreTxt);
LK.playMusic('bgm', {
loop: true
});
-// Create and place bg01 on the playspace at gamestart behind player
var bg01 = LK.getAsset('bg01', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(bg01);
-// Create a player container with swappable visuals
var player = new Container();
+var playerSprite = player.attachAsset('player_idle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
player.x = 2048 / 2;
player.y = 2732 - 250;
game.addChild(player);
-var playerSprite = null;
-function swapPlayerVisual(assetId) {
- // Destroy previous visual if it exists
- if (playerSprite && !playerSprite.destroyed) {
- player.removeChild(playerSprite);
- playerSprite.destroy();
+var isSequenceRunning = false;
+var playerState = 'idle';
+var attackCol = null;
+var isJumping = false;
+function swapPlayerVisual(newVisualId, x, y, callback) {
+ if (player && !player.destroyed) {
+ player.destroy();
}
- // Attach new sprite to the same container
- playerSprite = player.attachAsset(assetId, {
+ player = new Container();
+ playerSprite = player.attachAsset(newVisualId, {
anchorX: 0.5,
anchorY: 0.5
});
-}
-// Boolean to track if the sequence is running
-var isSequenceRunning = false;
-// Variable to track the player's current state
-var playerState = 'idle'; // Possible states: 'idle', 'jumping', 'attacking'
-// Boolean to track if the player is jumping
-var isJumping = false;
-// Boolean to track if player_idle is on screen
-var isPlayerIdleOnScreen = false;
-// Add the player to the game
-game.addChild(player);
-isPlayerIdleOnScreen = true;
-// Create a new instance of the enemy01 asset
-var enemy = LK.getAsset('enemy01', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 2048 / 2 + 300,
- // Position enemy next to player_idle
- y: 2732 - 225 // Align enemy with player_idle vertically
-});
-// Destroy the enemy immediately to remove it from the playspace
-enemy.destroy();
-// Add a bouncy tween effect to enemy01
-var originalY = enemy.y; // Store the original y-coordinate
-tween(enemy, {
- y: originalY - 50 // Move enemy up by 50 pixels
-}, {
- duration: 500,
- // Duration of 500ms
- easing: tween.bounceInOut,
- // Bouncy easing function
- onFinish: function bounce() {
- // Reverse the tween to create a continuous bounce effect
- tween(enemy, {
- y: originalY // Move enemy back to original y-coordinate
+ player.x = x;
+ player.y = y;
+ game.addChild(player);
+ if (newVisualId === 'player_jump') {
+ var jumpCol = LK.getAsset('jumpcol', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: x,
+ y: y + player.height / 2
+ });
+ jumpCol.alpha = 0;
+ game.addChild(jumpCol);
+ tween(jumpCol, {
+ y: jumpCol.y - 600
}, {
duration: 500,
- // Duration of 500ms
- easing: tween.bounceInOut,
- // Bouncy easing function
+ easing: tween.easeOut,
onFinish: function onFinish() {
- // Repeat the bounce effect
- tween(enemy, {
- y: originalY - 50
+ tween(jumpCol, {
+ y: 2732 - 250 + player.height / 2
}, {
- duration: 500,
- easing: tween.bounceInOut,
- onFinish: bounce // Repeat the bounce function
- });
- }
- });
- }
-});
-// Create a shower of petals
-var petals = [];
-for (var i = 0; i < 50; i++) {
- var petal = new Petal();
- petal.x = Math.random() * 2048;
- petal.y = Math.random() * 2732;
- petals.push(petal);
- game.addChild(petal);
-}
-// Import the tween plugin
-// Simulate breathing with player_idle by scaling it up and down
-tween(player, {
- scaleX: 1.05,
- scaleY: 1.05
-}, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(player, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- // Repeat the animation
- tween(player, {
- scaleX: 1.05,
- scaleY: 1.05
- }, {
- duration: 1000,
- easing: tween.easeInOut,
+ duration: 300,
+ easing: tween.bounceOut,
onFinish: function onFinish() {
- // Repeat the animation
- tween(player, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: onFinish
- });
+ return jumpCol.destroy();
}
});
}
});
}
-});
-// Add a simple animation to the player to make it feel less stiff
-tween(player, {
- rotation: Math.PI / 16 // Slight tilt
-}, {
- duration: 500,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(player, {
- rotation: -Math.PI / 16 // Tilt to the opposite side
- }, {
- duration: 500,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(player, {
- rotation: 0 // Return to original position
- }, {
- duration: 500,
- easing: tween.easeInOut,
- onFinish: onFinish
- });
- }
- });
+ if (callback) {
+ callback();
}
-});
-// Update petals
-for (var i = 0; i < petals.length; i++) {
- petals[i].update();
}
-// Mouse or touch down on the game object
-game.down = function (x, y, obj) {
- // Check if the sequence is already running
+function startBreathingAnimation() {
+ tween(player, {
+ scaleX: 1.05,
+ scaleY: 1.05
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(player, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 1000,
+ easing: tween.easeInOut,
+ onFinish: startBreathingAnimation
+ });
+ }
+ });
+}
+startBreathingAnimation();
+game.down = function (x, y) {
if (isSequenceRunning) {
- return; // Exit if the sequence is already running
+ return;
}
- // Check if the tap is in the upper 2/3 of the screen
if (y < 2732 * 2 / 3) {
- // Prevent multiple jumps
if (!isJumping) {
isJumping = true;
- // Play 'hup' sound when player jumps
LK.getSound('hup').play();
- // Switch to player_jump image
- swapPlayerVisual('player_jump');
- // Add visual effect for jump
- LK.effects.flashObject(player, 0xFFFFFF, 100); // Flash white for 100ms
- // Add enhanced particle effect for jump
- for (var i = 0; i < 10; i++) {
- var jumpParticle = 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(jumpParticle);
- tween(jumpParticle, {
- alpha: 0,
- x: jumpParticle.x + Math.random() * 200 - 100,
- y: jumpParticle.y - Math.random() * 200
- }, {
- duration: 500,
- onFinish: function onFinish() {
- jumpParticle.destroy();
- }
- });
- }
+ swapPlayerVisual('player_jump', player.x, player.y);
tween(player, {
- y: player.y - 600 // Increased jump height
+ y: player.y - 600
}, {
duration: 500,
- //{3p} // Slower jump speed
easing: tween.easeOut,
onFinish: function onFinish() {
- // Fall down
tween(player, {
- y: 2732 - 250 // Back to ground level
+ y: 2732 - 250
}, {
duration: 300,
easing: tween.bounceOut,
onFinish: function onFinish() {
- // Add visual effect for landing
- LK.effects.flashObject(player, 0xFFFFFF, 100); // Flash white for 100ms
- // Add enhanced particle effect for landing
- for (var i = 0; i < 10; i++) {
- var landParticle = 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(landParticle);
- tween(landParticle, {
- alpha: 0,
- x: landParticle.x + Math.random() * 200 - 100,
- y: landParticle.y + Math.random() * 200
- }, {
- duration: 500,
- onFinish: function onFinish() {
- landParticle.destroy();
- }
- });
- }
- // Revert back to player_idle image
- // Removed redundant swapPlayerVisual call to prevent stack overflow
isJumping = false;
+ swapPlayerVisual('player_idle', 2048 / 2, 2732 - 250, startBreathingAnimation);
}
});
}
});
}
- return; // Exit so we donโt trigger attack when jumping
+ return;
}
- // Set the sequence running flag to true
isSequenceRunning = true;
- playerState = 'attacking'; // Set playerState to attacking during attack sequence
- // Function to swap the player's visual
- function swapPlayerVisual(newVisualId, x, y) {
- // Destroy the current player visual if it exists
- if (playerSprite && !playerSprite.destroyed) {
- player.removeChild(playerSprite);
- playerSprite.destroy();
- }
- // Attach jumpcol to the bottom of player_jump
- if (newVisualId === 'player_jump') {
- var jumpCol = LK.getAsset('jumpcol', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: x,
- y: y + player.height / 2
- });
- jumpCol.alpha = 0;
- game.addChild(jumpCol);
- // Ensure jumpcol follows the player during the jump animation
- tween(jumpCol, {
- y: jumpCol.y - 600 // Match the player's jump height
- }, {
- duration: 500,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- // Fall down with the player
- tween(jumpCol, {
- y: 2732 - 250 + player.height / 2 // Back to ground level
- }, {
- duration: 300,
- easing: tween.bounceOut,
- onFinish: function onFinish() {
- jumpCol.destroy(); // Clean up after landing
- }
- });
- }
- });
- }
- }
- // Destroy the player_idle asset if it exists
- if (player) {
- player.destroy();
- isPlayerIdleOnScreen = false;
- }
- // Determine if the click is on the left or right portion of the playspace
+ playerState = 'attacking';
var isLeftClick = x < 2048 / 2;
- // Create a new instance of the PlayerAttack class
- var playerAttack = new PlayerAttack();
- // Play the 'retroslash' sound
- LK.getSound('retroslash').play();
- // Flip the player visuals if clicked on the left portion
+ var attack01 = LK.getAsset('player_attackf01', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 2732 - 250
+ });
if (isLeftClick) {
- playerAttack.scaleX = -1;
+ attack01.scaleX = -1;
}
- // Position the player_attackf01 asset at the same position as player_idle
- playerAttack.x = 2048 / 2;
- playerAttack.y = 2732 - 250; // Set player_attackf01 coordinates to match player_idle
- // Add the player_attackf01 asset to the game
- game.addChild(playerAttack);
- // After 0.15 seconds, replace player_attackf01 with player_attackf02
+ game.addChild(attack01);
+ LK.getSound('retroslash').play();
LK.setTimeout(function () {
- // Destroy player_attackf01
- playerAttack.destroy();
- // Create a new instance of player_attackf02 at the same position as player_idle
- var playerAttack2 = LK.getAsset('player_attackf02', {
+ attack01.destroy();
+ var attack02 = LK.getAsset('player_attackf02', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
- y: 2732 - 250 // Set player_attackf02 coordinates to match player_idle
+ y: 2732 - 250
});
- // Instantiate attackcol over player_attackf02
+ if (isLeftClick) {
+ attack02.scaleX = -1;
+ }
attackCol = LK.getAsset('attackcol', {
anchorX: 0.5,
anchorY: 0.5,
- x: isLeftClick ? playerAttack2.x - 150 : playerAttack2.x + 150,
- y: playerAttack2.y
+ x: isLeftClick ? attack02.x - 150 : attack02.x + 150,
+ y: attack02.y,
+ alpha: 0
});
- // Set attackCol invisible by adjusting its alpha property
- attackCol.alpha = 0;
- // Add attackCol to the game to ensure intersection checks are valid
- game.addChild(attackCol);
- // Flip the player visuals if clicked on the left portion for player_attackf02
if (isLeftClick) {
- playerAttack2.scaleX = -1;
attackCol.scaleX = -1;
}
- // Add player_attackf02 to the game
- game.addChild(playerAttack2);
- // After 0.15 seconds, replace player_attackf02 with player_idle
+ game.addChild(attackCol);
+ game.addChild(attack02);
LK.setTimeout(function () {
- // Destroy player_attackf02
- playerAttack2.destroy();
- // Destroy attackCol when player_attackf02 is destroyed
+ attack02.destroy();
if (attackCol) {
attackCol.destroy();
attackCol = null;
}
- // Remove existing player before spawning new idle version
- // Removed redundant swapPlayerVisual call to prevent stack overflow
- isPlayerIdleOnScreen = true;
- // Define the breathing animation function
- var startBreathingAnimation = function startBreathingAnimation() {
- tween(player, {
- scaleX: 1.05,
- scaleY: 1.05
- }, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(player, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: startBreathingAnimation
- });
- }
- });
- };
- // Start the breathing animation
- startBreathingAnimation();
- // Simulate breathing with player_idle by scaling it up and down
- var startBreathingAnimation = function startBreathingAnimation() {
- tween(player, {
- scaleX: 1.05,
- scaleY: 1.05
- }, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: function onFinish() {
- tween(player, {
- scaleX: 1.0,
- scaleY: 1.0
- }, {
- duration: 1000,
- easing: tween.easeInOut,
- onFinish: startBreathingAnimation
- });
- }
- });
- };
- startBreathingAnimation();
- // Set the sequence running flag to false
+ swapPlayerVisual('player_idle', 2048 / 2, 2732 - 250, startBreathingAnimation);
isSequenceRunning = false;
- isPlayerIdleOnScreen = true;
- playerState = 'idle'; // Reset playerState to idle after attack sequence
+ playerState = 'idle';
}, 250);
}, 250);
+};
+var scoreTxt = new Text2('0', {
+ size: 300,
+ fill: 0xFF69B4,
+ stroke: 0x000000,
+ strokeThickness: 5
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+function updateScoreText(value) {
+ LK.gui.top.removeChild(scoreTxt);
+ scoreTxt = new Text2(String(value), {
+ size: 300,
+ fill: 0xFF69B4,
+ stroke: 0x000000,
+ strokeThickness: 5
+ });
+ scoreTxt.anchor.set(0.5, 0);
+ LK.gui.top.addChild(scoreTxt);
+ tween(scoreTxt, {
+ scaleX: 1.5,
+ scaleY: 1.5
+ }, {
+ duration: 100,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ return tween(scoreTxt, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 100,
+ easing: tween.easeIn
+ });
+ }
+ });
+}
+var enemies = [];
+function spawnEnemy() {
+ var enemy = LK.getAsset('enemy01', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: Math.random() < 0.5 ? -100 : 2048 + 100,
+ y: 2732 - 225
+ });
+ enemy.speedX = enemy.x < 0 ? 4 : -4;
+ game.addChild(enemy);
+ enemies.push(enemy);
+}
+LK.setInterval(spawnEnemy, 2000);
+game.update = function () {
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var e = enemies[i];
+ e.x += e.speedX;
+ if (attackCol && e.intersects(attackCol)) {
+ e.update = function () {};
+ tween(e, {
+ scaleX: 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 50,
+ onFinish: function onFinish() {
+ return tween(e, {
+ scaleX: 0.5,
+ scaleY: 0.5,
+ alpha: 0
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ return e.destroy();
+ }
+ });
+ }
+ });
+ enemies.splice(i, 1);
+ LK.setScore(LK.getScore() + 1);
+ updateScoreText(LK.getScore());
+ }
+ if (e.destroyed) {
+ enemies.splice(i, 1);
+ }
+ }
};
\ No newline at end of file
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