User prompt
başlangıç süresini 10 yap
User prompt
onu değil ekleme süresini 2 yap
User prompt
2 saniyeye düşür bakalım
User prompt
saniye 30 ile başlasın deliğe girince 3 saniye kazanalım
User prompt
Köşelere sıçratan jöle ekler misin üçgen köşeye yapışan
User prompt
ABİ YAZIYI EKRANIN ORTASINA KOY
User prompt
Please fix the bug: 'Uncaught ReferenceError: scoreTxt is not defined' in or related to this line: 'scoreTxt.setText('Strokes: ' + strokes);' Line Number: 369
User prompt
Hala görülmğyor yazı ortala yukarıya az önce Strokes yazan yere koy
User prompt
Time yazısını ortala görünmüyor
User prompt
Timer ekleyelim timer bitmeden deliğe girmeye çalışsın oyuncu
User prompt
Kalkmadı pause butonu
User prompt
Pause butonunu kaldırabilir miyiz
Code edit (1 edits merged)
Please save this source code
User prompt
Top deliğe değdiği zaman hızı kesiliyor öyle olmasın ama devam etsin
User prompt
TOPUN DELİĞİN TAM ORTASINA DEĞMESİ GEREKMEMELİ, DELİĞİN HERHANGİ BİR YERİNE TEMAS ETTİĞİ ANDA DELİK YOK OLMALI
User prompt
TAMAM DELİK YOK OLUNCA ŞİMDİ RANDOM Bİ NOKTADA YENİ DELİK OLUŞTUR
User prompt
TOP YOK OLMASIN
User prompt
YA TOP DEQUEUE OLDU DELİĞİ DEQUEUELA
User prompt
touchlayamıyor çünkü üstünden geçiyor deliğin, deliğin areasına girdiğinde dequeuela holeu işte amk
User prompt
delik yok olsun diyom
User prompt
olmadı
User prompt
top değdiği an yok olsun
User prompt
suction işi olmasın deyince deq olsun direkt delik
User prompt
çaluşıyo ama delik 200 yerde belirip sonra bir yerde çıkıo
User prompt
bitti oyun yine
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Ball class
var GolfBall = Container.expand(function () {
var self = Container.call(this);
var ball = self.attachAsset('golfBall', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = ball.width / 2;
self.vx = 0;
self.vy = 0;
self.moving = false;
// For drag aiming
self.aimArrow = null;
// For tracking drag
self.isAiming = false;
self.aimStartX = 0;
self.aimStartY = 0;
self.aimEndX = 0;
self.aimEndY = 0;
// Show aim arrow
self.showArrow = function (dx, dy) {
if (!self.aimArrow) {
self.aimArrow = LK.getAsset('golfArrow', {
anchorX: 0.5,
anchorY: 1
});
self.addChild(self.aimArrow);
}
var len = Math.sqrt(dx * dx + dy * dy);
// Clamp arrow length for visual
var maxLen = 300;
var arrowLen = Math.min(len, maxLen);
self.aimArrow.height = arrowLen;
self.aimArrow.rotation = Math.atan2(dy, dx) + Math.PI / 2;
self.aimArrow.visible = true;
};
self.hideArrow = function () {
if (self.aimArrow) {
self.aimArrow.visible = false;
}
};
// Update ball physics
self.update = function () {
if (self.moving) {
// Move ball
self.x += self.vx;
self.y += self.vy;
// Friction
var speed = Math.sqrt(self.vx * self.vx + self.vy * self.vy);
if (speed > 0) {
var friction = 0.98;
self.vx *= friction;
self.vy *= friction;
// Stop if very slow
if (Math.sqrt(self.vx * self.vx + self.vy * self.vy) < 1.2) {
self.vx = 0;
self.vy = 0;
self.moving = false;
}
}
}
};
return self;
});
// Hole class
var GolfHole = Container.expand(function () {
var self = Container.call(this);
var hole = self.attachAsset('golfHole', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = hole.width / 2;
return self;
});
// Wall class
var GolfWall = Container.expand(function () {
var self = Container.call(this);
var wall = self.attachAsset('golfWall', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = wall.width;
self.height = wall.height;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x6abf4b // green grass
});
/****
* Game Code
****/
// Game area margins
// Ball: white circle
// Hole: black circle
// Wall: green rectangle
// Arrow: yellow rectangle (for aiming indicator)
var margin = 120;
// Course size
var courseWidth = 2048 - margin * 2;
var courseHeight = 2732 - margin * 2;
// Walls array
var walls = [];
// Top wall (static)
var topWall = new GolfWall();
topWall.width = courseWidth;
topWall.height = 300;
topWall.x = 2048 / 2;
topWall.y = margin - 200;
topWall.children[0].width = courseWidth;
topWall.children[0].height = 120;
walls.push(topWall);
game.addChild(topWall);
// Bottom wall (static)
var bottomWall = new GolfWall();
bottomWall.width = courseWidth;
bottomWall.height = 300;
bottomWall.x = 2048 / 2;
bottomWall.y = 2732 - margin + 200;
bottomWall.children[0].width = courseWidth;
bottomWall.children[0].height = 120;
walls.push(bottomWall);
game.addChild(bottomWall);
// Left wall (static)
var leftWall = new GolfWall();
leftWall.width = 125;
leftWall.height = courseHeight;
leftWall.x = margin - 75;
leftWall.y = 2732 / 2;
leftWall.children[0].width = 120;
leftWall.children[0].height = courseHeight;
walls.push(leftWall);
game.addChild(leftWall);
// Right wall (static)
var rightWall = new GolfWall();
rightWall.width = 125;
rightWall.height = courseHeight;
rightWall.x = 2048 - margin + 75;
rightWall.y = 2732 / 2;
rightWall.children[0].width = 120;
rightWall.children[0].height = courseHeight;
walls.push(rightWall);
game.addChild(rightWall);
// Create hole
var hole = new GolfHole();
hole.x = 2048 - margin - 200;
hole.y = 2732 - margin - 200;
game.addChild(hole);
// Create ball
var ball = new GolfBall();
// Start ball at bottom left, well away from top wall
ball.x = margin + 200;
ball.y = 2732 - margin - 400;
game.addChild(ball);
// Walls are created statically above
// Strokes counter
var strokes = 0;
// Score text (Strokes) at the top center
var scoreTxt = new Text2('Strokes: ' + strokes, {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
scoreTxt.x = 2048 / 2;
// Timer variables
var timerDuration = 15; // seconds per hole
var timerValue = timerDuration;
var timerInterval = null;
// Timer text
var timerTxt = new Text2('Time: ' + timerValue, {
size: 100,
fill: 0xFFFFFF
});
timerTxt.anchor.set(0.5, 0.5);
// Add timer text to the main game scene, not the GUI, so it appears in the center of the screen
game.addChild(timerTxt);
// Center timer text in the middle of the screen
timerTxt.x = 2048 / 2;
timerTxt.y = 2732 / 2;
// Function to start/reset timer
function startTimer() {
timerValue = timerDuration;
timerTxt.setText('Time: ' + timerValue);
if (timerInterval) {
LK.clearInterval(timerInterval);
}
timerInterval = LK.setInterval(function () {
timerValue -= 1;
if (timerValue < 0) timerValue = 0;
timerTxt.setText('Time: ' + timerValue);
if (timerValue <= 0) {
LK.clearInterval(timerInterval);
LK.showGameOver();
}
}, 1000);
}
// Start timer at game start
startTimer();
// Remove the pause button from the GUI overlay if it exists
if (LK.gui.pause) {
LK.gui.pause.visible = false;
if (LK.gui.pause.parent) {
LK.gui.pause.parent.removeChild(LK.gui.pause);
}
}
// Drag/aim state
var isDragging = false;
var dragStartX = 0;
var dragStartY = 0;
// Helper: clamp ball inside course
function clampBallPosition() {
// No clamping to invisible walls; allow ball to go to the very edge of the course.
}
// Helper: ball-wall collision
function handleWallCollisions() {
for (var i = 0; i < walls.length; i++) {
var w = walls[i];
// Axis-aligned rectangle collision
var wx = w.x;
var wy = w.y;
var ww = w.width;
var wh = w.height;
var bx = ball.x;
var by = ball.y;
var r = ball.radius;
// Rectangle bounds
var left = wx - ww / 2;
var right = wx + ww / 2;
var top = wy - wh / 2;
var bottom = wy + wh / 2;
// Find closest point on wall to ball
var closestX = Math.max(left, Math.min(bx, right));
var closestY = Math.max(top, Math.min(by, bottom));
var dx = bx - closestX;
var dy = by - closestY;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < r) {
// Ball is colliding with wall
// Push ball out
var overlap = r - dist + 1;
if (dist === 0) {
// Prevent NaN
dx = 1;
dy = 0;
dist = 1;
}
// Move ball out of wall
ball.x += dx / dist * overlap;
ball.y += dy / dist * overlap;
// Calculate the normal vector
var nx = dx / dist;
var ny = dy / dist;
// Calculate dot product of velocity and normal
var dot = ball.vx * nx + ball.vy * ny;
// Reflect velocity using the normal (like center wall)
ball.vx = ball.vx - 2 * dot * nx;
ball.vy = ball.vy - 2 * dot * ny;
// Dampen speed
ball.vx *= 0.7;
ball.vy *= 0.7;
}
}
}
// Helper: ball-in-hole detection
function checkHole() {
var dx = ball.x - hole.x;
var dy = ball.y - hole.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < hole.radius - ball.radius / 2) {
// Ball in hole! Instantly hide ball and the hole
ball.moving = false;
ball.vx = 0;
ball.vy = 0;
ball.visible = false;
hole.visible = false;
return true;
}
return false;
}
// Helper: reset ball after win (not needed, handled by LK.showYouWin)
// Game move handler (for drag aiming)
function handleMove(x, y, obj) {
if (isDragging && !ball.moving) {
// Clamp drag to max length
var dx = x - dragStartX;
var dy = y - dragStartY;
var maxDrag = 400;
var dragLen = Math.sqrt(dx * dx + dy * dy);
if (dragLen > maxDrag) {
var scale = maxDrag / dragLen;
dx *= scale;
dy *= scale;
}
// Show aim arrow
ball.showArrow(-dx, -dy);
}
}
// Game down handler (start drag)
game.down = function (x, y, obj) {
// Only allow aiming if ball is not moving and touch is near ball
if (!ball.moving) {
var dx = x - ball.x;
var dy = y - ball.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < ball.radius + 40) {
isDragging = true;
dragStartX = ball.x;
dragStartY = ball.y;
ball.aimStartX = x;
ball.aimStartY = y;
ball.showArrow(0, 0);
}
}
};
// Game move handler
game.move = function (x, y, obj) {
if (isDragging && !ball.moving) {
// Update aim arrow
var dx = x - dragStartX;
var dy = y - dragStartY;
var maxDrag = 400;
var dragLen = Math.sqrt(dx * dx + dy * dy);
if (dragLen > maxDrag) {
var scale = maxDrag / dragLen;
dx *= scale;
dy *= scale;
}
ball.showArrow(-dx, -dy);
}
};
// Game up handler (release drag, shoot)
game.up = function (x, y, obj) {
if (isDragging && !ball.moving) {
var dx = x - dragStartX;
var dy = y - dragStartY;
// Power proportional to drag length
var power = Math.sqrt(dx * dx + dy * dy);
var maxPower = 38;
var minPower = 10;
var shotPower = Math.min(power / 10, maxPower);
if (shotPower < minPower / 2) {
// Too short, ignore
ball.hideArrow();
isDragging = false;
return;
}
// Set velocity (opposite direction of drag)
var angle = Math.atan2(dy, dx);
ball.vx = -Math.cos(angle) * shotPower;
ball.vy = -Math.sin(angle) * shotPower;
ball.moving = true;
ball.hideArrow();
isDragging = false;
// Increment strokes
strokes += 1;
scoreTxt.setText('Strokes: ' + strokes);
}
};
// Main game update
game.update = function () {
// Ball physics
ball.update();
// Clamp ball inside course
clampBallPosition();
// Ball-wall collisions
handleWallCollisions();
// Ball-in-hole
if (hole.visible && ball.visible) {
var dx = ball.x - hole.x;
var dy = ball.y - hole.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < hole.radius + ball.radius / 2) {
// Ball touched the hole! Instantly hide the hole, but do not dequeue or hide the ball
if (hole.parent) {
hole.parent.removeChild(hole);
}
hole.visible = false;
// Do not stop the ball when it touches the hole; let it keep moving
// Create a new hole at a random position (not too close to the ball or walls)
var newHole = new GolfHole();
var safeMargin = margin + 200;
var minDistFromBall = 400;
var placed = false;
for (var tries = 0; tries < 20 && !placed; tries++) {
var hx = Math.random() * (2048 - 2 * safeMargin) + safeMargin;
var hy = Math.random() * (2732 - 2 * safeMargin) + safeMargin;
var bdx = hx - ball.x;
var bdy = hy - ball.y;
var bdist = Math.sqrt(bdx * bdx + bdy * bdy);
if (bdist > minDistFromBall) {
newHole.x = hx;
newHole.y = hy;
placed = true;
}
}
if (!placed) {
// fallback: just put it somewhere safe
newHole.x = 2048 / 2;
newHole.y = 2732 / 2;
}
game.addChild(newHole);
hole = newHole;
// Reset timer for new hole
startTimer();
}
}
}; ===================================================================
--- original.js
+++ change.js