Code edit (3 edits merged)
Please save this source code
User prompt
make 'defender' asset move more gradually
Code edit (7 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'self.targetX = hoopRim.x + (Math.random() - 0.5) * 900;' Line Number: 95
User prompt
Please fix the bug: 'Uncaught ReferenceError: hoopRimSeparate is not defined' in or related to this line: 'self.targetX = hoopRimSeparate.x + (Math.random() - 0.5) * 900;' Line Number: 95
User prompt
Please fix the bug: 'Uncaught TypeError: game.getChildByName is not a function' in or related to this line: 'var hoopRimSeparateAsset = game.getChildByName('hoopRim');' Line Number: 95
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: game.getChild is not a function' in or related to this line: 'var hoopRimSeparateAsset = game.getChild('hoopRim');' Line Number: 95
User prompt
if the ball lands on the platform you can reshoot it from the platform
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'self.targetX = hoopRim.x;' Line Number: 96
Code edit (4 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'self.targetX = hoopRim.x;' Line Number: 96
Code edit (1 edits merged)
Please save this source code
Code edit (13 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Defender.pickNewTarget is not a function' in or related to this line: 'Defender.pickNewTarget();' Line Number: 313
Code edit (11 edits merged)
Please save this source code
Code edit (6 edits merged)
Please save this source code
User prompt
Correctly update the 'defender' object's position
Code edit (4 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'self.x = hoopRim.x;' Line Number: 96
Code edit (13 edits merged)
Please save this source code
Code edit (25 edits merged)
Please save this source code
Code edit (3 edits merged)
Please save this source code
User prompt
don't pick new target unless defender is within 5 pixels of it's target
/****
* Classes
****/
var Ball = Container.expand(function () {
var self = Container.call(this);
self.hasScored = false;
self.hasBounced = false;
var ballGraphics = LK.getAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(ballGraphics);
self.speed = {
x: 0,
y: 0
};
self.hasThrown = false;
self.move = function () {
self.speed.y += 3.2;
self.x += self.speed.x;
if (self.x < self.width / 2) {
self.x = self.width / 2;
self.speed.x *= -0.5;
} else if (self.x > 2048 - self.width / 2) {
self.x = 2048 - self.width / 2;
self.speed.x *= -0.5;
}
self.y += self.speed.y;
if (self.y < self.height / 2) {
self.y = self.height / 2;
self.speed.y *= -0.5;
}
self.rotation += self.speed.x * 0.01;
if (self.hasThrown) {
var targetScale = 0.8;
self.scale.x += (targetScale - self.scale.x) * 0.05;
self.scale.y += (targetScale - self.scale.y) * 0.05;
}
if (self.hasScored) {
self.alpha -= 0.15;
} else {
self.alpha += 0.15;
if (self.alpha > 1) {
self.alpha = 1;
}
}
};
self.bounceOffPoint = function (x, y, elasticity) {
var dx = self.x - x;
var dy = self.y - y;
var angle = Math.atan2(dy, dx);
var speed = Math.sqrt(self.speed.x * self.speed.x + self.speed.y * self.speed.y);
self.speed.x = Math.cos(angle) * speed * elasticity;
self.speed.y = Math.sin(angle) * speed * elasticity;
};
self.angleTo = function (x, y) {
var dx = self.x - x;
var dy = self.y - y;
return Math.atan2(dy, dx);
};
self.distanceTo = function (x, y) {
var dx = self.x - x;
var dy = self.y - y;
return Math.sqrt(dx * dx + dy * dy);
};
self.moveToDistance = function (x, y, distance) {
var angle = self.angleTo(x, y);
self.x = x + Math.cos(angle) * (distance * 1.05);
self.y = y + Math.sin(angle) * (distance * 1.05);
};
});
var Defender = Container.expand(function () {
var self = Container.call(this);
var defenderGraphics = self.attachAsset('defender', {
anchorX: 0.5,
anchorY: 0.5
});
self.move = function () {
// Move defender randomly within 200 pixel radius of 'hoopRimSeparate' asset
var hoopRimSeparateX = hoopRim.x; // Assuming 'hoopRim' is accessible in this scope
var hoopRimSeparateY = hoopRim.y; // Assuming 'hoopRim' is accessible in this scope
var angle = Math.random() * Math.PI * 2; // Random angle in radians
var radius = Math.random() * 500; // Random radius within 200 pixels
self.x = hoopRimSeparateX + Math.cos(angle) * radius;
self.y = hoopRimSeparateY + Math.sin(angle) * radius;
};
});
var ExplosionParticle = Container.expand(function () {
var self = Container.call(this);
self.interactive = false;
var shapes = ['leftElement', 'rightElement', 'ballShadow'];
var shapeIndex = Math.floor(Math.random() * shapes.length);
var explosionGraphics = self.attachAsset(shapes[shapeIndex], {
anchorX: 0.5,
anchorY: 0.5
});
explosionGraphics.blendMode = 1;
self.lifeSpan = 30 + Math.random() * 20; // Random lifespan between 30 to 50 ticks
self.speed = {
x: (Math.random() - 0.5) * 10,
y: (Math.random() - 0.5) * 10
};
self.scale.set(Math.random() * 0.5 + 0.5); // Random scale between 0.5 to 1
self.rotation = Math.random() * Math.PI * 2;
self.move = function () {
self.x += self.speed.x;
self.y += self.speed.y;
self.lifeSpan--;
if (self.lifeSpan <= 0) {
self.destroy();
}
};
});
var Flower = Container.expand(function () {
var self = Container.call(this);
self.interactive = false;
var flowerTypes = ['leftElement', 'rightElement', 'ballShadow']; // Reuse existing shapes for flowers
var flowerIndex = Math.floor(Math.random() * flowerTypes.length);
var flowerGraphics = self.attachAsset(flowerTypes[flowerIndex], {
anchorX: 0.5,
anchorY: 0.5
});
flowerGraphics.scaleX = flowerGraphics.scaleY = Math.random() * 0.5 + 0.5; // Random scale for variety
self.speed = {
x: (Math.random() - 0.5) * 2,
y: Math.random() * 5 + 2 // Falling speed
};
self.move = function () {
self.x += self.speed.x;
self.y += self.speed.y;
if (self.y > 2732 + 100) {
// Remove flower when it goes off screen
self.destroy();
}
};
});
var Hoop = Container.expand(function () {
var self = Container.call(this);
self.setScore = function (score) {
self.scoreLabel.setText(score.toString());
};
self.moveTo = function (newX, newY, hoopRim) {
var dx = (newX - self.x) / 60;
var dy = (newY - self.y) / 60;
var steps = 0;
var interval = LK.setInterval(function () {
self.x += dx;
self.y += dy;
hoopRim.x = self.x;
hoopRim.y = self.y + self.children[1].y - 250;
steps++;
if (steps >= 60) {
LK.clearInterval(interval);
}
});
};
var backboardGraphics = LK.getAsset('backboard', {
anchorX: 0.5,
anchorY: 0.5
});
backboardGraphics.y -= 250;
self.addChild(backboardGraphics);
self.hoopRimGraphics = LK.getAsset('hoopRim', {
anchorX: 0.5,
anchorY: 0.5
});
self.hoopRimGraphics.y = backboardGraphics.height / 2 - 550 + 20 + 120 + 150 + 100;
self.hoopRimGraphics.alpha = 0;
self.addChild(self.hoopRimGraphics);
self.leftElement = LK.getAsset('leftElement', {
anchorX: 0.5,
anchorY: 0.5
});
self.leftElement.x = self.hoopRimGraphics.x - self.hoopRimGraphics.width / 2 + self.leftElement.width / 2 - 50;
self.leftElement.y = self.hoopRimGraphics.y - 250;
self.leftElement.alpha = 0;
self.addChild(self.leftElement);
self.rightElement = LK.getAsset('rightElement', {
anchorX: 0.5,
anchorY: 0.5
});
self.rightElement.x = self.hoopRimGraphics.x + self.hoopRimGraphics.width / 2 - self.rightElement.width / 2 + 50;
self.rightElement.y = self.hoopRimGraphics.y - 250;
self.rightElement.alpha = 0;
self.addChild(self.rightElement);
self.hoopOutlineGraphics = LK.getAsset('hoopOutline', {
anchorX: 1,
anchorY: 0.5
});
self.hoopOutlineGraphics.y = self.hoopRimGraphics.y - 230;
self.hoopOutlineGraphics.alpha = 1;
self.hoopOutlineGraphics.tint = 0xbb502e;
self.hoopOutlineGraphics.rotation = Math.PI / 2;
self.addChild(self.hoopOutlineGraphics);
self.multiplierLabel = new Text2('', {
size: 200,
fill: '#8d4529',
font: 'Impact'
});
self.multiplierLabel.anchor.set(.5, 1);
self.multiplierLabel.x = self.hoopRimGraphics.x;
self.multiplierLabel.y = self.hoopRimGraphics.y - 250 - 50 + 30;
self.addChild(self.multiplierLabel);
self.scoreLabel = new Text2('0', {
size: 270,
fill: '#4b190c',
font: 'Impact'
});
self.scoreLabel.anchor.set(.5, .5);
self.scoreLabel.x = self.hoopRimGraphics.x;
self.scoreLabel.y = self.hoopRimGraphics.y - 250 - 20 - 420;
self.addChild(self.scoreLabel);
});
var HoopRim = Container.expand(function () {
var self = Container.call(this);
var hoopRimGraphics = LK.getAsset('hoopRimSeparate', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(hoopRimGraphics);
});
var Particle = Container.expand(function () {
var self = Container.call(this);
self.interactive = false;
var particleGraphics = self.attachAsset('rainbowParticle', {
anchorX: 0.5,
anchorY: 0.5
});
particleGraphics.blendMode = 1;
self.lifeSpan = 60;
self.speed = {
x: (Math.random() - 0.5) * 2,
y: (Math.random() - 0.5) * 2
};
self.scale.set(Math.random() * 0.6 + 0.2);
self.rotation = Math.random() * Math.PI * 2;
self.move = function () {
self.x += self.speed.x;
self.y += self.speed.y;
self.alpha -= 0.03;
if (self.alpha <= 0) {
self.destroy();
}
};
});
var PowerBall = Container.expand(function () {
var self = Container.call(this);
var powerBallGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.scale.set(0.5); // Smaller size for the power ball
self.interactive = true; // Make the power ball interactive
self.powerLevel = 0; // Initialize power level at 0
self.maxPower = 10; // Maximum power level
self.updatePower = function (delta) {
self.powerLevel += delta;
if (self.powerLevel > self.maxPower) {
self.powerLevel = self.maxPower;
} else if (self.powerLevel < 0) {
self.powerLevel = 0;
}
// Update the visual representation of power level here if needed
};
self.on('down', function () {
// Increase power level when the power ball is pressed
self.updatePower(1);
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var longestStreak = 0;
var currentStreak = 0;
var timeSinceDefenderMoved = 0;
LK.on('tick', function () {
timeSinceDefenderMoved = timeSinceDefenderMoved + 1;
if (timeSinceDefenderMoved % 7 == 0) {
defender.move();
}
if (ball.hasThrown) {
// Create a fire particle only when there is a multiplier
if (scoreMultiplier == 2) {
var particle = new Particle();
particle.alpha = 0.8;
// Set fire particle color to yellow for x2 multiplier
particle.tint = 0xFFFF00; // Yellow color
var angle = Math.random() * Math.PI * 2;
var radius = ball.width * 0.5 * Math.sqrt(Math.random());
particle.x = ball.x + Math.cos(angle) * radius;
particle.y = ball.y + Math.sin(angle) * radius;
game.addChild(particle);
} else if (scoreMultiplier >= 3) {
var particle = new Particle();
particle.alpha = 0.8;
// Set fire particle color to red and increase size for x3 or higher multiplier
particle.tint = 0xFF0000; // Red color
particle.scale.set(1.5); // Increase size
var angle = Math.random() * Math.PI * 2;
var radius = ball.width * 0.75 * Math.sqrt(Math.random()); // Increase radius for bigger particles
particle.x = ball.x + Math.cos(angle) * radius;
particle.y = ball.y + Math.sin(angle) * radius;
game.addChild(particle);
}
}
});
var bg = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5
});
bg.x = 2048 / 2;
bg.y = 2732 / 2 + 150;
bg.alpha = 0.7;
game.addChild(bg);
var timerTxt = new Text2('00:00', {
size: 150,
fill: "#ffffff"
});
timerTxt.anchor.set(0, 0);
timerTxt.x = 50;
timerTxt.y = 50;
LK.gui.topLeft.addChild(timerTxt);
// Initialize streak counter text display
var streakCounterTxt = new Text2('Streak: 0', {
size: 150,
fill: "#ffffff"
});
streakCounterTxt.anchor.set(1, 0); // Anchor to the top right
streakCounterTxt.x = 2048 - 50; // Position to the right, with a margin
streakCounterTxt.y = 50; // Same vertical position as timer
LK.gui.topRight.addChild(streakCounterTxt);
var gameTime = 100;
var isGamePaused = false;
var pauseGame = function pauseGame() {
isGamePaused = true;
};
var resumeGame = function resumeGame() {
isGamePaused = false;
};
var timerInterval = LK.setInterval(function () {
if (!isGamePaused) {
gameTime--;
if (gameTime <= 0) {
LK.clearInterval(timerInterval);
LK.showGameOver();
return;
}
timerTxt.setText(gameTime.toString());
}
}, 1000);
// Add event listener to toggle game pause state
game.on('down', function (obj) {
if (obj.event.target === pauseButton) {
if (isGamePaused) {
resumeGame();
} else {
pauseGame();
}
}
});
var pauseButton = LK.getAsset('pauseButton', {
anchorX: 0.5,
anchorY: 0.5
});
pauseButton.x = 2048 - 100; // Position on the top right of the screen
pauseButton.y = 100;
LK.gui.topRight.addChild(pauseButton);
var hoop = game.addChild(new Hoop());
var defender = game.addChild(new Defender());
defender.x = 2048 / 2;
defender.y = 2732 / 2 - 500; // Position above the hoop
var score = 0;
var scoreMultiplier = 1;
var ballShadow = LK.getAsset('ballShadow', {
anchorX: 0.5,
anchorY: 0.5
});
ballShadow.alpha = 0.5;
game.addChild(ballShadow);
var ball = game.addChild(new Ball());
var powerBall = game.addChild(new PowerBall());
powerBall.x = ball.x + ball.width / 2 + powerBall.width / 2 + 20; // Position powerball to the right of the ball
powerBall.y = ball.y; // Align horizontally with the ball
var hoopRim = game.addChild(new HoopRim());
ball.hitElement = '';
hoop.x = 2048 / 2;
hoop.y = 2732 / 2;
hoopRim.x = hoop.x;
hoopRim.y = hoop.y + hoop.children[1].y - 250;
ball.x = 2048 / 2;
ball.on('down', function (obj) {
if (!ball.hasThrown) {
var event = obj.event;
dragStart = event.getLocalPosition(game);
}
});
var dragStart = null;
game.on('move', function (obj) {
var event = obj.event;
var pos = event.getLocalPosition(game);
if (dragStart !== null && ball.distanceTo(pos.x, pos.y) > 400) {
game.fireBall(obj);
}
});
game.fireBall = function (obj) {
if (dragStart !== null) {
var event = obj.event;
var pos = event.getLocalPosition(game);
var dx = pos.x - dragStart.x;
var dy = pos.y - dragStart.y;
var angle = Math.atan2(dy, dx);
ball.speed.x = Math.cos(angle) * 72 * 1.76 * (0.9 + powerBall.powerLevel / 10) / 3;
ball.speed.y = Math.sin(angle) * 72 * 1.76 * (0.9 + powerBall.powerLevel / 10);
ball.hasThrown = true;
ball.hitElement = '';
game.removeChild(ball);
game.addChild(ball);
dragStart = null;
}
};
game.on('up', function (obj) {
if (dragStart !== null) {
var event = obj.event;
var pos = event.getLocalPosition(game);
var distance = Math.sqrt(Math.pow(pos.x - dragStart.x, 2) + Math.pow(pos.y - dragStart.y, 2));
if (distance > 150) {
game.fireBall(obj);
}
}
dragStart = null;
});
var floorY = 2732 - 40 + 900 * (ball.scale.y - 1);
ball.y = floorY - ball.height;
LK.on('tick', function () {
if (scoreMultiplier > 1 && !ball.hasThrown) {
for (var i = 0; i < 2; i++) {
var particle = new Particle();
particle.alpha = ball.alpha;
var angle = Math.random() * Math.PI * 2;
var radius = ball.width * 0.5 * Math.sqrt(Math.random());
particle.x = ball.x + Math.cos(angle) * radius;
particle.y = ball.y + Math.sin(angle) * radius;
game.addChild(particle);
}
}
game.children.forEach(function (child) {
if (child instanceof Particle) {
child.move();
}
});
var floorY = 2732 - 40 + 900 * (ball.scale.y - 1);
ball.move();
if (ball.speed.y > 0) {
game.removeChild(hoopRim);
game.addChild(hoopRim);
if (ball.distanceTo(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y) < ball.width / 2 + hoop.leftElement.width / 2) {
ball.moveToDistance(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y, ball.width / 2 + hoop.leftElement.width / 2 + 1);
ball.bounceOffPoint(hoop.x + hoop.leftElement.x, hoop.y + hoop.leftElement.y, 0.5);
ball.hitElement = 'left';
}
if (ball.distanceTo(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y) < ball.width / 2 + hoop.rightElement.width / 2) {
ball.moveToDistance(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y, ball.width / 2 + hoop.rightElement.width / 2 + 1);
ball.bounceOffPoint(hoop.x + hoop.rightElement.x, hoop.y + hoop.rightElement.y, 0.5);
ball.hitElement = 'right';
}
}
ballShadow.x = ball.x;
ballShadow.y = 1800 + ball.height / 2 + 500 * ball.scale.x;
var scale = (1 - 2 * (ball.y - 2732 + ball.height) / 2732) * ball.scale.x;
ballShadow.scale.set(scale);
ballShadow.alpha = (1 - scale + 1) / 2 * ball.alpha;
// Check if ball intersects with defender and reverse direction
if (ball.intersects(defender)) {
ball.speed.x *= -1;
ball.speed.y *= -1;
}
if (ball.y + ball.height > floorY) {
ball.y = floorY - ball.height;
ball.speed.y *= -0.75;
ballShadow.x = ball.x;
ballShadow.visible = true;
if (ball.hasThrown && !ball.hasScored) {
ball.hasBounced = true;
ball.x = 2048 / 2;
currentStreak = 0;
ball.y = floorY - ball.height;
ball.speed.x = 0;
ball.speed.y = 0;
ball.hasThrown = false;
ball.hasBounced = false;
ball.scale.x = 1;
ball.scale.y = 1;
ball.alpha = 1;
scoreMultiplier = 1;
hoop.multiplierLabel.setText('');
hoop.x += 5;
if (hoop.x > 2048 - hoop.width / 2) {
hoop.x = hoop.width / 2;
}
hoopRim.x = hoop.x;
} else if (ball.hasScored) {
ball.x = 2048 / 2;
ball.y = 2532 - ball.height;
ball.speed.x = 0;
ball.speed.y = 0;
ball.hasThrown = false;
ball.hasScored = false;
ball.hasBounced = false;
ball.scale.x = 1;
ball.scale.y = 1;
if (ball.hitElement === '') {
if (scoreMultiplier < 3) {
scoreMultiplier++;
}
} else {
scoreMultiplier = 1;
}
if (scoreMultiplier > 1) {
hoop.multiplierLabel.setText('x' + scoreMultiplier);
} else {
hoop.multiplierLabel.setText('');
}
ball.hitElement = '';
hoop.moveTo(Math.random() * (2048 - 1000) + 500, Math.random() * (2732 - 2000) + 1000, hoopRim);
}
} else if (ball.hasThrown && ball.intersects(hoop.hoopRimGraphics) && ball.speed.y > 0 && !ball.hasScored && !ball.hasBounced && ball.x > hoop.x + hoop.leftElement.x && ball.x < hoop.x + hoop.rightElement.x) {
ball.hasScored = true;
score += scoreMultiplier * 2;
currentStreak += 1;
if (currentStreak > longestStreak) {
longestStreak = currentStreak;
}
// Generate flowers falling from the sky
for (var i = 0; i < 10; i++) {
// Generate 10 flowers
var flower = new Flower();
flower.x = Math.random() * 2048; // Random x position across the screen width
flower.y = -100; // Start just above the screen
game.addChild(flower);
}
// Explosion effect removed
if (score === 2024) {
LK.showGameOver();
} else {
hoop.scoreLabel.setText(score.toString());
hoop.setScore(score);
}
}
});
Basketball, cartoon style Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
4:3 Simple rectangle white outline. Black background
Paris. Paris basketball backgroung. Eiffel Tower. Eurosport logo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
rainbow sparkle. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
two white palms facing forward no background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows. HD Color
POV basketball court in forest. Full screen. Background. High detail
basketball barn background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
basketball dungeon background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
heaven background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pow effect. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
left hand. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Wide Single Orange metal bar lying down Single Game Texture. In-Game asset. 2d. Pixelart. White background. Blank background. Low detail. High contrast. —ar 2:1
https://kagi.com/proxy/basketball_backboard.png?c=iNrrnnUOe99nVfDGJsYBLujiaX2Hu-zxBFRkvLEyXdRnJ8cU3RjcAYbR-o12E923qVNGy1CEGrQG87ogCD3yUarJdZYt5R03mmEMb7Jrh-8%3D blank backboard Single Game Texture. In-Game asset. 2d. Pixelart. White background. Blank background. Low detail. High contrast.