User prompt
get back to 2 points per panier. Affiche vraiment le compteur de streaks dans la page
User prompt
Show the strak counter at the top right
User prompt
Mets un compteur de "longest streak" pour garder en memoire la plus longue série de paniers"
Code edit (1 edits merged)
Please save this source code
User prompt
i cannot launch the ball, it's like it's super heavy, make it easier to launch the ball
User prompt
it works but you need to adapt the strenght, it's really really too hard to launch the ball...
User prompt
je veux pouvoir controler la force du lancer sur mon drag (calcul à daire sur la position de départ et d'"arrivée)
User prompt
add different fire effect when multiplier is x2 or x3... like yellow for x2, red and bigger for x3
User prompt
start putting sparkles on the ball event when the ball is not launched and the mutltiplier is active
User prompt
set the ball on fire with the trail only when there is a multiplier
User prompt
set the following colors to the rainbow colors are pink, red, purple, blue, green, yellow, orange
/****
* 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 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();
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
LK.on('tick', function () {
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);
var gameTime = 30;
var timerInterval = LK.setInterval(function () {
gameTime--;
if (gameTime <= 0) {
LK.clearInterval(timerInterval);
LK.showGameOver();
return;
}
var minutes = Math.floor(gameTime / 60);
var seconds = gameTime % 60;
timerTxt.setText((minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
}, 1000);
var hoop = game.addChild(new 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 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 distance = Math.sqrt(dx * dx + dy * dy);
var angle = Math.atan2(dy, dx);
// Calculate throw force based on the distance between drag start and end positions
var force = Math.min(distance / 400, 1); // Normalize and limit the force value to a maximum of 1, increasing sensitivity
ball.speed.x = Math.cos(angle) * 20 * force; // Adjust speed calculation to use increased force
ball.speed.y = Math.sin(angle) * 30 * force; // Adjust speed calculation to use increased force
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;
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;
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 * 3;
// 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);
}
}
}); ===================================================================
--- original.js
+++ change.js
@@ -332,11 +332,11 @@
var dy = pos.y - dragStart.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var angle = Math.atan2(dy, dx);
// Calculate throw force based on the distance between drag start and end positions
- var force = Math.min(distance / 800, 1); // Normalize and limit the force value to a maximum of 1, reducing sensitivity
- ball.speed.x = Math.cos(angle) * 10 * force; // Adjust speed calculation to use reduced force
- ball.speed.y = Math.sin(angle) * 15 * force; // Adjust speed calculation to use reduced force
+ var force = Math.min(distance / 400, 1); // Normalize and limit the force value to a maximum of 1, increasing sensitivity
+ ball.speed.x = Math.cos(angle) * 20 * force; // Adjust speed calculation to use increased force
+ ball.speed.y = Math.sin(angle) * 30 * force; // Adjust speed calculation to use increased force
ball.hasThrown = true;
ball.hitElement = '';
game.removeChild(ball);
game.addChild(ball);
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.
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.