/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityX = 0;
self.velocityY = 0;
self.isMoving = false;
self.friction = 0.98;
self.bounceDelay = 0;
self.update = function () {
if (self.isMoving) {
self.x += self.velocityX;
self.y += self.velocityY;
// Apply friction
self.velocityX *= self.friction;
self.velocityY *= self.friction;
// Handle bouncing delay
if (self.bounceDelay > 0) {
self.bounceDelay--;
}
// Stop if velocity is very low
if (Math.abs(self.velocityX) < 0.5 && Math.abs(self.velocityY) < 0.5) {
self.velocityX = 0;
self.velocityY = 0;
self.isMoving = false;
}
// Boundary bouncing
if (self.x <= 30 || self.x >= 2018) {
if (self.bounceDelay <= 0) {
self.velocityX *= -0.8;
self.x = Math.max(30, Math.min(2018, self.x));
self.bounceDelay = 5;
LK.getSound('bounce').play();
}
}
if (self.y <= 30) {
if (self.bounceDelay <= 0) {
self.velocityY *= -0.8;
self.y = Math.max(30, self.y);
self.bounceDelay = 5;
LK.getSound('bounce').play();
}
}
// Reset if ball goes off bottom
if (self.y > 2732 + 100) {
self.resetPosition();
}
}
};
self.shoot = function (targetX, targetY, power) {
var deltaX = targetX - self.x;
var deltaY = targetY - self.y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
self.velocityX = deltaX / distance * power;
self.velocityY = deltaY / distance * power;
self.isMoving = true;
LK.getSound('kick').play();
};
self.resetPosition = function () {
self.x = 1024;
self.y = 2500;
self.velocityX = 0;
self.velocityY = 0;
self.isMoving = false;
};
return self;
});
var Goalkeeper = Container.expand(function () {
var self = Container.call(this);
var keeperGraphics = self.attachAsset('goalkeeper', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1;
self.speed = 2;
self.minX = 824;
self.maxX = 1224;
self.update = function () {
self.x += self.speed * self.direction;
if (self.x <= self.minX || self.x >= self.maxX) {
self.direction *= -1;
}
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = 1;
self.speed = 1;
self.minX = 100;
self.maxX = 1948;
self.update = function () {
self.x += self.speed * self.direction;
if (self.x <= self.minX || self.x >= self.maxX) {
self.direction *= -1;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228b22
});
/****
* Game Code
****/
// Game variables
var ball;
var goalkeeper;
var goal;
var obstacles = [];
var isDragging = false;
var dragStartX = 0;
var dragStartY = 0;
var aimLine;
var currentLevel = 1;
var isGameActive = true;
// UI elements
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(levelTxt);
// Create field background
var field = game.addChild(LK.getAsset('field', {
anchorX: 0,
anchorY: 1,
x: 0,
y: 2732
}));
// Create goal
goal = game.addChild(LK.getAsset('goal', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 200
}));
// Create ball
ball = game.addChild(new Ball());
ball.resetPosition();
// Create goalkeeper
goalkeeper = game.addChild(new Goalkeeper());
goalkeeper.x = 1024;
goalkeeper.y = 250;
// Create aim line (initially hidden)
aimLine = game.addChild(LK.getAsset('aimLine', {
anchorX: 0.5,
anchorY: 0,
alpha: 0
}));
// Initialize first level obstacles
function createObstacles() {
// Clear existing obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].destroy();
obstacles.splice(i, 1);
}
// Create obstacles based on level
var numObstacles = Math.min(currentLevel + 1, 5);
for (var i = 0; i < numObstacles; i++) {
var obstacle = game.addChild(new Obstacle());
obstacle.x = 300 + i * 350;
obstacle.y = 800 + i % 2 * 400;
obstacle.speed = 1 + currentLevel * 0.5;
obstacles.push(obstacle);
}
// Increase goalkeeper speed
goalkeeper.speed = 2 + currentLevel * 0.3;
}
createObstacles();
// Handle ball collision with obstacles
function checkCollisions() {
if (!ball.isMoving) return;
// Check collision with obstacles
for (var i = 0; i < obstacles.length; i++) {
if (ball.intersects(obstacles[i]) && ball.bounceDelay <= 0) {
// Simple bounce calculation
var deltaX = ball.x - obstacles[i].x;
var deltaY = ball.y - obstacles[i].y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if (distance > 0) {
ball.velocityX = deltaX / distance * Math.abs(ball.velocityX) * 0.8;
ball.velocityY = deltaY / distance * Math.abs(ball.velocityY) * 0.8;
ball.bounceDelay = 10;
LK.getSound('bounce').play();
}
}
}
// Check collision with goalkeeper
if (ball.intersects(goalkeeper) && ball.bounceDelay <= 0) {
var deltaX = ball.x - goalkeeper.x;
var deltaY = ball.y - goalkeeper.y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if (distance > 0) {
ball.velocityX = deltaX / distance * Math.abs(ball.velocityX) * 0.9;
ball.velocityY = deltaY / distance * Math.abs(ball.velocityY) * 0.9;
ball.bounceDelay = 10;
LK.getSound('bounce').play();
}
}
}
// Check for goal
function checkGoal() {
if (!ball.isMoving) return;
if (ball.intersects(goal)) {
// Goal scored!
LK.setScore(LK.getScore() + 10 * currentLevel);
scoreTxt.setText('Score: ' + LK.getScore());
currentLevel++;
levelTxt.setText('Level: ' + currentLevel);
LK.getSound('goal').play();
LK.effects.flashScreen(0x00ff00, 500);
// Check win condition
if (LK.getScore() >= 500) {
LK.showYouWin();
return;
}
// Reset for next level
ball.resetPosition();
createObstacles();
}
}
// Game controls
game.down = function (x, y, obj) {
if (!isGameActive || ball.isMoving) return;
isDragging = true;
dragStartX = x;
dragStartY = y;
aimLine.alpha = 0.7;
};
game.move = function (x, y, obj) {
if (!isDragging || !isGameActive) return;
// Update aim line
var deltaX = x - ball.x;
var deltaY = y - ball.y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if (distance > 0) {
aimLine.x = ball.x;
aimLine.y = ball.y;
aimLine.rotation = Math.atan2(deltaY, deltaX) + Math.PI / 2;
aimLine.height = Math.min(distance, 300);
}
};
game.up = function (x, y, obj) {
if (!isDragging || !isGameActive) return;
isDragging = false;
aimLine.alpha = 0;
// Calculate power and shoot
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var power = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 0.3, 20);
if (power > 2) {
ball.shoot(x, y, power);
}
};
// Main game loop
game.update = function () {
if (!isGameActive) return;
checkCollisions();
checkGoal();
// Reset ball if it stops in a bad position
if (!ball.isMoving && ball.y < 2000) {
var resetTimer = LK.setTimeout(function () {
ball.resetPosition();
}, 2000);
}
// Game over condition - if ball is stuck for too long
if (!ball.isMoving && ball.y > 2600 && LK.ticks % 300 === 0) {
// Check if no progress has been made
if (LK.getScore() === 0 && LK.ticks > 1800) {
// 30 seconds with no score
LK.showGameOver();
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,300 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Ball = Container.expand(function () {
+ var self = Container.call(this);
+ var ballGraphics = self.attachAsset('ball', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.isMoving = false;
+ self.friction = 0.98;
+ self.bounceDelay = 0;
+ self.update = function () {
+ if (self.isMoving) {
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Apply friction
+ self.velocityX *= self.friction;
+ self.velocityY *= self.friction;
+ // Handle bouncing delay
+ if (self.bounceDelay > 0) {
+ self.bounceDelay--;
+ }
+ // Stop if velocity is very low
+ if (Math.abs(self.velocityX) < 0.5 && Math.abs(self.velocityY) < 0.5) {
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.isMoving = false;
+ }
+ // Boundary bouncing
+ if (self.x <= 30 || self.x >= 2018) {
+ if (self.bounceDelay <= 0) {
+ self.velocityX *= -0.8;
+ self.x = Math.max(30, Math.min(2018, self.x));
+ self.bounceDelay = 5;
+ LK.getSound('bounce').play();
+ }
+ }
+ if (self.y <= 30) {
+ if (self.bounceDelay <= 0) {
+ self.velocityY *= -0.8;
+ self.y = Math.max(30, self.y);
+ self.bounceDelay = 5;
+ LK.getSound('bounce').play();
+ }
+ }
+ // Reset if ball goes off bottom
+ if (self.y > 2732 + 100) {
+ self.resetPosition();
+ }
+ }
+ };
+ self.shoot = function (targetX, targetY, power) {
+ var deltaX = targetX - self.x;
+ var deltaY = targetY - self.y;
+ var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ self.velocityX = deltaX / distance * power;
+ self.velocityY = deltaY / distance * power;
+ self.isMoving = true;
+ LK.getSound('kick').play();
+ };
+ self.resetPosition = function () {
+ self.x = 1024;
+ self.y = 2500;
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.isMoving = false;
+ };
+ return self;
+});
+var Goalkeeper = Container.expand(function () {
+ var self = Container.call(this);
+ var keeperGraphics = self.attachAsset('goalkeeper', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.direction = 1;
+ self.speed = 2;
+ self.minX = 824;
+ self.maxX = 1224;
+ self.update = function () {
+ self.x += self.speed * self.direction;
+ if (self.x <= self.minX || self.x >= self.maxX) {
+ self.direction *= -1;
+ }
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.direction = 1;
+ self.speed = 1;
+ self.minX = 100;
+ self.maxX = 1948;
+ self.update = function () {
+ self.x += self.speed * self.direction;
+ if (self.x <= self.minX || self.x >= self.maxX) {
+ self.direction *= -1;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x228b22
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var ball;
+var goalkeeper;
+var goal;
+var obstacles = [];
+var isDragging = false;
+var dragStartX = 0;
+var dragStartY = 0;
+var aimLine;
+var currentLevel = 1;
+var isGameActive = true;
+// UI elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var levelTxt = new Text2('Level: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(levelTxt);
+// Create field background
+var field = game.addChild(LK.getAsset('field', {
+ anchorX: 0,
+ anchorY: 1,
+ x: 0,
+ y: 2732
+}));
+// Create goal
+goal = game.addChild(LK.getAsset('goal', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 200
+}));
+// Create ball
+ball = game.addChild(new Ball());
+ball.resetPosition();
+// Create goalkeeper
+goalkeeper = game.addChild(new Goalkeeper());
+goalkeeper.x = 1024;
+goalkeeper.y = 250;
+// Create aim line (initially hidden)
+aimLine = game.addChild(LK.getAsset('aimLine', {
+ anchorX: 0.5,
+ anchorY: 0,
+ alpha: 0
+}));
+// Initialize first level obstacles
+function createObstacles() {
+ // Clear existing obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ obstacles[i].destroy();
+ obstacles.splice(i, 1);
+ }
+ // Create obstacles based on level
+ var numObstacles = Math.min(currentLevel + 1, 5);
+ for (var i = 0; i < numObstacles; i++) {
+ var obstacle = game.addChild(new Obstacle());
+ obstacle.x = 300 + i * 350;
+ obstacle.y = 800 + i % 2 * 400;
+ obstacle.speed = 1 + currentLevel * 0.5;
+ obstacles.push(obstacle);
+ }
+ // Increase goalkeeper speed
+ goalkeeper.speed = 2 + currentLevel * 0.3;
+}
+createObstacles();
+// Handle ball collision with obstacles
+function checkCollisions() {
+ if (!ball.isMoving) return;
+ // Check collision with obstacles
+ for (var i = 0; i < obstacles.length; i++) {
+ if (ball.intersects(obstacles[i]) && ball.bounceDelay <= 0) {
+ // Simple bounce calculation
+ var deltaX = ball.x - obstacles[i].x;
+ var deltaY = ball.y - obstacles[i].y;
+ var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ if (distance > 0) {
+ ball.velocityX = deltaX / distance * Math.abs(ball.velocityX) * 0.8;
+ ball.velocityY = deltaY / distance * Math.abs(ball.velocityY) * 0.8;
+ ball.bounceDelay = 10;
+ LK.getSound('bounce').play();
+ }
+ }
+ }
+ // Check collision with goalkeeper
+ if (ball.intersects(goalkeeper) && ball.bounceDelay <= 0) {
+ var deltaX = ball.x - goalkeeper.x;
+ var deltaY = ball.y - goalkeeper.y;
+ var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ if (distance > 0) {
+ ball.velocityX = deltaX / distance * Math.abs(ball.velocityX) * 0.9;
+ ball.velocityY = deltaY / distance * Math.abs(ball.velocityY) * 0.9;
+ ball.bounceDelay = 10;
+ LK.getSound('bounce').play();
+ }
+ }
+}
+// Check for goal
+function checkGoal() {
+ if (!ball.isMoving) return;
+ if (ball.intersects(goal)) {
+ // Goal scored!
+ LK.setScore(LK.getScore() + 10 * currentLevel);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ currentLevel++;
+ levelTxt.setText('Level: ' + currentLevel);
+ LK.getSound('goal').play();
+ LK.effects.flashScreen(0x00ff00, 500);
+ // Check win condition
+ if (LK.getScore() >= 500) {
+ LK.showYouWin();
+ return;
+ }
+ // Reset for next level
+ ball.resetPosition();
+ createObstacles();
+ }
+}
+// Game controls
+game.down = function (x, y, obj) {
+ if (!isGameActive || ball.isMoving) return;
+ isDragging = true;
+ dragStartX = x;
+ dragStartY = y;
+ aimLine.alpha = 0.7;
+};
+game.move = function (x, y, obj) {
+ if (!isDragging || !isGameActive) return;
+ // Update aim line
+ var deltaX = x - ball.x;
+ var deltaY = y - ball.y;
+ var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ if (distance > 0) {
+ aimLine.x = ball.x;
+ aimLine.y = ball.y;
+ aimLine.rotation = Math.atan2(deltaY, deltaX) + Math.PI / 2;
+ aimLine.height = Math.min(distance, 300);
+ }
+};
+game.up = function (x, y, obj) {
+ if (!isDragging || !isGameActive) return;
+ isDragging = false;
+ aimLine.alpha = 0;
+ // Calculate power and shoot
+ var deltaX = x - dragStartX;
+ var deltaY = y - dragStartY;
+ var power = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 0.3, 20);
+ if (power > 2) {
+ ball.shoot(x, y, power);
+ }
+};
+// Main game loop
+game.update = function () {
+ if (!isGameActive) return;
+ checkCollisions();
+ checkGoal();
+ // Reset ball if it stops in a bad position
+ if (!ball.isMoving && ball.y < 2000) {
+ var resetTimer = LK.setTimeout(function () {
+ ball.resetPosition();
+ }, 2000);
+ }
+ // Game over condition - if ball is stuck for too long
+ if (!ball.isMoving && ball.y > 2600 && LK.ticks % 300 === 0) {
+ // Check if no progress has been made
+ if (LK.getScore() === 0 && LK.ticks > 1800) {
+ // 30 seconds with no score
+ LK.showGameOver();
+ }
+ }
+};
\ No newline at end of file