552
0
10mo
User prompt
If the ball bounces outside the boundaries of the screen, reset the ball position
User prompt
Add a 30 second timer in addition to the points. The game is over when the 30 seconds expires
User prompt
remove the game over if the ball has been thrown and it does not score
Remix started
Copy Basketball FORGE
var HoopRim = Container.expand(function () { var self = Container.call(this); var hoopRimGraphics = LK.getAsset('hoopRimSeparate', 'Basketball Hoop Rim Separate', .5, .5); self.addChild(hoopRimGraphics); }); var Ball = Container.expand(function () { var self = Container.call(this); var ballGraphics = LK.getAsset('ball', 'Basketball', .5, .5); self.addChild(ballGraphics); self.speed = { x: 0, y: 0 }; self.move = function () { self.speed.y += 3.2; self.x += self.speed.x; self.y += self.speed.y; self.rotation += self.speed.x * 0.01; }; 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 Hoop = Container.expand(function () { var self = Container.call(this); 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 - 100; steps++; if (steps >= 60) { LK.clearInterval(interval); } }); }; var backboardGraphics = LK.getAsset('backboard', 'Basketball Backboard', .5, .5); backboardGraphics.y -= 250; self.addChild(backboardGraphics); self.hoopRimGraphics = LK.getAsset('hoopRim', 'Basketball Hoop Rim', .5, .5); self.hoopRimGraphics.y = backboardGraphics.height / 2 - 550 + 20 + 120 + 100; self.hoopRimGraphics.alpha = 0; self.addChild(self.hoopRimGraphics); self.leftElement = LK.getAsset('leftElement', 'Left Side Element', .5, .5); self.leftElement.x = self.hoopRimGraphics.x - self.hoopRimGraphics.width / 2 + self.leftElement.width / 2; self.leftElement.y = self.hoopRimGraphics.y - 100; self.leftElement.alpha = 0; self.addChild(self.leftElement); self.rightElement = LK.getAsset('rightElement', 'Right Side Element', .5, .5); self.rightElement.x = self.hoopRimGraphics.x + self.hoopRimGraphics.width / 2 - self.rightElement.width / 2; self.rightElement.y = self.hoopRimGraphics.y - 100; self.rightElement.alpha = 0; self.addChild(self.rightElement); self.multiplierLabel = new Text2('', { size: 150 * 1.3, fill: '#9f4a2d', font: 'Impact' }); self.multiplierLabel.anchor.set(.5, .5); self.multiplierLabel.x = self.hoopRimGraphics.x; self.multiplierLabel.y = self.hoopRimGraphics.y - 250 + 20; self.addChild(self.multiplierLabel); }); var Game = Container.expand(function () { var self = Container.call(this); var gameTimer = 30; var timerTxt = new Text2(gameTimer.toString(), { size: 150, fill: '#ffffff', font: 'Impact', dropShadow: true, dropShadowColor: '#000000', dropShadowBlur: 4, dropShadowAngle: Math.PI / 6, dropShadowDistance: 6 }); timerTxt.anchor.set(.5, 0); LK.gui.topRight.addChild(timerTxt); var timerInterval = LK.setInterval(function () { gameTimer--; timerTxt.setText(gameTimer.toString()); if (gameTimer <= 0) { LK.clearInterval(timerInterval); LK.showGameOver(); } }, 1000); var bg = LK.getAsset('background', 'Background Image', 0.5, 0.5); bg.x = 2048 / 2; bg.y = 2732 / 2 + 150; bg.alpha = 0.7; self.addChild(bg); var hoop = self.addChild(new Hoop()); var score = 0; var scoreMultiplier = 1; var scoreTxt = new Text2(score.toString(), { size: 150, fill: '#ffffff', font: 'Impact', dropShadow: true, dropShadowColor: '#000000', dropShadowBlur: 4, dropShadowAngle: Math.PI / 6, dropShadowDistance: 6 }); scoreTxt.anchor.set(.5, 0); LK.gui.topCenter.addChild(scoreTxt); var ballShadow = LK.getAsset('ballShadow', 'Ball Shadow', .5, .5); ballShadow.alpha = 0.5; ballShadow.y = 2480; self.addChild(ballShadow); var ball = self.addChild(new Ball()); var hoopRim = self.addChild(new HoopRim()); ball.hasScored = false; ball.hasThrown = false; ball.hitElement = ''; hoop.x = 2048 / 2; hoop.y = 2732 / 2; hoopRim.x = hoop.x; hoopRim.y = hoop.y + hoop.children[1].y - 100; ball.x = 2048 / 2; ball.on('down', function (obj) { var event = obj.event; dragStart = event.getLocalPosition(self); }); var dragStart = null; stage.on('move', function (obj) { var event = obj.event; var pos = event.getLocalPosition(self); if (dragStart !== null && ball.distanceTo(pos.x, pos.y) > 200) { self.fireBall(obj); } }); self.fireBall = function (obj) { if (dragStart !== null) { var event = obj.event; var pos = event.getLocalPosition(self); 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 / 3; ball.speed.y = Math.sin(angle) * 72 * 1.76 * 0.9; ball.hasThrown = true; ball.hitElement = ''; self.removeChild(ball); self.addChild(ball); dragStart = null; } }; stage.on('up', function (obj) { self.fireBall(obj); }); var floorY = 2732 - 100; ball.y = floorY - ball.height; LK.on('tick', function () { ball.move(); if (ball.x < 0 || ball.x > 2048 || ball.y < 0 || ball.y > 2732) { ball.x = 2048 / 2; ball.y = 2732 - ball.height; ball.speed.x = 0; ball.speed.y = 0; ball.hasThrown = false; } ballShadow.x = ball.x; var scale = 1 - 2 * (ball.y - 2732 + ball.height) / 2732; ballShadow.scale.set(scale); ballShadow.alpha = (1 - scale + 1) / 2; 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.hasScored) { ball.x = 2048 / 2; ball.y = 2732 - ball.height; ball.speed.x = 0; ball.speed.y = 0; ball.hasThrown = false; ball.hasScored = false; 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); } } if (ball.intersects(hoop.hoopRimGraphics) && ball.speed.y > 0 && !ball.hasScored && ball.x > hoop.x + hoop.leftElement.x && ball.x < hoop.x + hoop.rightElement.x) { ball.hasScored = true; score += scoreMultiplier; scoreTxt.setText(score.toString()); } if (ball.speed.y > 0) { self.removeChild(hoopRim); self.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'; } } }); });
===================================================================
--- original.js
+++ change.js
@@ -176,8 +176,15 @@
var floorY = 2732 - 100;
ball.y = floorY - ball.height;
LK.on('tick', function () {
ball.move();
+ if (ball.x < 0 || ball.x > 2048 || ball.y < 0 || ball.y > 2732) {
+ ball.x = 2048 / 2;
+ ball.y = 2732 - ball.height;
+ ball.speed.x = 0;
+ ball.speed.y = 0;
+ ball.hasThrown = false;
+ }
ballShadow.x = ball.x;
var scale = 1 - 2 * (ball.y - 2732 + ball.height) / 2732;
ballShadow.scale.set(scale);
ballShadow.alpha = (1 - scale + 1) / 2;
Basketball, cartoon style 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.
Indoor stadium seen from court Single Game Texture. In-Game asset. 2d. Pixelart. White background. Blank background. Low detail. High contrast. --no goal