Code edit (5 edits merged)
Please save this source code
User prompt
Topu çekme seviyesinin limitini arttır
Code edit (1 edits merged)
Please save this source code
User prompt
Yine öyle oldu yukarıya al şu topu
User prompt
Top duvarların içinde başladı öyle olmasın
User prompt
DUVARLARI NEDEN FONKSİYONLA KURUYORSUN EN BAŞTAN SABİT OLUŞTURSANA
User prompt
KALINLAŞTIR DUVARLARI
User prompt
TAMAM ŞİMDİ ORTAYA KOYDUĞUN DUVARIN UZUNLUĞUN ARTTIRARAK BİR ÇERÇEVE YAP KENARLARA
User prompt
GÖRÜNMEZ DUVARLARI DA KALDIR HALA ÇARPILIYOR TOP ORAYA GELİNCE
User prompt
kenardaki duvarları kaldır
User prompt
Ortadaki duvar gibi yapsana tüm duvarları haritanın ortasındaki duvar olması gerektiği gibi çalışıyor
User prompt
Still the ball gets stuck at the walls doesnt bounce
User prompt
hala bouncleamıyor kenardaki duvarlardan
User prompt
kenardaki duvarlardan sekmiyor
User prompt
Top duvardan sekmiyor sekmesi lazım
User prompt
Deliğin belli bir seviye yanına geldiğinde top otomatik içine girmeli
Code edit (1 edits merged)
Please save this source code
User prompt
Mini Golf Master
Initial prompt
A basic mini golf game, player should click and drag the minigolf ball and make it travel in the map, finally trying to get it in the hole
/****
* 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
****/
// Arrow: yellow rectangle (for aiming indicator)
// Wall: green rectangle
// Hole: black circle
// Ball: white circle
// Game area margins
var margin = 120;
// Course size
var courseWidth = 2048 - margin * 2;
var courseHeight = 2732 - margin * 2;
// Walls array
var walls = [];
// Create walls (simple rectangle course with one obstacle)
function createWalls() {
// Top wall
var wallTop = new GolfWall();
wallTop.x = 2048 / 2;
wallTop.y = margin + 20;
wallTop.width = courseWidth;
wallTop.height = 40;
wallTop.children[0].width = courseWidth;
wallTop.children[0].height = 40;
walls.push(wallTop);
game.addChild(wallTop);
// Bottom wall
var wallBottom = new GolfWall();
wallBottom.x = 2048 / 2;
wallBottom.y = 2732 - margin - 20;
wallBottom.width = courseWidth;
wallBottom.height = 40;
wallBottom.children[0].width = courseWidth;
wallBottom.children[0].height = 40;
walls.push(wallBottom);
game.addChild(wallBottom);
// Left wall
var wallLeft = new GolfWall();
wallLeft.x = margin + 20;
wallLeft.y = 2732 / 2;
wallLeft.width = 40;
wallLeft.height = courseHeight;
wallLeft.children[0].width = 40;
wallLeft.children[0].height = courseHeight;
walls.push(wallLeft);
game.addChild(wallLeft);
// Right wall
var wallRight = new GolfWall();
wallRight.x = 2048 - margin - 20;
wallRight.y = 2732 / 2;
wallRight.width = 40;
wallRight.height = courseHeight;
wallRight.children[0].width = 40;
wallRight.children[0].height = courseHeight;
walls.push(wallRight);
game.addChild(wallRight);
// Obstacle wall (middle)
var wallObs = new GolfWall();
wallObs.x = 2048 / 2;
wallObs.y = 2732 / 2;
wallObs.width = 400;
wallObs.height = 40;
wallObs.children[0].width = 400;
wallObs.children[0].height = 40;
walls.push(wallObs);
game.addChild(wallObs);
}
// Create hole
var hole = new GolfHole();
hole.x = 2048 - margin - 200;
hole.y = margin + 200;
game.addChild(hole);
// Create ball
var ball = new GolfBall();
ball.x = margin + 200;
ball.y = 2732 - margin - 200;
game.addChild(ball);
// Create walls
createWalls();
// Strokes counter
var strokes = 0;
// Score text
var scoreTxt = new Text2('Strokes: 0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Drag/aim state
var isDragging = false;
var dragStartX = 0;
var dragStartY = 0;
// Helper: clamp ball inside course
function clampBallPosition() {
var minX = margin + ball.radius + 40;
var maxX = 2048 - margin - ball.radius - 40;
var minY = margin + ball.radius + 40;
var maxY = 2732 - margin - ball.radius - 40;
if (ball.x < minX) ball.x = minX;
if (ball.x > maxX) ball.x = maxX;
if (ball.y < minY) ball.y = minY;
if (ball.y > maxY) ball.y = maxY;
}
// 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;
}
ball.x += dx / dist * overlap;
ball.y += dy / dist * overlap;
// Reflect velocity
// Determine if horizontal or vertical wall
var isHorizontal = wh > ww;
if (Math.abs(dx) > Math.abs(dy)) {
// Vertical wall: reflect vx
ball.vx = -ball.vx * 0.7;
ball.x += dx / dist * overlap;
} else {
// Horizontal wall: reflect vy
ball.vy = -ball.vy * 0.7;
ball.y += dy / dist * overlap;
}
// Dampen speed
ball.vx *= 0.85;
ball.vy *= 0.85;
}
}
}
// 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!
ball.moving = false;
ball.vx = 0;
ball.vy = 0;
// Animate ball into hole
tween(ball, {
x: hole.x,
y: hole.y,
scaleX: 0.1,
scaleY: 0.1,
alpha: 0
}, {
duration: 600,
easing: tween.easeIn,
onFinish: function onFinish() {
// Show win
LK.showYouWin();
}
});
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 (!ball.moving) {
checkHole();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,378 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x6abf4b // green grass
+});
+
+/****
+* Game Code
+****/
+// Arrow: yellow rectangle (for aiming indicator)
+// Wall: green rectangle
+// Hole: black circle
+// Ball: white circle
+// Game area margins
+var margin = 120;
+// Course size
+var courseWidth = 2048 - margin * 2;
+var courseHeight = 2732 - margin * 2;
+// Walls array
+var walls = [];
+// Create walls (simple rectangle course with one obstacle)
+function createWalls() {
+ // Top wall
+ var wallTop = new GolfWall();
+ wallTop.x = 2048 / 2;
+ wallTop.y = margin + 20;
+ wallTop.width = courseWidth;
+ wallTop.height = 40;
+ wallTop.children[0].width = courseWidth;
+ wallTop.children[0].height = 40;
+ walls.push(wallTop);
+ game.addChild(wallTop);
+ // Bottom wall
+ var wallBottom = new GolfWall();
+ wallBottom.x = 2048 / 2;
+ wallBottom.y = 2732 - margin - 20;
+ wallBottom.width = courseWidth;
+ wallBottom.height = 40;
+ wallBottom.children[0].width = courseWidth;
+ wallBottom.children[0].height = 40;
+ walls.push(wallBottom);
+ game.addChild(wallBottom);
+ // Left wall
+ var wallLeft = new GolfWall();
+ wallLeft.x = margin + 20;
+ wallLeft.y = 2732 / 2;
+ wallLeft.width = 40;
+ wallLeft.height = courseHeight;
+ wallLeft.children[0].width = 40;
+ wallLeft.children[0].height = courseHeight;
+ walls.push(wallLeft);
+ game.addChild(wallLeft);
+ // Right wall
+ var wallRight = new GolfWall();
+ wallRight.x = 2048 - margin - 20;
+ wallRight.y = 2732 / 2;
+ wallRight.width = 40;
+ wallRight.height = courseHeight;
+ wallRight.children[0].width = 40;
+ wallRight.children[0].height = courseHeight;
+ walls.push(wallRight);
+ game.addChild(wallRight);
+ // Obstacle wall (middle)
+ var wallObs = new GolfWall();
+ wallObs.x = 2048 / 2;
+ wallObs.y = 2732 / 2;
+ wallObs.width = 400;
+ wallObs.height = 40;
+ wallObs.children[0].width = 400;
+ wallObs.children[0].height = 40;
+ walls.push(wallObs);
+ game.addChild(wallObs);
+}
+// Create hole
+var hole = new GolfHole();
+hole.x = 2048 - margin - 200;
+hole.y = margin + 200;
+game.addChild(hole);
+// Create ball
+var ball = new GolfBall();
+ball.x = margin + 200;
+ball.y = 2732 - margin - 200;
+game.addChild(ball);
+// Create walls
+createWalls();
+// Strokes counter
+var strokes = 0;
+// Score text
+var scoreTxt = new Text2('Strokes: 0', {
+ size: 100,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Drag/aim state
+var isDragging = false;
+var dragStartX = 0;
+var dragStartY = 0;
+// Helper: clamp ball inside course
+function clampBallPosition() {
+ var minX = margin + ball.radius + 40;
+ var maxX = 2048 - margin - ball.radius - 40;
+ var minY = margin + ball.radius + 40;
+ var maxY = 2732 - margin - ball.radius - 40;
+ if (ball.x < minX) ball.x = minX;
+ if (ball.x > maxX) ball.x = maxX;
+ if (ball.y < minY) ball.y = minY;
+ if (ball.y > maxY) ball.y = maxY;
+}
+// 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;
+ }
+ ball.x += dx / dist * overlap;
+ ball.y += dy / dist * overlap;
+ // Reflect velocity
+ // Determine if horizontal or vertical wall
+ var isHorizontal = wh > ww;
+ if (Math.abs(dx) > Math.abs(dy)) {
+ // Vertical wall: reflect vx
+ ball.vx = -ball.vx * 0.7;
+ ball.x += dx / dist * overlap;
+ } else {
+ // Horizontal wall: reflect vy
+ ball.vy = -ball.vy * 0.7;
+ ball.y += dy / dist * overlap;
+ }
+ // Dampen speed
+ ball.vx *= 0.85;
+ ball.vy *= 0.85;
+ }
+ }
+}
+// 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!
+ ball.moving = false;
+ ball.vx = 0;
+ ball.vy = 0;
+ // Animate ball into hole
+ tween(ball, {
+ x: hole.x,
+ y: hole.y,
+ scaleX: 0.1,
+ scaleY: 0.1,
+ alpha: 0
+ }, {
+ duration: 600,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ // Show win
+ LK.showYouWin();
+ }
+ });
+ 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 (!ball.moving) {
+ checkHole();
+ }
+};
\ No newline at end of file