User prompt
when pressing these coins, they fly towards the player and on collision, add the score and destroy themselves
User prompt
when an enemy is killed, it has a 50% chance to drop a silver_coin that is worth 5 points to the score when picked up and 10% chance to drop a gold_coin that is worth 10 points to the score when picked up, and a 40% chance to drop no coins, do it
User prompt
coins move too fast, i can't see them fix it
Code edit (1 edits merged)
Please save this source code
User prompt
coins should fly towards the player and collide, not fall off the map
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'down')' in or related to this line: 'coin.down = function () {' Line Number: 688
User prompt
Chance Logic: A random value is generated for each enemy defeat. If the random value is less than 0.5, a silver coin is dropped. If it is between 0.5 and 0.6, a gold coin is dropped. Otherwise, nothing is dropped.
Code edit (2 edits merged)
Please save this source code
User prompt
change the logic to 50% chance to drop a silver_coin, 10% chance to drop a gold coin and 40% chance to drop no coins
Code edit (2 edits merged)
Please save this source code
User prompt
change the logic to 50% chance to drop a silver_coin, 10% chance to drop a gold coin and 40% chance to drop nothing
User prompt
change the logic to 50% chance to drop a silver_coin, 10% chance to drop a gold coin and 40% chance to drop nothing
User prompt
add a logic that when a coin is pressed, it flies towards the player and adds 5 points to the score if its a silver_coin and 10 points if its a gold coin
User prompt
when an enemy is killed, it has a 90% chance to drop a silver_coin that is worth 5 points to the score when picked up and 10% chance to drop a gold_coin that is worth 10 points to the score when picked up, do it
User prompt
can you do 2.5/3
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: setTimeout is not a function' in or related to this line: 'attackTimeout = setTimeout(function () {' Line Number: 423
Code edit (3 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: setTimeout is not a function' in or related to this line: 'attackTimeout = setTimeout(function () {' Line Number: 401
Code edit (1 edits merged)
Please save this source code
User prompt
play throwsnd when player_throw is instantiated
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%
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * 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 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ /**** * Global Variables ****/ // For the jump collider 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() { // Remove the old scoreTxt from the game game.removeChild(scoreTxt); // Create a new score container with the updated score scoreTxt = createScoreText(score); scoreTxt.scaleX = 1.0; scoreTxt.scaleY = 1.0; game.addChild(scoreTxt); // Add tween animation to score display 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; } // build the score text container once 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; } 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(); 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, 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; } // Delay melee attack for a short time. attackTimeout = LK.setTimeout(function () { if (isPressHeld) { 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: Reset press info and cancel melee attack if long press. ****/ 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 * Modified so that when the player is jumping, the projectile spawns from a lower point * and forces the vertical target downward. ****/ var projectiles = []; function spawnProjectile(targetX, targetY) { var proj = new Container(); proj.attachAsset('player_throw', { anchorX: 0.5, anchorY: 0.5 }); LK.getSound('throwsnd').play(); // Determine the spawn position. var spawnX = player.x; var spawnY = player.y; // If player is jumping, adjust spawnY to be near the bottom of the player // and override the targetY so the projectile is fired downward. if (isJumping) { spawnY = player.y + 100; // Adjust this offset as needed. targetY = spawnY + 200; // Force the projectile to aim downward. } proj.x = spawnX; proj.y = spawnY; // Calculate direction vector from spawn position to target. var dx = targetX - spawnX; var dy = targetY - spawnY; 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; // Adjust scaleX based on target relative to player. 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)) { // Use 'throw' attack type for projectiles. 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 collisions with melee attack collider. if (attackCol.visible && e.intersects(attackCol)) { handleEnemyHit(e, i, 'melee'); } // Check if enemy intersects 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) { isPressHeld = false; pressHoldStartTime = 0; };
===================================================================
--- original.js
+++ change.js
@@ -37,10 +37,11 @@
var jumpColGlobal = null;
// For projectile input tracking
var isPressHeld = false;
var pressHoldStartTime = 0;
-var pressDownX = 0; // track where the press started (X)
-var pressDownY = 0; // track where the press started (Y)
+var pressDownX = 0;
+var pressDownY = 0;
+var attackTimeout = null; // To delay melee attack
/****
* Score Setup
****/
var score = 0;
@@ -155,9 +156,9 @@
player.x = 1024;
player.y = 2732 - 250;
game.addChild(player);
/****
-* Idle animations
+* Idle Animations
****/
function startBreathingAnimation() {
tween(player, {
scaleX: 1.05,
@@ -204,9 +205,9 @@
}
startBreathingAnimation();
startTiltAnimation();
/****
-* Attack collider
+* Attack Collider
****/
var attackCol = LK.getAsset('attackcol', {
anchorX: 0.5,
anchorY: 0.5,
@@ -215,9 +216,9 @@
game.addChild(attackCol);
attackCol.visible = false;
attackCol.alpha = 0;
/****
-* Swap player sprite
+* 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;
@@ -274,9 +275,9 @@
onDone();
}
}
/****
-* Input logic
+* Input Logic
****/
var isSequenceRunning = false;
var isJumping = false;
var playerState = 'idle';
@@ -285,16 +286,16 @@
return;
}
isPressHeld = true;
pressHoldStartTime = Date.now();
- pressDownX = x; // remember where the press happened
- pressDownY = y; // remember where the press happened
+ pressDownX = x;
+ pressDownY = y;
// Jump if tapped in top 2/3
if (y < 2732 * 2 / 3 && !isJumping) {
isJumping = true;
LK.getSound('hup').play();
swapPlayerVisual('player_jump', player.x, player.y);
- // dust effect
+ // Dust effect
for (var i = 0; i < 10; i++) {
var p = LK.getAsset('dust', {
anchorX: 0.5,
anchorY: 0.5,
@@ -324,9 +325,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,
@@ -373,59 +373,75 @@
}
});
return;
}
- // Attack if tapped in bottom 1/3
- 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() {
+ // Delay melee attack for a short time.
+ attackTimeout = LK.setTimeout(function () {
+ if (isPressHeld) {
+ 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.0,
- scaleY: 1.0
+ scaleX: flip * 1.3,
+ scaleY: 1.3
}, {
- duration: 100
+ 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);
- // bigger/visible collider, offset so you see it overlapping
- 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);
+ 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);
};
/****
-* Enemies array + spawn
+* game.up: Reset press info and cancel melee attack if long press.
****/
+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();
- // shape child as the "hitbox"
var hitbox = new Shape({
width: 200,
height: 209,
anchorX: 0.5,
@@ -469,8 +485,10 @@
}
LK.setInterval(spawnEnemy, Math.random() * 1500 + 1000);
/****
* NEW CODE: Projectile Logic
+* Modified so that when the player is jumping, the projectile spawns from a lower point
+* and forces the vertical target downward.
****/
var projectiles = [];
function spawnProjectile(targetX, targetY) {
var proj = new Container();
@@ -478,65 +496,51 @@
anchorX: 0.5,
anchorY: 0.5
});
LK.getSound('throwsnd').play();
- // Instantiate cloudsmoke at the same position as the projectile
- 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);
- // Add tween for pop and disappear effect
- 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;
- // Calculate direction from player to the press location.
- var dx = targetX - player.x;
- var dy = targetY - player.y;
+ // Determine the spawn position.
+ var spawnX = player.x;
+ var spawnY = player.y;
+ // If player is jumping, adjust spawnY to be near the bottom of the player
+ // and override the targetY so the projectile is fired downward.
+ if (isJumping) {
+ spawnY = player.y + 100; // Adjust this offset as needed.
+ targetY = spawnY + 200; // Force the projectile to aim downward.
+ }
+ proj.x = spawnX;
+ proj.y = spawnY;
+ // Calculate direction vector from spawn position to target.
+ var dx = targetX - spawnX;
+ var dy = targetY - spawnY;
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;
- // Adjust scaleX based on target relative to player
+ // Adjust scaleX based on target relative to player.
proj.scaleX = targetX < player.x ? -1 : 1;
proj.distanceTraveled = 0;
proj.maxDistance = 1000;
projectiles.push(proj);
game.addChild(proj);
}
/****
-* Main update
+* Main Update
****/
game.update = function () {
- // Check hold duration for long press projectile
+ // 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 all projectiles
+ // Update projectiles.
for (var p = projectiles.length - 1; p >= 0; p--) {
var proj = projectiles[p];
proj.x += proj.vx;
proj.y += proj.vy;
@@ -551,21 +555,21 @@
projectiles.splice(p, 1);
proj.destroy();
continue;
}
- // Check collision with enemies
+ // Check collision with enemies.
for (var ei = enemies.length - 1; ei >= 0; ei--) {
var enemy = enemies[ei];
if (proj.intersects(enemy)) {
- // Use the 'throw' attack type for projectiles
+ // Use 'throw' attack type for projectiles.
handleEnemyHit(enemy, ei, 'throw');
projectiles.splice(p, 1);
proj.destroy();
break;
}
}
}
- // Update enemies
+ // 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) {
@@ -575,26 +579,25 @@
}
e.destroy();
continue;
}
- // Check collision with jump collider first
+ // Check collision with jump collider.
if (jumpColGlobal && jumpColGlobal.visible && e.intersects(jumpColGlobal)) {
handleEnemyJumpHit(e, i);
continue;
}
- // Check collisions with attack collider (melee)
+ // Check collisions with melee attack collider.
if (attackCol.visible && e.intersects(attackCol)) {
handleEnemyHit(e, i, 'melee');
}
- // Check if enemy intersects with player (game over)
+ // Check if enemy intersects with player (game over).
if (!isJumping && !attackCol.visible && e.intersects(player)) {
LK.showGameOver();
}
}
};
/****
-* Enemy hit logic for both attack and projectile
-* attackType should be 'melee' or 'throw'
+* Enemy Hit Logic (Melee or Throw)
****/
function handleEnemyHit(enemy, index, attackType) {
if (!enemies.includes(enemy)) {
return;
@@ -644,10 +647,9 @@
}
});
}
/****
-* Enemy hit logic for jump collider
-* When an enemy is hit by jumpCol, it will fly off the screen
+* Enemy Hit Logic for Jump Collider
****/
function handleEnemyJumpHit(enemy, index) {
if (!enemies.includes(enemy)) {
return;
@@ -686,9 +688,9 @@
}
});
}
/****
-* findChildByName helper
+* findChildByName Helper
****/
Container.prototype.findChildByName = function (name) {
for (var i = 0; i < this.children.length; i++) {
if (this.children[i].name === name) {
@@ -697,9 +699,9 @@
}
return null;
};
/****
-* game.up to reset press
+* game.up: Reset press info.
****/
game.up = function (x, y) {
isPressHeld = false;
pressHoldStartTime = 0;
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