/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Basketball = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('basketball', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.gravity = 0.8; self.bounce = 0.6; self.isActive = false; self.hasScored = false; self.update = function () { if (self.isActive) { self.velocityY += self.gravity; self.x += self.velocityX; self.y += self.velocityY; // Check ground collision if (self.y > 2500) { self.reset(); } // Check side boundaries if (self.x < 60 || self.x > 1988) { self.velocityX *= -self.bounce; self.x = Math.max(60, Math.min(1988, self.x)); } } }; self.shoot = function (powerX, powerY) { self.velocityX = powerX; self.velocityY = powerY; self.isActive = true; self.hasScored = false; }; self.reset = function () { self.x = startX; self.y = startY; self.velocityX = 0; self.velocityY = 0; self.isActive = false; self.hasScored = false; }; return self; }); var Hoop = Container.expand(function () { var self = Container.call(this); var hoopGraphics = self.attachAsset('hoop', { anchorX: 0.5, anchorY: 0.5 }); var backboardGraphics = self.attachAsset('backboard', { anchorX: 0.5, anchorY: 0.5 }); backboardGraphics.x = 120; backboardGraphics.y = -50; self.moveToRandomPosition = function () { var newX = 300 + Math.random() * 1400; var newY = 400 + Math.random() * 800; tween(self, { x: newX, y: newY }, { duration: 1000, easing: tween.easeOut }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var startX = 1024; var startY = 2400; var basketball = null; var hoop = null; var isAiming = false; var aimStartX = 0; var aimStartY = 0; var consecutiveShots = 0; var missedShots = 0; var maxMisses = 3; var aimLines = []; // Create score display var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create consecutive shots display var streakTxt = new Text2('Streak: 0', { size: 60, fill: 0xFFFF00 }); streakTxt.anchor.set(0, 0); streakTxt.x = 50; streakTxt.y = 100; LK.gui.topLeft.addChild(streakTxt); // Create misses display var missesTxt = new Text2('Misses: 0/3', { size: 60, fill: 0xFF0000 }); missesTxt.anchor.set(1, 0); LK.gui.topRight.addChild(missesTxt); // Initialize basketball basketball = game.addChild(new Basketball()); basketball.x = startX; basketball.y = startY; // Initialize hoop hoop = game.addChild(new Hoop()); hoop.x = 1024; hoop.y = 600; function updateScore() { scoreTxt.setText('Score: ' + LK.getScore()); streakTxt.setText('Streak: ' + consecutiveShots); missesTxt.setText('Misses: ' + missedShots + '/' + maxMisses); } function createAimLine(x, y) { var line = game.addChild(LK.getAsset('aimLine', { anchorX: 0.5, anchorY: 0.5 })); line.x = x; line.y = y; line.alpha = 0.7; aimLines.push(line); tween(line, { alpha: 0 }, { duration: 200, onFinish: function onFinish() { line.destroy(); } }); } function clearAimLines() { for (var i = aimLines.length - 1; i >= 0; i--) { aimLines[i].destroy(); aimLines.splice(i, 1); } } function checkCollisions() { // Check hoop collision (scoring) if (basketball.isActive && !basketball.hasScored) { var ballLeft = basketball.x - 60; var ballRight = basketball.x + 60; var ballTop = basketball.y - 60; var ballBottom = basketball.y + 60; var hoopLeft = hoop.x - 100; var hoopRight = hoop.x + 100; var hoopTop = hoop.y - 20; var hoopBottom = hoop.y + 20; // Check if ball is passing through hoop from above if (ballLeft > hoopLeft && ballRight < hoopRight && ballTop < hoopBottom && ballBottom > hoopTop && basketball.velocityY > 0) { basketball.hasScored = true; consecutiveShots++; var points = 10 + (consecutiveShots - 1) * 5; LK.setScore(LK.getScore() + points); LK.getSound('swish').play(); LK.effects.flashScreen(0x00ff00, 500); hoop.moveToRandomPosition(); updateScore(); setTimeout(function () { basketball.reset(); }, 1000); } } // Check hoop rim collision if (basketball.isActive) { var hoopLeft = hoop.x - 100; var hoopRight = hoop.x + 100; var hoopY = hoop.y; if (basketball.x > hoopLeft && basketball.x < hoopRight && Math.abs(basketball.y - hoopY) < 80 && basketball.velocityY > 0) { basketball.velocityY *= -basketball.bounce; basketball.velocityX *= 0.8; LK.getSound('bounce').play(); } } // Check backboard collision var backboardX = hoop.x + 120; var backboardTop = hoop.y - 75; var backboardBottom = hoop.y + 75; if (basketball.isActive && Math.abs(basketball.x - backboardX) < 70 && basketball.y > backboardTop && basketball.y < backboardBottom) { basketball.velocityX *= -basketball.bounce; basketball.velocityY *= 0.9; LK.getSound('bounce').play(); } } function checkMiss() { if (basketball.isActive && basketball.y > 2300 && !basketball.hasScored) { missedShots++; consecutiveShots = 0; updateScore(); if (missedShots >= maxMisses) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } } } game.down = function (x, y, obj) { if (!basketball.isActive) { isAiming = true; aimStartX = x; aimStartY = y; clearAimLines(); } }; game.move = function (x, y, obj) { if (isAiming && !basketball.isActive) { var deltaX = x - aimStartX; var deltaY = y - aimStartY; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); if (distance > 20) { var steps = Math.floor(distance / 30); for (var i = 1; i <= steps; i++) { var lineX = aimStartX + deltaX * i / steps; var lineY = aimStartY + deltaY * i / steps; createAimLine(lineX, lineY); } } } }; game.up = function (x, y, obj) { if (isAiming && !basketball.isActive) { var deltaX = x - aimStartX; var deltaY = y - aimStartY; var power = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) / 20, 20); if (power > 2) { var powerX = deltaX / 20; var powerY = deltaY / 20; basketball.shoot(powerX, powerY); } isAiming = false; clearAimLines(); } }; game.update = function () { checkCollisions(); checkMiss(); // Win condition if (LK.getScore() >= 500) { LK.showYouWin(); } }; updateScore();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,263 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Basketball = Container.expand(function () {
+ var self = Container.call(this);
+ var ballGraphics = self.attachAsset('basketball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.gravity = 0.8;
+ self.bounce = 0.6;
+ self.isActive = false;
+ self.hasScored = false;
+ self.update = function () {
+ if (self.isActive) {
+ self.velocityY += self.gravity;
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Check ground collision
+ if (self.y > 2500) {
+ self.reset();
+ }
+ // Check side boundaries
+ if (self.x < 60 || self.x > 1988) {
+ self.velocityX *= -self.bounce;
+ self.x = Math.max(60, Math.min(1988, self.x));
+ }
+ }
+ };
+ self.shoot = function (powerX, powerY) {
+ self.velocityX = powerX;
+ self.velocityY = powerY;
+ self.isActive = true;
+ self.hasScored = false;
+ };
+ self.reset = function () {
+ self.x = startX;
+ self.y = startY;
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.isActive = false;
+ self.hasScored = false;
+ };
+ return self;
+});
+var Hoop = Container.expand(function () {
+ var self = Container.call(this);
+ var hoopGraphics = self.attachAsset('hoop', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var backboardGraphics = self.attachAsset('backboard', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ backboardGraphics.x = 120;
+ backboardGraphics.y = -50;
+ self.moveToRandomPosition = function () {
+ var newX = 300 + Math.random() * 1400;
+ var newY = 400 + Math.random() * 800;
+ tween(self, {
+ x: newX,
+ y: newY
+ }, {
+ duration: 1000,
+ easing: tween.easeOut
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+var startX = 1024;
+var startY = 2400;
+var basketball = null;
+var hoop = null;
+var isAiming = false;
+var aimStartX = 0;
+var aimStartY = 0;
+var consecutiveShots = 0;
+var missedShots = 0;
+var maxMisses = 3;
+var aimLines = [];
+// Create score display
+var scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Create consecutive shots display
+var streakTxt = new Text2('Streak: 0', {
+ size: 60,
+ fill: 0xFFFF00
+});
+streakTxt.anchor.set(0, 0);
+streakTxt.x = 50;
+streakTxt.y = 100;
+LK.gui.topLeft.addChild(streakTxt);
+// Create misses display
+var missesTxt = new Text2('Misses: 0/3', {
+ size: 60,
+ fill: 0xFF0000
+});
+missesTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(missesTxt);
+// Initialize basketball
+basketball = game.addChild(new Basketball());
+basketball.x = startX;
+basketball.y = startY;
+// Initialize hoop
+hoop = game.addChild(new Hoop());
+hoop.x = 1024;
+hoop.y = 600;
+function updateScore() {
+ scoreTxt.setText('Score: ' + LK.getScore());
+ streakTxt.setText('Streak: ' + consecutiveShots);
+ missesTxt.setText('Misses: ' + missedShots + '/' + maxMisses);
+}
+function createAimLine(x, y) {
+ var line = game.addChild(LK.getAsset('aimLine', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }));
+ line.x = x;
+ line.y = y;
+ line.alpha = 0.7;
+ aimLines.push(line);
+ tween(line, {
+ alpha: 0
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ line.destroy();
+ }
+ });
+}
+function clearAimLines() {
+ for (var i = aimLines.length - 1; i >= 0; i--) {
+ aimLines[i].destroy();
+ aimLines.splice(i, 1);
+ }
+}
+function checkCollisions() {
+ // Check hoop collision (scoring)
+ if (basketball.isActive && !basketball.hasScored) {
+ var ballLeft = basketball.x - 60;
+ var ballRight = basketball.x + 60;
+ var ballTop = basketball.y - 60;
+ var ballBottom = basketball.y + 60;
+ var hoopLeft = hoop.x - 100;
+ var hoopRight = hoop.x + 100;
+ var hoopTop = hoop.y - 20;
+ var hoopBottom = hoop.y + 20;
+ // Check if ball is passing through hoop from above
+ if (ballLeft > hoopLeft && ballRight < hoopRight && ballTop < hoopBottom && ballBottom > hoopTop && basketball.velocityY > 0) {
+ basketball.hasScored = true;
+ consecutiveShots++;
+ var points = 10 + (consecutiveShots - 1) * 5;
+ LK.setScore(LK.getScore() + points);
+ LK.getSound('swish').play();
+ LK.effects.flashScreen(0x00ff00, 500);
+ hoop.moveToRandomPosition();
+ updateScore();
+ setTimeout(function () {
+ basketball.reset();
+ }, 1000);
+ }
+ }
+ // Check hoop rim collision
+ if (basketball.isActive) {
+ var hoopLeft = hoop.x - 100;
+ var hoopRight = hoop.x + 100;
+ var hoopY = hoop.y;
+ if (basketball.x > hoopLeft && basketball.x < hoopRight && Math.abs(basketball.y - hoopY) < 80 && basketball.velocityY > 0) {
+ basketball.velocityY *= -basketball.bounce;
+ basketball.velocityX *= 0.8;
+ LK.getSound('bounce').play();
+ }
+ }
+ // Check backboard collision
+ var backboardX = hoop.x + 120;
+ var backboardTop = hoop.y - 75;
+ var backboardBottom = hoop.y + 75;
+ if (basketball.isActive && Math.abs(basketball.x - backboardX) < 70 && basketball.y > backboardTop && basketball.y < backboardBottom) {
+ basketball.velocityX *= -basketball.bounce;
+ basketball.velocityY *= 0.9;
+ LK.getSound('bounce').play();
+ }
+}
+function checkMiss() {
+ if (basketball.isActive && basketball.y > 2300 && !basketball.hasScored) {
+ missedShots++;
+ consecutiveShots = 0;
+ updateScore();
+ if (missedShots >= maxMisses) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ }
+ }
+}
+game.down = function (x, y, obj) {
+ if (!basketball.isActive) {
+ isAiming = true;
+ aimStartX = x;
+ aimStartY = y;
+ clearAimLines();
+ }
+};
+game.move = function (x, y, obj) {
+ if (isAiming && !basketball.isActive) {
+ var deltaX = x - aimStartX;
+ var deltaY = y - aimStartY;
+ var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ if (distance > 20) {
+ var steps = Math.floor(distance / 30);
+ for (var i = 1; i <= steps; i++) {
+ var lineX = aimStartX + deltaX * i / steps;
+ var lineY = aimStartY + deltaY * i / steps;
+ createAimLine(lineX, lineY);
+ }
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ if (isAiming && !basketball.isActive) {
+ var deltaX = x - aimStartX;
+ var deltaY = y - aimStartY;
+ var power = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) / 20, 20);
+ if (power > 2) {
+ var powerX = deltaX / 20;
+ var powerY = deltaY / 20;
+ basketball.shoot(powerX, powerY);
+ }
+ isAiming = false;
+ clearAimLines();
+ }
+};
+game.update = function () {
+ checkCollisions();
+ checkMiss();
+ // Win condition
+ if (LK.getScore() >= 500) {
+ LK.showYouWin();
+ }
+};
+updateScore();
\ No newline at end of file