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