/**** * 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.gravity = -0.475; self.friction = 0.98; self.shoot = function (targetX, targetY) { var deltaX = targetX - self.x; var deltaY = targetY - self.y; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); self.velocityX = deltaX / distance * 30; // Increase speed for direct aim self.velocityY = deltaY / distance * 30; // Increase speed for direct aim self.isMoving = true; }; self.reset = function () { self.x = 1024; self.y = 1700; self.velocityX = 0; self.velocityY = 0; self.isMoving = false; }; self.update = function () { if (self.isMoving) { self.x += self.velocityX; self.y += self.velocityY; self.velocityY += self.gravity; self.velocityX *= self.friction; self.velocityY *= self.friction; if (Math.abs(self.velocityX) < 0.5 && Math.abs(self.velocityY) < 0.5) { self.isMoving = false; } } }; // Override intersects to reduce the hotbox of the ball self.intersects = function (other) { // Get bounds of this ball var ballWidth = ballGraphics.width; var ballHeight = ballGraphics.height; // Reduce hotbox by 30% in each direction var hotboxShrinkX = ballWidth * 0.15; var hotboxShrinkY = ballHeight * 0.15; var ballLeft = self.x - ballWidth / 2 + hotboxShrinkX; var ballRight = self.x + ballWidth / 2 - hotboxShrinkX; var ballTop = self.y - ballHeight / 2 + hotboxShrinkY; var ballBottom = self.y + ballHeight / 2 - hotboxShrinkY; // Get bounds of the other object var otherLeft = other.x; var otherRight = other.x + (other.width || other.getAsset && other.getAsset({}, {}).width || 0); var otherTop = other.y; var otherBottom = other.y + (other.height || other.getAsset && other.getAsset({}, {}).height || 0); // If other has anchor, adjust accordingly if (typeof other.anchorX === "number" && typeof other.anchorY === "number" && other.width && other.height) { otherLeft = other.x - other.width * other.anchorX; otherRight = other.x + other.width * (1 - other.anchorX); otherTop = other.y - other.height * other.anchorY; otherBottom = other.y + other.height * (1 - other.anchorY); } // AABB collision return !(ballLeft > otherRight || ballRight < otherLeft || ballTop > otherBottom || ballBottom < otherTop); }; return self; }); var Goalkeeper = Container.expand(function () { var self = Container.call(this); var keeperGraphics = self.attachAsset('goalkeeper', { anchorX: 0.5, anchorY: 1.0 }); self.direction = 1; self.speed = 5; self.minX = 710; // kale direğinin sol kenarı self.maxX = 1340; // kale direğinin sağ kenarı self.reactDistance = 700; self.update = function () { self.x += self.direction * self.speed; if (self.x <= self.minX) { self.x = self.minX; self.direction = 1; } else if (self.x >= self.maxX) { self.x = self.maxX; self.direction = -1; } if (ball.isMoving && ball.y < self.y + self.reactDistance) { if (ball.x < self.x - 20) { self.direction = -1; self.speed = 5; } else if (ball.x > self.x + 20) { self.direction = 1; self.speed = 5; } } else { self.speed = 3 + Math.floor(goalCount / 1); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x228b22 }); /**** * Game Code ****/ LK.playMusic('MatchMusic'); var goalWidth = 800; // Increased width var goalHeight = 400; // Increased height var goalX = 1024 - goalWidth / 2; // Centered horizontally var goalY = 500; // Moved further down the screen var goalPostLeftX = goalX; // Left post X position var goalPostRightX = goalX + goalWidth; // Right post X position var background = game.addChild(LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366, scaleX: 2.048, scaleY: 2.732 })); var net = game.addChild(LK.getAsset('net', { x: goalX + 20, y: goalY + 20, alpha: 0.3 })); var leftPost = game.addChild(LK.getAsset('goalpost', { x: goalX, y: goalY, anchorX: 0.5, anchorY: 0 })); var rightPost = game.addChild(LK.getAsset('goalpost', { x: goalX + goalWidth, y: goalY, anchorX: 0.5, anchorY: 0 })); var crossbar = game.addChild(LK.getAsset('crossbar', { x: goalX, y: goalY, anchorX: 0, anchorY: 0.5 })); var ball = game.addChild(new Ball()); ball.reset(); var goalkeeper = game.addChild(new Goalkeeper()); goalkeeper.x = 1024; goalkeeper.y = goalY + goalHeight + 30; // Moved even closer to the net var aimLine = game.addChild(LK.getAsset('aimLine', { anchorX: 0.5, anchorY: 0, alpha: 0 })); var isAiming = false; var shotCount = 0; var goalCount = 0; var scoreTxt = new Text2('Goals: 0', { size: 90, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 3); // Anchor to a position slightly higher than before LK.gui.bottom.addChild(scoreTxt); // Add score text to the bottom of the screen var instructionTxt = new Text2('Tap and drag to aim, release to shoot!', { size: 80, fill: 0xFFFFFF }); instructionTxt.anchor.set(0.5, 3); instructionTxt.x = 1024; instructionTxt.y = 2400; game.addChild(instructionTxt); // Add "Top Score : MrSabri 65" to the bottom left corner var topScoreTxt = new Text2('Top Score : MrSabri 65', { size: 50, fill: 0xFFFF99 //{1e} // light yellow }); topScoreTxt.anchor.set(0, 1.3); // left edge, bottom LK.gui.bottomLeft.addChild(topScoreTxt); function updateScore() { scoreTxt.setText('Goals: ' + goalCount); } function resetForNextShot() { LK.setTimeout(function () { ball.reset(); isAiming = false; aimLine.alpha = 0; ball.reset(); isAiming = false; aimLine.alpha = 0; }, 500); } function checkGoal() { if (ball.intersects(net)) { // Check for goalkeeper collision with reduced side hitbox var keeperSaveZone = { x: goalkeeper.x - 110, // Increased from 100 to 110 for wider side coverage y: goalkeeper.y - 160, // Reduced height zone width: 220, // Increased from 200 to 220 for wider side hitbox height: 160 // Reduced from ~212 to 160 }; var ballInSaveZone = ball.x > keeperSaveZone.x && ball.x < keeperSaveZone.x + keeperSaveZone.width && ball.y > keeperSaveZone.y && ball.y < keeperSaveZone.y + keeperSaveZone.height; if (!ballInSaveZone) { goalCount++; goalkeeper.speed += 1; // Increase goalkeeper speed after a goal is scored LK.effects.flashScreen(0x00ff00, 500); // Trigger green light effect } else { goalkeeper.speed += 2; // Increase goalkeeper speed after conceding a goal LK.effects.flashScreen(0xff0000, 500); // Trigger red light effect console.log("Game Over by Save. Current goalCount: " + goalCount); LK.showGameOver("Game Over! Goals Scored: " + goalCount); LK.stopMusic(); } updateScore(); resetForNextShot(); return true; } // Check if ball is in goal area but doesn't touch net (save scenario) var inGoalArea = ball.x > goalX - 50 && ball.x < goalX + goalWidth + 50 && ball.y > goalY - 50 && ball.y < goalY + goalHeight + 50; if (inGoalArea && !ball.intersects(net) && ball.isMoving) { resetForNextShot(); return true; } return false; } game.down = function (x, y, obj) { if (!ball.isMoving) { isAiming = true; aimLine.x = ball.x; aimLine.y = ball.y; aimLine.alpha = 0.8; var deltaX = x - ball.x; var deltaY = y - ball.y; var angle = Math.atan2(deltaY, deltaX); aimLine.rotation = angle - Math.PI / 2; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); aimLine.height = Math.min(distance * 0.5, 200); } }; game.move = function (x, y, obj) { if (isAiming) { var deltaX = x - ball.x; var deltaY = y - ball.y; var angle = Math.atan2(deltaY, deltaX); aimLine.rotation = angle - Math.PI / 2; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); aimLine.height = Math.min(distance * 0.5, 200); } }; game.up = function (x, y, obj) { if (isAiming && !ball.isMoving) { shotCount++; ball.shoot(x, y); isAiming = false; aimLine.alpha = 0; if (shotCount === 1) { instructionTxt.alpha = 0; } } }; var ballLastY = ball.y; var ballLastInGoal = false; game.update = function () { var currentInGoal = ball.x > goalX && ball.x < goalX + goalWidth && ball.y > goalY && ball.y < goalY + goalHeight; if (!ballLastInGoal && currentInGoal && ball.isMoving) { checkGoal(); } if (ball.y < -100) { console.log("Game Over by Ball Out of Bounds. Current goalCount: " + goalCount); LK.showGameOver("Game Over! Goals Scored: " + goalCount); LK.stopMusic(); } if (ball.x < 0 || ball.x > 2048) { console.log("Game Over by Ball Out of Bounds. Current goalCount: " + goalCount); LK.showGameOver("Game Over! Goals Scored: " + goalCount); LK.stopMusic(); } ballLastY = ball.y; ballLastInGoal = currentInGoal; };
/****
* 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.gravity = -0.475;
self.friction = 0.98;
self.shoot = function (targetX, targetY) {
var deltaX = targetX - self.x;
var deltaY = targetY - self.y;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
self.velocityX = deltaX / distance * 30; // Increase speed for direct aim
self.velocityY = deltaY / distance * 30; // Increase speed for direct aim
self.isMoving = true;
};
self.reset = function () {
self.x = 1024;
self.y = 1700;
self.velocityX = 0;
self.velocityY = 0;
self.isMoving = false;
};
self.update = function () {
if (self.isMoving) {
self.x += self.velocityX;
self.y += self.velocityY;
self.velocityY += self.gravity;
self.velocityX *= self.friction;
self.velocityY *= self.friction;
if (Math.abs(self.velocityX) < 0.5 && Math.abs(self.velocityY) < 0.5) {
self.isMoving = false;
}
}
};
// Override intersects to reduce the hotbox of the ball
self.intersects = function (other) {
// Get bounds of this ball
var ballWidth = ballGraphics.width;
var ballHeight = ballGraphics.height;
// Reduce hotbox by 30% in each direction
var hotboxShrinkX = ballWidth * 0.15;
var hotboxShrinkY = ballHeight * 0.15;
var ballLeft = self.x - ballWidth / 2 + hotboxShrinkX;
var ballRight = self.x + ballWidth / 2 - hotboxShrinkX;
var ballTop = self.y - ballHeight / 2 + hotboxShrinkY;
var ballBottom = self.y + ballHeight / 2 - hotboxShrinkY;
// Get bounds of the other object
var otherLeft = other.x;
var otherRight = other.x + (other.width || other.getAsset && other.getAsset({}, {}).width || 0);
var otherTop = other.y;
var otherBottom = other.y + (other.height || other.getAsset && other.getAsset({}, {}).height || 0);
// If other has anchor, adjust accordingly
if (typeof other.anchorX === "number" && typeof other.anchorY === "number" && other.width && other.height) {
otherLeft = other.x - other.width * other.anchorX;
otherRight = other.x + other.width * (1 - other.anchorX);
otherTop = other.y - other.height * other.anchorY;
otherBottom = other.y + other.height * (1 - other.anchorY);
}
// AABB collision
return !(ballLeft > otherRight || ballRight < otherLeft || ballTop > otherBottom || ballBottom < otherTop);
};
return self;
});
var Goalkeeper = Container.expand(function () {
var self = Container.call(this);
var keeperGraphics = self.attachAsset('goalkeeper', {
anchorX: 0.5,
anchorY: 1.0
});
self.direction = 1;
self.speed = 5;
self.minX = 710; // kale direğinin sol kenarı
self.maxX = 1340; // kale direğinin sağ kenarı
self.reactDistance = 700;
self.update = function () {
self.x += self.direction * self.speed;
if (self.x <= self.minX) {
self.x = self.minX;
self.direction = 1;
} else if (self.x >= self.maxX) {
self.x = self.maxX;
self.direction = -1;
}
if (ball.isMoving && ball.y < self.y + self.reactDistance) {
if (ball.x < self.x - 20) {
self.direction = -1;
self.speed = 5;
} else if (ball.x > self.x + 20) {
self.direction = 1;
self.speed = 5;
}
} else {
self.speed = 3 + Math.floor(goalCount / 1);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228b22
});
/****
* Game Code
****/
LK.playMusic('MatchMusic');
var goalWidth = 800; // Increased width
var goalHeight = 400; // Increased height
var goalX = 1024 - goalWidth / 2; // Centered horizontally
var goalY = 500; // Moved further down the screen
var goalPostLeftX = goalX; // Left post X position
var goalPostRightX = goalX + goalWidth; // Right post X position
var background = game.addChild(LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366,
scaleX: 2.048,
scaleY: 2.732
}));
var net = game.addChild(LK.getAsset('net', {
x: goalX + 20,
y: goalY + 20,
alpha: 0.3
}));
var leftPost = game.addChild(LK.getAsset('goalpost', {
x: goalX,
y: goalY,
anchorX: 0.5,
anchorY: 0
}));
var rightPost = game.addChild(LK.getAsset('goalpost', {
x: goalX + goalWidth,
y: goalY,
anchorX: 0.5,
anchorY: 0
}));
var crossbar = game.addChild(LK.getAsset('crossbar', {
x: goalX,
y: goalY,
anchorX: 0,
anchorY: 0.5
}));
var ball = game.addChild(new Ball());
ball.reset();
var goalkeeper = game.addChild(new Goalkeeper());
goalkeeper.x = 1024;
goalkeeper.y = goalY + goalHeight + 30; // Moved even closer to the net
var aimLine = game.addChild(LK.getAsset('aimLine', {
anchorX: 0.5,
anchorY: 0,
alpha: 0
}));
var isAiming = false;
var shotCount = 0;
var goalCount = 0;
var scoreTxt = new Text2('Goals: 0', {
size: 90,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 3); // Anchor to a position slightly higher than before
LK.gui.bottom.addChild(scoreTxt); // Add score text to the bottom of the screen
var instructionTxt = new Text2('Tap and drag to aim, release to shoot!', {
size: 80,
fill: 0xFFFFFF
});
instructionTxt.anchor.set(0.5, 3);
instructionTxt.x = 1024;
instructionTxt.y = 2400;
game.addChild(instructionTxt);
// Add "Top Score : MrSabri 65" to the bottom left corner
var topScoreTxt = new Text2('Top Score : MrSabri 65', {
size: 50,
fill: 0xFFFF99 //{1e} // light yellow
});
topScoreTxt.anchor.set(0, 1.3); // left edge, bottom
LK.gui.bottomLeft.addChild(topScoreTxt);
function updateScore() {
scoreTxt.setText('Goals: ' + goalCount);
}
function resetForNextShot() {
LK.setTimeout(function () {
ball.reset();
isAiming = false;
aimLine.alpha = 0;
ball.reset();
isAiming = false;
aimLine.alpha = 0;
}, 500);
}
function checkGoal() {
if (ball.intersects(net)) {
// Check for goalkeeper collision with reduced side hitbox
var keeperSaveZone = {
x: goalkeeper.x - 110,
// Increased from 100 to 110 for wider side coverage
y: goalkeeper.y - 160,
// Reduced height zone
width: 220,
// Increased from 200 to 220 for wider side hitbox
height: 160 // Reduced from ~212 to 160
};
var ballInSaveZone = ball.x > keeperSaveZone.x && ball.x < keeperSaveZone.x + keeperSaveZone.width && ball.y > keeperSaveZone.y && ball.y < keeperSaveZone.y + keeperSaveZone.height;
if (!ballInSaveZone) {
goalCount++;
goalkeeper.speed += 1; // Increase goalkeeper speed after a goal is scored
LK.effects.flashScreen(0x00ff00, 500); // Trigger green light effect
} else {
goalkeeper.speed += 2; // Increase goalkeeper speed after conceding a goal
LK.effects.flashScreen(0xff0000, 500); // Trigger red light effect
console.log("Game Over by Save. Current goalCount: " + goalCount);
LK.showGameOver("Game Over! Goals Scored: " + goalCount);
LK.stopMusic();
}
updateScore();
resetForNextShot();
return true;
}
// Check if ball is in goal area but doesn't touch net (save scenario)
var inGoalArea = ball.x > goalX - 50 && ball.x < goalX + goalWidth + 50 && ball.y > goalY - 50 && ball.y < goalY + goalHeight + 50;
if (inGoalArea && !ball.intersects(net) && ball.isMoving) {
resetForNextShot();
return true;
}
return false;
}
game.down = function (x, y, obj) {
if (!ball.isMoving) {
isAiming = true;
aimLine.x = ball.x;
aimLine.y = ball.y;
aimLine.alpha = 0.8;
var deltaX = x - ball.x;
var deltaY = y - ball.y;
var angle = Math.atan2(deltaY, deltaX);
aimLine.rotation = angle - Math.PI / 2;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
aimLine.height = Math.min(distance * 0.5, 200);
}
};
game.move = function (x, y, obj) {
if (isAiming) {
var deltaX = x - ball.x;
var deltaY = y - ball.y;
var angle = Math.atan2(deltaY, deltaX);
aimLine.rotation = angle - Math.PI / 2;
var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
aimLine.height = Math.min(distance * 0.5, 200);
}
};
game.up = function (x, y, obj) {
if (isAiming && !ball.isMoving) {
shotCount++;
ball.shoot(x, y);
isAiming = false;
aimLine.alpha = 0;
if (shotCount === 1) {
instructionTxt.alpha = 0;
}
}
};
var ballLastY = ball.y;
var ballLastInGoal = false;
game.update = function () {
var currentInGoal = ball.x > goalX && ball.x < goalX + goalWidth && ball.y > goalY && ball.y < goalY + goalHeight;
if (!ballLastInGoal && currentInGoal && ball.isMoving) {
checkGoal();
}
if (ball.y < -100) {
console.log("Game Over by Ball Out of Bounds. Current goalCount: " + goalCount);
LK.showGameOver("Game Over! Goals Scored: " + goalCount);
LK.stopMusic();
}
if (ball.x < 0 || ball.x > 2048) {
console.log("Game Over by Ball Out of Bounds. Current goalCount: " + goalCount);
LK.showGameOver("Game Over! Goals Scored: " + goalCount);
LK.stopMusic();
}
ballLastY = ball.y;
ballLastInGoal = currentInGoal;
};