User prompt
It is still too heavy
User prompt
Make the ball more easier to throw
User prompt
The basketball is too heavy, make it easier to throw
User prompt
Generate the first version of the source code for the game Basketball Hoop Shpt ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Basketball Hoop Shot
Initial prompt
A game where you aim a basketball and try to shoot into the hoop
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Basketball = Container.expand(function () {
var self = Container.call(this);
// Visual components
var ball = self.attachAsset('basketball', {
anchorX: 0.5,
anchorY: 0.5
});
var lines = self.attachAsset('basketballLines', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
// Physics properties
self.velocityX = 0;
self.velocityY = 0;
self.gravity = 0.5;
self.bounce = 0.7;
self.isMoving = false;
self.hasScored = false;
// Initialize last positions for collision detection
self.lastX = 0;
self.lastY = 0;
self.update = function () {
if (self.isMoving) {
// Store last position
self.lastX = self.x;
self.lastY = self.y;
// Apply physics
self.velocityY += self.gravity;
self.x += self.velocityX;
self.y += self.velocityY;
// Rotate ball based on movement
ball.rotation += self.velocityX * 0.02;
// Check boundaries
if (self.x < 40 || self.x > 2008) {
self.velocityX *= -self.bounce;
self.x = self.x < 40 ? 40 : 2008;
}
if (self.y > 2692) {
self.y = 2692;
self.velocityY *= -self.bounce;
self.velocityX *= 0.9; // Friction
if (Math.abs(self.velocityY) < 2) {
self.isMoving = false;
self.velocityX = 0;
self.velocityY = 0;
}
}
}
};
self.shoot = function (powerX, powerY) {
self.velocityX = powerX;
self.velocityY = powerY;
self.isMoving = true;
self.hasScored = false;
LK.getSound('shoot').play();
};
self.reset = function () {
self.x = 1024;
self.y = 2400;
self.velocityX = 0;
self.velocityY = 0;
self.isMoving = false;
self.hasScored = false;
ball.rotation = 0;
};
return self;
});
var Hoop = Container.expand(function () {
var self = Container.call(this);
// Backboard
var backboard = self.attachAsset('backboard', {
anchorX: 0.5,
anchorY: 0.5,
x: 100,
y: 0
});
// Hoop rim
var rim = self.attachAsset('hoop', {
anchorX: 0.5,
anchorY: 0.5,
y: 50
});
// Net
var net = self.attachAsset('net', {
anchorX: 0.5,
anchorY: 0,
y: 70,
alpha: 0.6
});
// Scoring zone (invisible)
self.scoringZone = {
x: -90,
y: 45,
width: 180,
height: 30
};
self.checkScore = function (ball) {
var ballInZone = ball.x >= self.x + self.scoringZone.x && ball.x <= self.x + self.scoringZone.x + self.scoringZone.width && ball.y >= self.y + self.scoringZone.y && ball.y <= self.y + self.scoringZone.y + self.scoringZone.height;
// Check if ball is moving downward through the hoop
if (ballInZone && ball.velocityY > 0 && ball.lastY < self.y + self.scoringZone.y && !ball.hasScored) {
ball.hasScored = true;
LK.getSound('score').play();
// Animate net
tween(net, {
scaleY: 1.2
}, {
duration: 200,
onFinish: function onFinish() {
tween(net, {
scaleY: 1
}, {
duration: 200
});
}
});
return true;
}
return false;
};
return self;
});
/****
* Initialize Game
****/
// Game variables
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Game variables
// Basketball assets
// Hoop assets
// Trajectory line
// Sounds
//Minimalistic tween library for animations
var basketball = null;
var hoop = null;
var isDragging = false;
var dragStartX = 0;
var dragStartY = 0;
var trajectoryDots = [];
var score = 0;
var scoreTxt = null;
// Initialize game elements
basketball = game.addChild(new Basketball());
basketball.reset();
hoop = game.addChild(new Hoop());
hoop.x = 1024;
hoop.y = 800;
// Score display
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Trajectory preview dots
for (var i = 0; i < 15; i++) {
var dot = LK.getAsset('trajectoryDot', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
trajectoryDots.push(dot);
game.addChild(dot);
}
function updateTrajectory(startX, startY, endX, endY) {
var powerX = (endX - startX) * 0.1;
var powerY = (endY - startY) * 0.1;
for (var i = 0; i < trajectoryDots.length; i++) {
var t = i * 2;
var x = startX + powerX * t;
var y = startY + powerY * t + 0.5 * 0.5 * t * t;
trajectoryDots[i].x = x;
trajectoryDots[i].y = y;
trajectoryDots[i].alpha = isDragging ? Math.max(0, 1 - i * 0.07) : 0;
}
}
function hideTrajectory() {
for (var i = 0; i < trajectoryDots.length; i++) {
trajectoryDots[i].alpha = 0;
}
}
// Game input handling
game.down = function (x, y, obj) {
if (!basketball.isMoving) {
// Check if touch is near basketball
var dx = x - basketball.x;
var dy = y - basketball.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 100) {
isDragging = true;
dragStartX = x;
dragStartY = y;
}
}
};
game.move = function (x, y, obj) {
if (isDragging) {
updateTrajectory(basketball.x, basketball.y, x, y);
}
};
game.up = function (x, y, obj) {
if (isDragging) {
isDragging = false;
hideTrajectory();
// Calculate shooting power
var powerX = (x - dragStartX) * 0.1;
var powerY = (y - dragStartY) * 0.1;
// Limit power
var maxPower = 20;
var power = Math.sqrt(powerX * powerX + powerY * powerY);
if (power > maxPower) {
powerX = powerX / power * maxPower;
powerY = powerY / power * maxPower;
}
basketball.shoot(powerX, powerY);
}
};
// Main game loop
game.update = function () {
// Check for scoring
if (basketball.isMoving && hoop.checkScore(basketball)) {
score++;
scoreTxt.setText('Score: ' + score);
LK.setScore(score);
}
// Reset ball if it goes off screen or stops moving
if (!basketball.isMoving && (basketball.y > 2500 || basketball.x < -100 || basketball.x > 2148)) {
LK.setTimeout(function () {
basketball.reset();
}, 1000);
}
// Update trajectory preview
if (isDragging) {
// Trajectory is updated in move handler
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,251 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Basketball = Container.expand(function () {
+ var self = Container.call(this);
+ // Visual components
+ var ball = self.attachAsset('basketball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var lines = self.attachAsset('basketballLines', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ // Physics properties
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.gravity = 0.5;
+ self.bounce = 0.7;
+ self.isMoving = false;
+ self.hasScored = false;
+ // Initialize last positions for collision detection
+ self.lastX = 0;
+ self.lastY = 0;
+ self.update = function () {
+ if (self.isMoving) {
+ // Store last position
+ self.lastX = self.x;
+ self.lastY = self.y;
+ // Apply physics
+ self.velocityY += self.gravity;
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Rotate ball based on movement
+ ball.rotation += self.velocityX * 0.02;
+ // Check boundaries
+ if (self.x < 40 || self.x > 2008) {
+ self.velocityX *= -self.bounce;
+ self.x = self.x < 40 ? 40 : 2008;
+ }
+ if (self.y > 2692) {
+ self.y = 2692;
+ self.velocityY *= -self.bounce;
+ self.velocityX *= 0.9; // Friction
+ if (Math.abs(self.velocityY) < 2) {
+ self.isMoving = false;
+ self.velocityX = 0;
+ self.velocityY = 0;
+ }
+ }
+ }
+ };
+ self.shoot = function (powerX, powerY) {
+ self.velocityX = powerX;
+ self.velocityY = powerY;
+ self.isMoving = true;
+ self.hasScored = false;
+ LK.getSound('shoot').play();
+ };
+ self.reset = function () {
+ self.x = 1024;
+ self.y = 2400;
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.isMoving = false;
+ self.hasScored = false;
+ ball.rotation = 0;
+ };
+ return self;
+});
+var Hoop = Container.expand(function () {
+ var self = Container.call(this);
+ // Backboard
+ var backboard = self.attachAsset('backboard', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 100,
+ y: 0
+ });
+ // Hoop rim
+ var rim = self.attachAsset('hoop', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ y: 50
+ });
+ // Net
+ var net = self.attachAsset('net', {
+ anchorX: 0.5,
+ anchorY: 0,
+ y: 70,
+ alpha: 0.6
+ });
+ // Scoring zone (invisible)
+ self.scoringZone = {
+ x: -90,
+ y: 45,
+ width: 180,
+ height: 30
+ };
+ self.checkScore = function (ball) {
+ var ballInZone = ball.x >= self.x + self.scoringZone.x && ball.x <= self.x + self.scoringZone.x + self.scoringZone.width && ball.y >= self.y + self.scoringZone.y && ball.y <= self.y + self.scoringZone.y + self.scoringZone.height;
+ // Check if ball is moving downward through the hoop
+ if (ballInZone && ball.velocityY > 0 && ball.lastY < self.y + self.scoringZone.y && !ball.hasScored) {
+ ball.hasScored = true;
+ LK.getSound('score').play();
+ // Animate net
+ tween(net, {
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(net, {
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ }
+ });
+ return true;
+ }
+ return false;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
+// Game variables
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB // Sky blue background
+});
+
+/****
+* Game Code
+****/
+// Game variables
+// Basketball assets
+// Hoop assets
+// Trajectory line
+// Sounds
+//Minimalistic tween library for animations
+var basketball = null;
+var hoop = null;
+var isDragging = false;
+var dragStartX = 0;
+var dragStartY = 0;
+var trajectoryDots = [];
+var score = 0;
+var scoreTxt = null;
+// Initialize game elements
+basketball = game.addChild(new Basketball());
+basketball.reset();
+hoop = game.addChild(new Hoop());
+hoop.x = 1024;
+hoop.y = 800;
+// Score display
+scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Trajectory preview dots
+for (var i = 0; i < 15; i++) {
+ var dot = LK.getAsset('trajectoryDot', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0
+ });
+ trajectoryDots.push(dot);
+ game.addChild(dot);
+}
+function updateTrajectory(startX, startY, endX, endY) {
+ var powerX = (endX - startX) * 0.1;
+ var powerY = (endY - startY) * 0.1;
+ for (var i = 0; i < trajectoryDots.length; i++) {
+ var t = i * 2;
+ var x = startX + powerX * t;
+ var y = startY + powerY * t + 0.5 * 0.5 * t * t;
+ trajectoryDots[i].x = x;
+ trajectoryDots[i].y = y;
+ trajectoryDots[i].alpha = isDragging ? Math.max(0, 1 - i * 0.07) : 0;
+ }
+}
+function hideTrajectory() {
+ for (var i = 0; i < trajectoryDots.length; i++) {
+ trajectoryDots[i].alpha = 0;
+ }
+}
+// Game input handling
+game.down = function (x, y, obj) {
+ if (!basketball.isMoving) {
+ // Check if touch is near basketball
+ var dx = x - basketball.x;
+ var dy = y - basketball.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 100) {
+ isDragging = true;
+ dragStartX = x;
+ dragStartY = y;
+ }
+ }
+};
+game.move = function (x, y, obj) {
+ if (isDragging) {
+ updateTrajectory(basketball.x, basketball.y, x, y);
+ }
+};
+game.up = function (x, y, obj) {
+ if (isDragging) {
+ isDragging = false;
+ hideTrajectory();
+ // Calculate shooting power
+ var powerX = (x - dragStartX) * 0.1;
+ var powerY = (y - dragStartY) * 0.1;
+ // Limit power
+ var maxPower = 20;
+ var power = Math.sqrt(powerX * powerX + powerY * powerY);
+ if (power > maxPower) {
+ powerX = powerX / power * maxPower;
+ powerY = powerY / power * maxPower;
+ }
+ basketball.shoot(powerX, powerY);
+ }
+};
+// Main game loop
+game.update = function () {
+ // Check for scoring
+ if (basketball.isMoving && hoop.checkScore(basketball)) {
+ score++;
+ scoreTxt.setText('Score: ' + score);
+ LK.setScore(score);
+ }
+ // Reset ball if it goes off screen or stops moving
+ if (!basketball.isMoving && (basketball.y > 2500 || basketball.x < -100 || basketball.x > 2148)) {
+ LK.setTimeout(function () {
+ basketball.reset();
+ }, 1000);
+ }
+ // Update trajectory preview
+ if (isDragging) {
+ // Trajectory is updated in move handler
+ }
+};
\ No newline at end of file
Basketball 2d 2d facing the front of the camera In-Game asset. 2d. High contrast.
Silver coin. In-Game asset. 2d. High contrast. No shadows
Basketball net. Just the net not the hoop side view 2d 2d side view just the not the hoop or backboard In-Game asset. 2d. High contrast. No shadows
Black arrow pointing up. In-Game asset. 2d. High contrast. No shadows