User prompt
let’s make a line showing where your projectiles will fly every time you pull the band back
User prompt
let’s make the targets larger
User prompt
let’s make the projectile fly even farTher
User prompt
Let’s make the projectile fly until they hit the other side of the board
User prompt
let’s just make the projectiles fly farther
User prompt
Let’s make the slingshot and targets bigger as well as the shot center of the bottom
Code edit (1 edits merged)
Please save this source code
User prompt
Slingshot Strike
Initial prompt
It is going to be a sling shot game in which you have to hit moving targets. It will be mostly 16 bit
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Projectile = Container.expand(function () {
var self = Container.call(this);
var projectileGraphics = self.attachAsset('projectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.gravity = 0.5;
self.active = true;
self.update = function () {
if (!self.active) return;
self.velocityY += self.gravity;
self.x += self.velocityX;
self.y += self.velocityY;
// Remove if off screen
if (self.x < -50 || self.x > 2098 || self.y > 2782) {
self.active = false;
}
};
return self;
});
var Slingshot = Container.expand(function () {
var self = Container.call(this);
var baseGraphics = self.attachAsset('slingshotBase', {
anchorX: 0.5,
anchorY: 1.0
});
var leftStrap = self.attachAsset('slingshotStrap', {
anchorX: 0.5,
anchorY: 1.0
});
var rightStrap = self.attachAsset('slingshotStrap', {
anchorX: 0.5,
anchorY: 1.0
});
leftStrap.x = -45;
rightStrap.x = 45;
self.aimX = 0;
self.aimY = 0;
self.aiming = false;
self.setAim = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
var maxDistance = 180;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > maxDistance) {
dx = dx / distance * maxDistance;
dy = dy / distance * maxDistance;
}
self.aimX = dx;
self.aimY = dy;
// Update strap positions
leftStrap.rotation = Math.atan2(dy, dx + 45) - Math.PI / 2;
rightStrap.rotation = Math.atan2(dy, dx - 45) - Math.PI / 2;
var strapLength = Math.sqrt(dx * dx + dy * dy) / 90;
leftStrap.scaleY = strapLength;
rightStrap.scaleY = strapLength;
};
self.resetStraps = function () {
leftStrap.rotation = 0;
rightStrap.rotation = 0;
leftStrap.scaleY = 1;
rightStrap.scaleY = 1;
};
return self;
});
var Target = Container.expand(function () {
var self = Container.call(this);
var targetGraphics = self.attachAsset('target', {
anchorX: 0.5,
anchorY: 0.5
});
var centerGraphics = self.attachAsset('targetCenter', {
anchorX: 0.5,
anchorY: 0.5
});
self.movementType = 'linear';
self.speed = 2;
self.direction = 1;
self.startX = 0;
self.startY = 0;
self.moveTimer = 0;
self.active = true;
self.update = function () {
if (!self.active) return;
self.moveTimer++;
switch (self.movementType) {
case 'linear':
self.x += self.speed * self.direction;
if (self.x > 2100 || self.x < -50) {
self.direction *= -1;
}
break;
case 'circular':
var radius = 100;
self.x = self.startX + Math.cos(self.moveTimer * 0.05) * radius;
self.y = self.startY + Math.sin(self.moveTimer * 0.05) * radius;
break;
case 'zigzag':
self.x += self.speed;
self.y = self.startY + Math.sin(self.moveTimer * 0.1) * 80;
if (self.x > 2100) {
self.x = -50;
}
break;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var slingshot = game.addChild(new Slingshot());
slingshot.x = 1024;
slingshot.y = 2600;
var projectiles = [];
var targets = [];
var score = 0;
var level = 1;
var projectilesRemaining = 5;
var targetsHit = 0;
var combo = 0;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
var projectilesTxt = new Text2('Shots: 5', {
size: 60,
fill: 0xFFFFFF
});
projectilesTxt.anchor.set(0, 0);
projectilesTxt.y = 80;
LK.gui.topRight.addChild(projectilesTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
// Initialize first level targets
function spawnTargets() {
targets = [];
var targetCount = Math.min(3 + level, 8);
for (var i = 0; i < targetCount; i++) {
var target = game.addChild(new Target());
var movementTypes = ['linear', 'circular', 'zigzag'];
target.movementType = movementTypes[Math.floor(Math.random() * movementTypes.length)];
switch (target.movementType) {
case 'linear':
target.x = Math.random() * 1800 + 100;
target.y = Math.random() * 800 + 400;
target.speed = 1 + level * 0.5;
break;
case 'circular':
target.startX = Math.random() * 1400 + 400;
target.startY = Math.random() * 600 + 600;
target.x = target.startX;
target.y = target.startY;
break;
case 'zigzag':
target.x = -50;
target.startY = Math.random() * 800 + 400;
target.y = target.startY;
target.speed = 2 + level * 0.3;
break;
}
targets.push(target);
}
}
function updateUI() {
scoreTxt.setText('Score: ' + score);
projectilesTxt.setText('Shots: ' + projectilesRemaining);
levelTxt.setText('Level: ' + level);
}
function nextLevel() {
level++;
projectilesRemaining = 5 + level;
targetsHit = 0;
combo = 0;
spawnTargets();
updateUI();
}
function checkLevelComplete() {
if (targets.length === 0) {
// Bonus points for remaining projectiles
score += projectilesRemaining * 50;
LK.setTimeout(function () {
nextLevel();
}, 1000);
return true;
}
return false;
}
function checkGameOver() {
if (projectilesRemaining <= 0 && projectiles.length === 0 && targets.length > 0) {
LK.showGameOver();
return true;
}
return false;
}
spawnTargets();
updateUI();
var dragging = false;
game.down = function (x, y, obj) {
if (projectilesRemaining <= 0) return;
var dx = x - slingshot.x;
var dy = y - slingshot.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 200) {
dragging = true;
slingshot.aiming = true;
slingshot.setAim(x, y);
}
};
game.move = function (x, y, obj) {
if (dragging && slingshot.aiming) {
slingshot.setAim(x, y);
}
};
game.up = function (x, y, obj) {
if (dragging && slingshot.aiming && projectilesRemaining > 0) {
// Launch projectile
var projectile = game.addChild(new Projectile());
projectile.x = slingshot.x;
projectile.y = slingshot.y - 90;
var power = Math.sqrt(slingshot.aimX * slingshot.aimX + slingshot.aimY * slingshot.aimY) / 120;
power = Math.min(power, 1) * 15;
var angle = Math.atan2(slingshot.aimY, slingshot.aimX);
projectile.velocityX = Math.cos(angle) * power;
projectile.velocityY = Math.sin(angle) * power;
projectiles.push(projectile);
projectilesRemaining--;
LK.getSound('launch').play();
slingshot.resetStraps();
slingshot.aiming = false;
updateUI();
}
dragging = false;
};
game.update = function () {
// Update projectiles
for (var i = projectiles.length - 1; i >= 0; i--) {
var projectile = projectiles[i];
if (!projectile.active) {
projectile.destroy();
projectiles.splice(i, 1);
continue;
}
// Check collisions with targets
for (var j = targets.length - 1; j >= 0; j--) {
var target = targets[j];
if (target.active && projectile.intersects(target)) {
// Hit!
combo++;
var points = 100 + combo * 25;
score += points;
targetsHit++;
LK.getSound('hit').play();
LK.effects.flashObject(target, 0xFFFFFF, 200);
projectile.active = false;
target.active = false;
target.destroy();
targets.splice(j, 1);
break;
}
}
}
// Update targets
for (var k = targets.length - 1; k >= 0; k--) {
var target = targets[k];
if (!target.active) {
target.destroy();
targets.splice(k, 1);
}
}
// Check win/lose conditions
if (!checkLevelComplete()) {
checkGameOver();
}
updateUI();
}; ===================================================================
--- original.js
+++ change.js
@@ -41,28 +41,28 @@
var rightStrap = self.attachAsset('slingshotStrap', {
anchorX: 0.5,
anchorY: 1.0
});
- leftStrap.x = -30;
- rightStrap.x = 30;
+ leftStrap.x = -45;
+ rightStrap.x = 45;
self.aimX = 0;
self.aimY = 0;
self.aiming = false;
self.setAim = function (targetX, targetY) {
var dx = targetX - self.x;
var dy = targetY - self.y;
- var maxDistance = 120;
+ var maxDistance = 180;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > maxDistance) {
dx = dx / distance * maxDistance;
dy = dy / distance * maxDistance;
}
self.aimX = dx;
self.aimY = dy;
// Update strap positions
- leftStrap.rotation = Math.atan2(dy, dx + 30) - Math.PI / 2;
- rightStrap.rotation = Math.atan2(dy, dx - 30) - Math.PI / 2;
- var strapLength = Math.sqrt(dx * dx + dy * dy) / 60;
+ leftStrap.rotation = Math.atan2(dy, dx + 45) - Math.PI / 2;
+ rightStrap.rotation = Math.atan2(dy, dx - 45) - Math.PI / 2;
+ var strapLength = Math.sqrt(dx * dx + dy * dy) / 90;
leftStrap.scaleY = strapLength;
rightStrap.scaleY = strapLength;
};
self.resetStraps = function () {
@@ -127,10 +127,10 @@
/****
* Game Code
****/
var slingshot = game.addChild(new Slingshot());
-slingshot.x = 200;
-slingshot.y = 2500;
+slingshot.x = 1024;
+slingshot.y = 2600;
var projectiles = [];
var targets = [];
var score = 0;
var level = 1;
@@ -225,9 +225,9 @@
if (projectilesRemaining <= 0) return;
var dx = x - slingshot.x;
var dy = y - slingshot.y;
var distance = Math.sqrt(dx * dx + dy * dy);
- if (distance < 150) {
+ if (distance < 200) {
dragging = true;
slingshot.aiming = true;
slingshot.setAim(x, y);
}
@@ -241,9 +241,9 @@
if (dragging && slingshot.aiming && projectilesRemaining > 0) {
// Launch projectile
var projectile = game.addChild(new Projectile());
projectile.x = slingshot.x;
- projectile.y = slingshot.y - 60;
+ projectile.y = slingshot.y - 90;
var power = Math.sqrt(slingshot.aimX * slingshot.aimX + slingshot.aimY * slingshot.aimY) / 120;
power = Math.min(power, 1) * 15;
var angle = Math.atan2(slingshot.aimY, slingshot.aimX);
projectile.velocityX = Math.cos(angle) * power;