/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Ball = Container.expand(function () { var self = Container.call(this); // Ball graphics var ballGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); // Physics properties self.vx = 0; self.vy = 0; self.gravity = 0.3; self.friction = 0.99; self.bounceForce = 10; self.maxSpeed = 25; self.lastTouched = 0; // Bounce the ball when touched self.bounce = function (touchX, touchY) { // Calculate direction vector from touch point to ball center var dx = self.x - touchX; var dy = self.y - touchY; // Normalize the direction vector var length = Math.sqrt(dx * dx + dy * dy); if (length > 0) { dx /= length; dy /= length; } // Apply bounce force in the direction away from touch self.vx += dx * self.bounceForce; self.vy += dy * self.bounceForce; // Cap the speed var speed = Math.sqrt(self.vx * self.vx + self.vy * self.vy); if (speed > self.maxSpeed) { self.vx = self.vx / speed * self.maxSpeed; self.vy = self.vy / speed * self.maxSpeed; } // Scale the ball quickly tween(ballGraphics, { scaleX: 1.3, scaleY: 1.3 }, { duration: 100, onFinish: function onFinish() { tween(ballGraphics, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.elasticOut }); } }); // Record the time of last touch self.lastTouched = Date.now(); // Play bounce sound LK.getSound('bounce').play(); return true; }; // Change the color of the ball self.changeColor = function () { var colors = [0xFFCC00, 0xFF6666, 0x66FF66, 0x6666FF, 0xFF66FF, 0x66FFFF, 0xFFFF66]; var randomColor = colors[Math.floor(Math.random() * colors.length)]; tween(ballGraphics, { tint: randomColor }, { duration: 300 }); }; // Check if ball was touched recently (within the last second) self.recentlyTouched = function () { return Date.now() - self.lastTouched < 1000; }; // Update ball physics self.update = function () { // Apply gravity self.vy += self.gravity; // Apply friction self.vx *= self.friction; self.vy *= self.friction; // Update position self.x += self.vx; self.y += self.vy; // Check boundaries - game width is 2048, height is 2732 var radius = ballGraphics.width / 2; var bounced = false; if (self.x < radius) { self.x = radius; self.vx = Math.abs(self.vx) * 0.8; bounced = true; } else if (self.x > 2048 - radius) { self.x = 2048 - radius; self.vx = -Math.abs(self.vx) * 0.8; bounced = true; } if (self.y < radius) { self.y = radius; self.vy = Math.abs(self.vy) * 0.8; bounced = true; } else if (self.y > 2732 - radius) { self.y = 2732 - radius; self.vy = -Math.abs(self.vy) * 0.8; bounced = true; } // Play edge bounce sound if we hit an edge if (bounced) { LK.getSound('edge').play(); } // Rotate based on horizontal speed ballGraphics.rotation += self.vx * 0.01; }; // Handle touch/click on ball self.down = function (x, y, obj) { self.bounce(x, y); }; return self; }); var TouchEffect = Container.expand(function () { var self = Container.call(this); var effectGraphics = self.attachAsset('touchEffect', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7 }); self.init = function (x, y, color) { self.x = x; self.y = y; effectGraphics.tint = color || 0xFFFFFF; effectGraphics.scaleX = 0.1; effectGraphics.scaleY = 0.1; effectGraphics.alpha = 0.7; // Animate the effect tween(effectGraphics, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 500, onFinish: function onFinish() { self.destroy(); } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Game variables var ball; var score = 0; var scoreText; var timeText; var startTime; var gameActive = false; var touchEffects = []; var difficulty = 1; // Create and position score text scoreText = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Create and position time text timeText = new Text2('Time: 0', { size: 60, fill: 0xCCCCCC }); timeText.anchor.set(0.5, 0); timeText.y = 130; LK.gui.top.addChild(timeText); // Create instructions text at the start var instructionsText = new Text2('Tap the ball to keep it bouncing!', { size: 80, fill: 0xFFFFFF }); instructionsText.anchor.set(0.5, 0.5); LK.gui.center.addChild(instructionsText); // Initialize the game function initGame() { // Create the ball ball = new Ball(); ball.x = 2048 / 2; ball.y = 2732 / 3; game.addChild(ball); // Apply initial gentle force ball.vx = Math.random() * 4 - 2; ball.vy = -5; // Reset game variables score = 0; difficulty = 1; scoreText.setText('0'); startTime = Date.now(); gameActive = true; // Remove instructions if (instructionsText.parent) { instructionsText.parent.removeChild(instructionsText); } // Play background music LK.playMusic('gameplay'); } // Create touch effect function createTouchEffect(x, y) { var colors = [0xFFCC00, 0xFF6666, 0x66FF66, 0x6666FF, 0xFF66FF, 0x66FFFF, 0xFFFF66]; var randomColor = colors[Math.floor(Math.random() * colors.length)]; var effect = new TouchEffect(); effect.init(x, y, randomColor); game.addChild(effect); touchEffects.push(effect); } // Handle touch/click on the game game.down = function (x, y, obj) { // Start the game if not active if (!gameActive) { initGame(); return; } // Check if we directly touched the ball var touchedBall = false; // Calculate distance to ball var dx = x - ball.x; var dy = y - ball.y; var distance = Math.sqrt(dx * dx + dy * dy); // If we're within the ball radius, the bounce was handled by ball.down // If we're close to the ball, count it as a touch if (distance < ball.children[0].width) { touchedBall = true; } else if (distance < ball.children[0].width * 2) { // Close enough to count as a touch, but need to call bounce manually touchedBall = ball.bounce(x, y); } // Create touch effect and update score if we touched the ball if (touchedBall) { createTouchEffect(x, y); score += Math.floor(10 * difficulty); scoreText.setText(score.toString()); ball.changeColor(); } else { // We missed the ball LK.getSound('miss').play(); } }; // Update game state game.update = function () { if (!gameActive) { return; } // Update game timer var elapsedSeconds = Math.floor((Date.now() - startTime) / 1000); timeText.setText('Time: ' + elapsedSeconds); // Increase difficulty over time difficulty = 1 + elapsedSeconds / 30; // If difficulty increases, increase ball speed ball.maxSpeed = 25 + difficulty * 3; ball.gravity = 0.3 + difficulty * 0.05; // Check if the ball is moving too slowly var speed = Math.sqrt(ball.vx * ball.vx + ball.vy * ball.vy); if (speed < 1 && !ball.recentlyTouched()) { // Ball stopped moving for too long, game over LK.effects.flashScreen(0xFF0000, 500); LK.stopMusic(); LK.showGameOver(); gameActive = false; } // Handle cleanup of touch effects for (var i = touchEffects.length - 1; i >= 0; i--) { if (!touchEffects[i].parent) { touchEffects.splice(i, 1); } } }; // Start with a welcome screen - game will start on first touch gameActive = false;
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,289 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Ball = Container.expand(function () {
+ var self = Container.call(this);
+ // Ball graphics
+ var ballGraphics = self.attachAsset('ball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Physics properties
+ self.vx = 0;
+ self.vy = 0;
+ self.gravity = 0.3;
+ self.friction = 0.99;
+ self.bounceForce = 10;
+ self.maxSpeed = 25;
+ self.lastTouched = 0;
+ // Bounce the ball when touched
+ self.bounce = function (touchX, touchY) {
+ // Calculate direction vector from touch point to ball center
+ var dx = self.x - touchX;
+ var dy = self.y - touchY;
+ // Normalize the direction vector
+ var length = Math.sqrt(dx * dx + dy * dy);
+ if (length > 0) {
+ dx /= length;
+ dy /= length;
+ }
+ // Apply bounce force in the direction away from touch
+ self.vx += dx * self.bounceForce;
+ self.vy += dy * self.bounceForce;
+ // Cap the speed
+ var speed = Math.sqrt(self.vx * self.vx + self.vy * self.vy);
+ if (speed > self.maxSpeed) {
+ self.vx = self.vx / speed * self.maxSpeed;
+ self.vy = self.vy / speed * self.maxSpeed;
+ }
+ // Scale the ball quickly
+ tween(ballGraphics, {
+ scaleX: 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(ballGraphics, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.elasticOut
+ });
+ }
+ });
+ // Record the time of last touch
+ self.lastTouched = Date.now();
+ // Play bounce sound
+ LK.getSound('bounce').play();
+ return true;
+ };
+ // Change the color of the ball
+ self.changeColor = function () {
+ var colors = [0xFFCC00, 0xFF6666, 0x66FF66, 0x6666FF, 0xFF66FF, 0x66FFFF, 0xFFFF66];
+ var randomColor = colors[Math.floor(Math.random() * colors.length)];
+ tween(ballGraphics, {
+ tint: randomColor
+ }, {
+ duration: 300
+ });
+ };
+ // Check if ball was touched recently (within the last second)
+ self.recentlyTouched = function () {
+ return Date.now() - self.lastTouched < 1000;
+ };
+ // Update ball physics
+ self.update = function () {
+ // Apply gravity
+ self.vy += self.gravity;
+ // Apply friction
+ self.vx *= self.friction;
+ self.vy *= self.friction;
+ // Update position
+ self.x += self.vx;
+ self.y += self.vy;
+ // Check boundaries - game width is 2048, height is 2732
+ var radius = ballGraphics.width / 2;
+ var bounced = false;
+ if (self.x < radius) {
+ self.x = radius;
+ self.vx = Math.abs(self.vx) * 0.8;
+ bounced = true;
+ } else if (self.x > 2048 - radius) {
+ self.x = 2048 - radius;
+ self.vx = -Math.abs(self.vx) * 0.8;
+ bounced = true;
+ }
+ if (self.y < radius) {
+ self.y = radius;
+ self.vy = Math.abs(self.vy) * 0.8;
+ bounced = true;
+ } else if (self.y > 2732 - radius) {
+ self.y = 2732 - radius;
+ self.vy = -Math.abs(self.vy) * 0.8;
+ bounced = true;
+ }
+ // Play edge bounce sound if we hit an edge
+ if (bounced) {
+ LK.getSound('edge').play();
+ }
+ // Rotate based on horizontal speed
+ ballGraphics.rotation += self.vx * 0.01;
+ };
+ // Handle touch/click on ball
+ self.down = function (x, y, obj) {
+ self.bounce(x, y);
+ };
+ return self;
+});
+var TouchEffect = Container.expand(function () {
+ var self = Container.call(this);
+ var effectGraphics = self.attachAsset('touchEffect', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.7
+ });
+ self.init = function (x, y, color) {
+ self.x = x;
+ self.y = y;
+ effectGraphics.tint = color || 0xFFFFFF;
+ effectGraphics.scaleX = 0.1;
+ effectGraphics.scaleY = 0.1;
+ effectGraphics.alpha = 0.7;
+ // Animate the effect
+ tween(effectGraphics, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 500,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x222222
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var ball;
+var score = 0;
+var scoreText;
+var timeText;
+var startTime;
+var gameActive = false;
+var touchEffects = [];
+var difficulty = 1;
+// Create and position score text
+scoreText = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreText);
+// Create and position time text
+timeText = new Text2('Time: 0', {
+ size: 60,
+ fill: 0xCCCCCC
+});
+timeText.anchor.set(0.5, 0);
+timeText.y = 130;
+LK.gui.top.addChild(timeText);
+// Create instructions text at the start
+var instructionsText = new Text2('Tap the ball to keep it bouncing!', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+instructionsText.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(instructionsText);
+// Initialize the game
+function initGame() {
+ // Create the ball
+ ball = new Ball();
+ ball.x = 2048 / 2;
+ ball.y = 2732 / 3;
+ game.addChild(ball);
+ // Apply initial gentle force
+ ball.vx = Math.random() * 4 - 2;
+ ball.vy = -5;
+ // Reset game variables
+ score = 0;
+ difficulty = 1;
+ scoreText.setText('0');
+ startTime = Date.now();
+ gameActive = true;
+ // Remove instructions
+ if (instructionsText.parent) {
+ instructionsText.parent.removeChild(instructionsText);
+ }
+ // Play background music
+ LK.playMusic('gameplay');
+}
+// Create touch effect
+function createTouchEffect(x, y) {
+ var colors = [0xFFCC00, 0xFF6666, 0x66FF66, 0x6666FF, 0xFF66FF, 0x66FFFF, 0xFFFF66];
+ var randomColor = colors[Math.floor(Math.random() * colors.length)];
+ var effect = new TouchEffect();
+ effect.init(x, y, randomColor);
+ game.addChild(effect);
+ touchEffects.push(effect);
+}
+// Handle touch/click on the game
+game.down = function (x, y, obj) {
+ // Start the game if not active
+ if (!gameActive) {
+ initGame();
+ return;
+ }
+ // Check if we directly touched the ball
+ var touchedBall = false;
+ // Calculate distance to ball
+ var dx = x - ball.x;
+ var dy = y - ball.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // If we're within the ball radius, the bounce was handled by ball.down
+ // If we're close to the ball, count it as a touch
+ if (distance < ball.children[0].width) {
+ touchedBall = true;
+ } else if (distance < ball.children[0].width * 2) {
+ // Close enough to count as a touch, but need to call bounce manually
+ touchedBall = ball.bounce(x, y);
+ }
+ // Create touch effect and update score if we touched the ball
+ if (touchedBall) {
+ createTouchEffect(x, y);
+ score += Math.floor(10 * difficulty);
+ scoreText.setText(score.toString());
+ ball.changeColor();
+ } else {
+ // We missed the ball
+ LK.getSound('miss').play();
+ }
+};
+// Update game state
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Update game timer
+ var elapsedSeconds = Math.floor((Date.now() - startTime) / 1000);
+ timeText.setText('Time: ' + elapsedSeconds);
+ // Increase difficulty over time
+ difficulty = 1 + elapsedSeconds / 30;
+ // If difficulty increases, increase ball speed
+ ball.maxSpeed = 25 + difficulty * 3;
+ ball.gravity = 0.3 + difficulty * 0.05;
+ // Check if the ball is moving too slowly
+ var speed = Math.sqrt(ball.vx * ball.vx + ball.vy * ball.vy);
+ if (speed < 1 && !ball.recentlyTouched()) {
+ // Ball stopped moving for too long, game over
+ LK.effects.flashScreen(0xFF0000, 500);
+ LK.stopMusic();
+ LK.showGameOver();
+ gameActive = false;
+ }
+ // Handle cleanup of touch effects
+ for (var i = touchEffects.length - 1; i >= 0; i--) {
+ if (!touchEffects[i].parent) {
+ touchEffects.splice(i, 1);
+ }
+ }
+};
+// Start with a welcome screen - game will start on first touch
+gameActive = false;
\ No newline at end of file