User prompt
Please fix the bug: 'Uncaught TypeError: setTimeout is not a function' in or related to this line: 'attackTimeout = setTimeout(function () {' Line Number: 396
Code edit (1 edits merged)
Please save this source code
User prompt
make player_throw move faster
User prompt
cloudsmoke alpha to 75%
User prompt
0.5 seconds instead of 0.1
User prompt
make a tween out of cloudsmoke, add a pop and a disappear after 0.1 seconds ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
add 50% transparency to cloud smoke
User prompt
cloudsmoke should instantiate where player_throw appears which is next to the player_idle, why is it not working? fix it
User prompt
instantiate cloudsmoke where player_throw is created
User prompt
instantiate flash where player_throw is instantiated
User prompt
instantiate with a 50% transparency flash where player_throw is instantiated
Code edit (1 edits merged)
Please save this source code
User prompt
when enemy is killed with player_attackf02 , give 2 points instead of 1, when instead enemy is killed with player_throw, give 1 point
User prompt
when enemy is killed with playerfattack, give 2 points instead of 1
User prompt
In spawnProjectile function, right after calculating the projectile's velocity, add: proj.scaleX = (targetX < player.x) ? -1 : 1;
Code edit (1 edits merged)
Please save this source code
User prompt
Create a function to track when a press is being held. This is typically done by setting up event listeners for the `down` and `up` events. When the `down` event is triggered, you can start a timer or set a flag indicating that the press is being held. You can then check the duration of the hold or perform actions while the press is held. When the `up` event is triggered, you can stop the timer or reset the flag, indicating that the press is no longer being held. This allows you to implement features like dashing, where an action is triggered after holding a press for a certain duration.
User prompt
When the player slashes left, the idle should be inverted
User prompt
When the player jumps, flip the jumping asset randomly so it's not always the same thing
User prompt
trigger a game over when the enemy touches the player and the player is neither jumping or attacking
Code edit (1 edits merged)
Please save this source code
User prompt
play boing when enemy are killed by a jump
User prompt
the green square around the enemy should be invisible
User prompt
attack col, jumpcol and shape should be invisible
User prompt
add a score of 3 when the enemys are killed with a jump
/**** * Plugins ****/ var tween = LK.import("@upit/tween.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 // invisible shape }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ /**** * Global Variables ****/ var jumpColGlobal = null; // For projectile input tracking var isPressHeld = false; var pressHoldStartTime = 0; var pressDownX = 0; var pressDownY = 0; var attackTimeout = null; // To delay melee attack /**** * Score Setup ****/ var score = 0; var scoreTxt; // container for the score text 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 incrementScore() { score++; updateScoreDisplay(); } 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); /**** * 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 ****/ 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 }); } }); } function startTiltAnimation() { tween(player, { rotation: Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(player, { rotation: -Math.PI / 32 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { 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; /**** * Swap Player Sprite ****/ 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 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 }); 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') { startBreathingAnimation(); startTiltAnimation(); } onDone(); } } /**** * Input Logic ****/ var isSequenceRunning = false; var isJumping = false; var playerState = 'idle'; game.down = function (x, y) { if (isSequenceRunning) { return; } // Record press info for projectile later. isPressHeld = true; pressHoldStartTime = Date.now(); pressDownX = x; pressDownY = y; // If tapped in top 2/3, jump immediately. if (y < 2732 * 2 / 3 && !isJumping) { isJumping = true; LK.getSound('hup').play(); swapPlayerVisual('player_jump', player.x, player.y); // (Jump dust and tweening effects here remain unchanged.) 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; swapPlayerVisual('player_idle', 1024, 2732 - 250, 1, 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; } // Otherwise, if tapped in the bottom 1/3, delay the melee attack. attackTimeout = LK.setTimeout(function () { if (isPressHeld) { // Only execute if the press hasn't become a long press. isSequenceRunning = true; 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 () { startBreathingAnimation(); startTiltAnimation(); }); isSequenceRunning = false; playerState = 'idle'; }, 250); }, 250); } }, 250); }; /**** * game.up: Cancel melee attack if long press is detected. ****/ game.up = function (x, y) { if (isPressHeld) { var holdDuration = Date.now() - pressHoldStartTime; if (holdDuration > 500 && attackTimeout) { clearTimeout(attackTimeout); attackTimeout = null; } } isPressHeld = false; pressHoldStartTime = 0; }; /**** * Enemies Array + 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); /**** * NEW CODE: Projectile Logic ****/ var projectiles = []; function spawnProjectile(targetX, targetY) { var proj = new Container(); proj.attachAsset('player_throw', { anchorX: 0.5, anchorY: 0.5 }); proj.x = player.x; proj.y = player.y; // Optionally, create a cloudsmoke effect. 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(); } }); // Calculate direction. var dx = targetX - player.x; var 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); } /**** * Main Update ****/ game.update = function () { // Check hold duration for 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; } // Check collision with enemies. for (var ei = enemies.length - 1; ei >= 0; ei--) { var enemy = enemies[ei]; if (proj.intersects(enemy)) { // 'throw' attack type for projectile. 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; } // Check collision with jump collider. if (jumpColGlobal && jumpColGlobal.visible && e.intersects(jumpColGlobal)) { handleEnemyJumpHit(e, i); continue; } // Check collision with melee attack collider. if (attackCol.visible && e.intersects(attackCol)) { handleEnemyHit(e, i, 'melee'); } // Check collision with player (game over). if (!isJumping && !attackCol.visible && e.intersects(player)) { LK.showGameOver(); } } }; /**** * Enemy Hit Logic (Melee or Throw) ****/ 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.scoreCounted) { if (attackType === 'melee') { score += 2; } else if (attackType === 'throw') { score += 1; } else { score++; } updateScoreDisplay(); enemy.scoreCounted = true; } } }); } }); } }); } /**** * Enemy Hit Logic for Jump Collider ****/ 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.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: Reset Press Info ****/ game.up = function (x, y) { if (isPressHeld) { var holdDuration = Date.now() - pressHoldStartTime; if (holdDuration > 500 && attackTimeout) { clearTimeout(attackTimeout); attackTimeout = null; } } isPressHeld = false; pressHoldStartTime = 0; };
===================================================================
--- original.js
+++ change.js
@@ -32,29 +32,247 @@
/****
* Global Variables
****/
var jumpColGlobal = null;
+// For projectile input tracking
var isPressHeld = false;
var pressHoldStartTime = 0;
var pressDownX = 0;
var pressDownY = 0;
-var attackTimeout = null; // NEW: timeout ID for delayed melee attack
+var attackTimeout = null; // To delay melee attack
/****
* Score Setup
****/
-// [score setup code remains unchanged...]
+var score = 0;
+var scoreTxt; // container for the score text
+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 incrementScore() {
+ score++;
+ updateScoreDisplay();
+}
+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);
/****
-* Petals, Player Setup, Idle Animations, Attack Collider
+* Petals
****/
-// [these sections remain unchanged...]
+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);
+}
/****
-* Swap player sprite
+* Player Setup
****/
-// [swapPlayerVisual remains unchanged]
+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);
/****
-* Input logic
+* Idle Animations
****/
-// Modified game.down: Delay melee attack so that a long press can cancel it.
+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
+ });
+ }
+ });
+}
+function startTiltAnimation() {
+ tween(player, {
+ rotation: Math.PI / 32
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(player, {
+ rotation: -Math.PI / 32
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ 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;
+/****
+* Swap Player Sprite
+****/
+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 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
+ });
+ 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') {
+ startBreathingAnimation();
+ startTiltAnimation();
+ }
+ onDone();
+ }
+}
+/****
+* Input Logic
+****/
var isSequenceRunning = false;
var isJumping = false;
var playerState = 'idle';
game.down = function (x, y) {
@@ -65,21 +283,97 @@
isPressHeld = true;
pressHoldStartTime = Date.now();
pressDownX = x;
pressDownY = y;
- // If in top 2/3, do jump immediately.
+ // If tapped in top 2/3, jump immediately.
if (y < 2732 * 2 / 3 && !isJumping) {
isJumping = true;
LK.getSound('hup').play();
swapPlayerVisual('player_jump', player.x, player.y);
- // [jump dust effect and tweening code... remains unchanged]
+ // (Jump dust and tweening effects here remain unchanged.)
+ 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;
+ swapPlayerVisual('player_idle', 1024, 2732 - 250, 1, 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;
}
- // Otherwise, assume attack if in bottom 1/3.
- // Instead of immediately performing melee attack, delay it.
- attackTimeout = setTimeout(function () {
- // Only execute attack if the press was not long enough for projectile.
+ // Otherwise, if tapped in the bottom 1/3, delay the melee attack.
+ attackTimeout = LK.setTimeout(function () {
if (isPressHeld) {
+ // Only execute if the press hasn't become a long press.
isSequenceRunning = true;
var flip = x < 1024 ? -1 : 1;
swapPlayerVisual('player_attackf01', 1024, 2732 - 250, flip);
LK.getSound('retroslash').play();
@@ -120,15 +414,14 @@
playerState = 'idle';
}, 250);
}, 250);
}
- }, 250); // Delay melee attack for 250ms.
+ }, 250);
};
/****
-* game.up to reset press
+* game.up: Cancel melee attack if long press is detected.
****/
game.up = function (x, y) {
- // When the press is released, cancel the melee attack if the press was long.
if (isPressHeld) {
var holdDuration = Date.now() - pressHoldStartTime;
if (holdDuration > 500 && attackTimeout) {
clearTimeout(attackTimeout);
@@ -138,14 +431,288 @@
isPressHeld = false;
pressHoldStartTime = 0;
};
/****
-* Enemies, Projectile Logic, and Main update
+* Enemies Array + Spawn
****/
-// [The remainder of your code (enemy spawn, projectile logic, enemy hit functions, etc.) remains unchanged.]
-/* --- For brevity, the rest of the code remains as in your original version, including:
- - spawnEnemy
- - projectile logic (spawnProjectile)
- - game.update loop that checks hold duration (for long press), updates projectiles, enemies, etc.
- - handleEnemyHit and handleEnemyJumpHit
- - findChildByName helper
-*/
\ No newline at end of file
+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);
+/****
+* NEW CODE: Projectile Logic
+****/
+var projectiles = [];
+function spawnProjectile(targetX, targetY) {
+ var proj = new Container();
+ proj.attachAsset('player_throw', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ proj.x = player.x;
+ proj.y = player.y;
+ // Optionally, create a cloudsmoke effect.
+ 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();
+ }
+ });
+ // Calculate direction.
+ var dx = targetX - player.x;
+ var 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);
+}
+/****
+* Main Update
+****/
+game.update = function () {
+ // Check hold duration for 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;
+ }
+ // Check collision with enemies.
+ for (var ei = enemies.length - 1; ei >= 0; ei--) {
+ var enemy = enemies[ei];
+ if (proj.intersects(enemy)) {
+ // 'throw' attack type for projectile.
+ 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;
+ }
+ // Check collision with jump collider.
+ if (jumpColGlobal && jumpColGlobal.visible && e.intersects(jumpColGlobal)) {
+ handleEnemyJumpHit(e, i);
+ continue;
+ }
+ // Check collision with melee attack collider.
+ if (attackCol.visible && e.intersects(attackCol)) {
+ handleEnemyHit(e, i, 'melee');
+ }
+ // Check collision with player (game over).
+ if (!isJumping && !attackCol.visible && e.intersects(player)) {
+ LK.showGameOver();
+ }
+ }
+};
+/****
+* Enemy Hit Logic (Melee or Throw)
+****/
+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.scoreCounted) {
+ if (attackType === 'melee') {
+ score += 2;
+ } else if (attackType === 'throw') {
+ score += 1;
+ } else {
+ score++;
+ }
+ updateScoreDisplay();
+ enemy.scoreCounted = true;
+ }
+ }
+ });
+ }
+ });
+ }
+ });
+}
+/****
+* Enemy Hit Logic for Jump Collider
+****/
+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.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: Reset Press Info
+****/
+game.up = function (x, y) {
+ if (isPressHeld) {
+ var holdDuration = Date.now() - pressHoldStartTime;
+ if (holdDuration > 500 && attackTimeout) {
+ clearTimeout(attackTimeout);
+ attackTimeout = null;
+ }
+ }
+ isPressHeld = false;
+ pressHoldStartTime = 0;
+};
\ 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
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
picture of a cute enemy slime monster inspired by dragon quest and ragnarok online. In-Game asset. 2d. High contrast. No shadows
picture of a cute fat and large enemy slime monster inspired by dragon quest and ragnarok online. In-Game asset. 2d. High contrast. No shadows
picture of a cute enemy slime monster wearing a shield infront of its face inspired by dragon quest and ragnarok online. In-Game asset. 2d. High contrast. No shadows
picture of a cute massive enemy king metal slime monster inspired by dragon quest and ragnarok online.. In-Game asset. 2d. High contrast. No shadows