/****
* 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