User prompt
put the movement keys in the bottom middle of the screen
User prompt
No, I can't see to the right and top of the screen.
User prompt
move the movement keys right and up
User prompt
move the movement keys to the right
User prompt
move the movement keys to the right
User prompt
move the movement keys to the left
User prompt
Space the movement keys a little wider
User prompt
The camera follows the character and centers the map according to the world, the character is born in the middle
User prompt
Let the character go through everything
User prompt
I can't move down and left on the map. Something is blocking me.
User prompt
expand the map up down and left right like an open world
User prompt
I still can't move to the right. The screen should move to the right as I move.
User prompt
There is something preventing me from going to the right. Let the village extend to the right.
User prompt
place the movement keys in the lower left corner
User prompt
put the execution button in the middle of the screen
User prompt
1. I can't enter the right side. An invisible wall is blocking me. Fix me. 2. Move the execution button further to the right and up.
User prompt
1. I can't enter the right side. An invisible wall is blocking me. Fix me. 2. Move the execution button further to the right and up.
User prompt
Open the spaces between the keys a little more and move the execution key next to the arrow keys
User prompt
Open the spaces between the keys and move them up and to the right to make them more pressable
User prompt
To be able to press the keys, spread them out and take a picture of each of them.
User prompt
I can only go right, I also need to go right, left, up and down
User prompt
move the trackpad a little more to the right and up
User prompt
Have 1 movement button
User prompt
Fit trackpad to screen not visible
User prompt
put the trackpad in the lower left corner
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // D-Pad Button class var DPadButton = Container.expand(function () { var self = Container.call(this); self.bg = self.attachAsset('dpadBtn', { anchorX: 0.5, anchorY: 0.5 }); self.bg.alpha = 0.7; self.icon = null; // Will be set by game code return self; }); // Execute Button class var ExecuteButton = Container.expand(function () { var self = Container.call(this); self.bg = self.attachAsset('executeBtn', { anchorX: 0.5, anchorY: 0.5 }); self.bg.alpha = 0.92; self.label = new Text2('EXECUTE', { size: 60, fill: "#fff" }); self.label.anchor.set(0.5, 0.5); self.addChild(self.label); self.visible = false; return self; }); // Plague Doctor (player) class var PlagueDoctor = Container.expand(function () { var self = Container.call(this); var doctorSprite = self.attachAsset('plagueDoctor', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 18; // Movement speed per tick // For collision box, use the asset's width/height self.getBounds = function () { return { x: self.x - doctorSprite.width / 2, y: self.y - doctorSprite.height / 2, width: doctorSprite.width, height: doctorSprite.height }; }; return self; }); // Villager class var Villager = Container.expand(function () { var self = Container.call(this); self.isSick = false; self.isAlive = true; self.init = function (isSick) { self.isSick = isSick; self.isAlive = true; self.removeChildren(); var assetId = isSick ? 'villagerSick' : 'villagerHealthy'; self.sprite = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); }; self.getBounds = function () { return { x: self.x - self.sprite.width / 2, y: self.y - self.sprite.height / 2, width: self.sprite.width, height: self.sprite.height }; }; self.execute = function () { self.isAlive = false; // Animate fade out and shrink tween(self.sprite, { alpha: 0, scaleX: 0.1, scaleY: 0.1 }, { duration: 400, easing: tween.cubicIn, onFinish: function onFinish() { self.visible = false; } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xf2e5bc }); /**** * Game Code ****/ // --- Game constants --- // Plague Doctor (player) // Healthy villager // Sick villager // "Execute" button // D-pad buttons var VILLAGE_WIDTH = 4096; // The map is twice the screen width, scrollable horizontally var VILLAGE_HEIGHT = 2048; // Slightly less than full height for padding var NUM_VILLAGERS = 18; var NUM_SICK = 6; var VILLAGER_MIN_DIST = 220; // Minimum distance between villagers // --- Game state --- var player; var villagers = []; var sickLeft = NUM_SICK; var executeBtn; var dpadBtns = {}; var dpadState = { up: false, down: false, left: false, right: false }; var cameraX = 0; // For horizontal scrolling var draggingDPad = null; var canExecuteVillager = null; // Reference to sick villager in range // --- GUI elements --- var sickLeftTxt = new Text2('Sick left: ' + sickLeft, { size: 90, fill: 0xB16262 }); sickLeftTxt.anchor.set(0.5, 0); // Place at top center, but not in top 100px LK.gui.top.addChild(sickLeftTxt); sickLeftTxt.y = 110; // --- Helper functions --- function clamp(val, min, max) { if (val < min) return min; if (val > max) return max; return val; } // Axis-aligned bounding box collision function aabbIntersect(a, b) { return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y; } // --- Map and villagers setup --- // Center the map vertically, allow horizontal scrolling var mapOffsetY = (game.height - VILLAGE_HEIGHT) / 2; // Place villagers randomly, but not too close to each other or the player start function placeVillagers() { villagers = []; var placed = 0; var sickPlaced = 0; while (placed < NUM_VILLAGERS) { var isSick = sickPlaced < NUM_SICK ? true : false; var villager = new Villager(); villager.init(isSick); // Random position in map bounds, avoid top 100px var x = 200 + Math.random() * (VILLAGE_WIDTH - 400); var y = mapOffsetY + 120 + Math.random() * (VILLAGE_HEIGHT - 240); // Don't place too close to player start (center left) if (Math.abs(x - 300) < 300 && Math.abs(y - game.height / 2) < 300) continue; // Don't place too close to other villagers var tooClose = false; for (var i = 0; i < villagers.length; ++i) { var dx = x - villagers[i].x; var dy = y - villagers[i].y; if (Math.sqrt(dx * dx + dy * dy) < VILLAGER_MIN_DIST) { tooClose = true; break; } } if (tooClose) continue; villager.x = x; villager.y = y; game.addChild(villager); villagers.push(villager); if (isSick) sickPlaced++; placed++; } } // --- Player setup --- player = new PlagueDoctor(); player.x = 300; player.y = game.height / 2; game.addChild(player); // --- Villagers --- placeVillagers(); // --- Execute Button --- executeBtn = new ExecuteButton(); executeBtn.x = game.width / 2; executeBtn.y = game.height - 320; LK.gui.bottom.addChild(executeBtn); // --- D-Pad Controls (fit to screen, always visible in lower left using LK.gui.bottomLeft) --- var dpadSize = Math.floor(LK.gui.bottomLeft.width * 0.18); // Responsive size, ~18% of gui width if (dpadSize < 90) dpadSize = 90; if (dpadSize > 180) dpadSize = 180; // Increase margin for more space between keys var dpadMargin = Math.floor(dpadSize * 0.75); // Increased margin for more spacing // Move the D-pad cluster further up and right for better pressability var dpadCenterX = dpadSize + 220; // Increased from 110px to 220px padding from left var dpadCenterY = LK.gui.bottomLeft.height - dpadSize - 260; // Increased from 110px to 260px padding from bottom function createDPadBtns() { // Up var btnUp = new DPadButton(); btnUp.x = dpadCenterX; btnUp.y = dpadCenterY - dpadMargin; btnUp.icon = new Text2('▲', { size: Math.floor(dpadSize * 0.38), fill: "#222" }); btnUp.icon.anchor.set(0.5, 0.5); btnUp.addChild(btnUp.icon); LK.gui.bottomLeft.addChild(btnUp); dpadBtns['up'] = btnUp; // Down var btnDown = new DPadButton(); btnDown.x = dpadCenterX; btnDown.y = dpadCenterY + dpadMargin; btnDown.icon = new Text2('▼', { size: Math.floor(dpadSize * 0.38), fill: "#222" }); btnDown.icon.anchor.set(0.5, 0.5); btnDown.addChild(btnDown.icon); LK.gui.bottomLeft.addChild(btnDown); dpadBtns['down'] = btnDown; // Left var btnLeft = new DPadButton(); btnLeft.x = dpadCenterX - dpadMargin; btnLeft.y = dpadCenterY; btnLeft.icon = new Text2('◀', { size: Math.floor(dpadSize * 0.38), fill: "#222" }); btnLeft.icon.anchor.set(0.5, 0.5); btnLeft.addChild(btnLeft.icon); LK.gui.bottomLeft.addChild(btnLeft); dpadBtns['left'] = btnLeft; // Right var btnRight = new DPadButton(); btnRight.x = dpadCenterX + dpadMargin; btnRight.y = dpadCenterY; btnRight.icon = new Text2('▶', { size: Math.floor(dpadSize * 0.38), fill: "#222" }); btnRight.icon.anchor.set(0.5, 0.5); btnRight.addChild(btnRight.icon); LK.gui.bottomLeft.addChild(btnRight); dpadBtns['right'] = btnRight; } createDPadBtns(); // --- D-Pad event handling --- function dpadBtnForPos(x, y) { var r = dpadSize / 2; for (var dir in dpadBtns) { var btn = dpadBtns[dir]; var bx = btn.x; var by = btn.y; if ((x - bx) * (x - bx) + (y - by) * (y - by) < r * r) { return dir; } } return null; } // D-Pad touch/mouse down LK.gui.bottomLeft.down = function (x, y, obj) { var dir = dpadBtnForPos(x, y); if (dir) { dpadState[dir] = true; draggingDPad = dir; tween(dpadBtns[dir].bg, { alpha: 1 }, { duration: 80 }); } }; // D-Pad touch/mouse up LK.gui.bottomLeft.up = function (x, y, obj) { if (draggingDPad) { dpadState[draggingDPad] = false; tween(dpadBtns[draggingDPad].bg, { alpha: 0.7 }, { duration: 120 }); draggingDPad = null; } }; // D-Pad move (drag) LK.gui.bottomLeft.move = function (x, y, obj) { if (draggingDPad) { var dir = dpadBtnForPos(x, y); if (dir === draggingDPad) { if (!dpadState[dir]) { dpadState[dir] = true; tween(dpadBtns[dir].bg, { alpha: 1 }, { duration: 80 }); } } else { if (dpadState[draggingDPad]) { dpadState[draggingDPad] = false; tween(dpadBtns[draggingDPad].bg, { alpha: 0.7 }, { duration: 120 }); } } } }; // --- Execute Button event handling --- executeBtn.down = function (x, y, obj) { if (canExecuteVillager && canExecuteVillager.isAlive) { canExecuteVillager.execute(); sickLeft--; sickLeftTxt.setText('Sick left: ' + sickLeft); executeBtn.visible = false; canExecuteVillager = null; // Win condition if (sickLeft === 0) { LK.showYouWin(); } } }; // --- Main game move handler (for dragging player, not used here) --- game.move = function (x, y, obj) { // No drag-to-move, only D-pad }; // --- Main game update loop --- game.update = function () { // --- Player movement --- var dx = 0, dy = 0; if (dpadState.left) dx -= 1; if (dpadState.right) dx += 1; if (dpadState.up) dy -= 1; if (dpadState.down) dy += 1; if (dx !== 0 || dy !== 0) { var len = Math.sqrt(dx * dx + dy * dy); if (len > 0) { dx /= len; dy /= len; } player.x += dx * player.speed; player.y += dy * player.speed; } // Clamp player to map bounds player.x = clamp(player.x, 60, VILLAGE_WIDTH - 60); player.y = clamp(player.y, mapOffsetY + 90, mapOffsetY + VILLAGE_HEIGHT - 90); // --- Camera scrolling (horizontal only) --- var screenCenterX = game.width / 2; cameraX = player.x - screenCenterX; cameraX = clamp(cameraX, 0, VILLAGE_WIDTH - game.width); // Move all game children (player, villagers) relative to cameraX for (var i = 0; i < game.children.length; ++i) { var obj = game.children[i]; obj.visible = true; if (obj === player) { obj.x = player.x - cameraX; obj.y = player.y; } else if (obj instanceof Villager) { obj.x = obj.x0 !== undefined ? obj.x0 - cameraX : obj.x - cameraX; obj.y = obj.y0 !== undefined ? obj.y0 : obj.y; } } // --- Villager proximity check --- canExecuteVillager = null; for (var i = 0; i < villagers.length; ++i) { var villager = villagers[i]; if (!villager.isAlive || !villager.isSick) continue; // Use world coordinates for collision var px = player.x; var py = player.y; var vx = villager.x0 !== undefined ? villager.x0 : villager.x + cameraX; var vy = villager.y0 !== undefined ? villager.y0 : villager.y; var dist = Math.sqrt((px - vx) * (px - vx) + (py - vy) * (py - vy)); if (dist < 140) { canExecuteVillager = villager; break; } } // --- Execute button visibility --- if (canExecuteVillager && canExecuteVillager.isAlive) { executeBtn.visible = true; } else { executeBtn.visible = false; } }; // --- Store original world positions for villagers (for camera) --- for (var i = 0; i < villagers.length; ++i) { villagers[i].x0 = villagers[i].x; villagers[i].y0 = villagers[i].y; } // --- Initial camera position --- cameraX = 0; for (var i = 0; i < game.children.length; ++i) { var obj = game.children[i]; if (obj === player) { obj.x = player.x - cameraX; obj.y = player.y; } else if (obj instanceof Villager) { obj.x = obj.x0 - cameraX; obj.y = obj.y0; } }
===================================================================
--- original.js
+++ change.js
@@ -1,9 +1,8 @@
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
-var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
@@ -104,14 +103,14 @@
/****
* Game Code
****/
-// D-pad buttons
-// "Execute" button
-// Sick villager
-// Healthy villager
-// Plague Doctor (player)
// --- Game constants ---
+// Plague Doctor (player)
+// Healthy villager
+// Sick villager
+// "Execute" button
+// D-pad buttons
var VILLAGE_WIDTH = 4096; // The map is twice the screen width, scrollable horizontally
var VILLAGE_HEIGHT = 2048; // Slightly less than full height for padding
var NUM_VILLAGERS = 18;
var NUM_SICK = 6;
@@ -201,20 +200,18 @@
// --- D-Pad Controls (fit to screen, always visible in lower left using LK.gui.bottomLeft) ---
var dpadSize = Math.floor(LK.gui.bottomLeft.width * 0.18); // Responsive size, ~18% of gui width
if (dpadSize < 90) dpadSize = 90;
if (dpadSize > 180) dpadSize = 180;
-var dpadMargin = Math.floor(dpadSize * 0.35); // Responsive margin
-// Center of D-pad cluster, offset from bottom left corner (never in top 100px or left 100px)
-// Move the button further right and up (increase X, decrease Y)
-var dpadCenterX = dpadSize + 110; // 110px padding from left (was 30)
-var dpadCenterY = LK.gui.bottomLeft.height - dpadSize - 110; // 110px padding from bottom (was 30)
+// Increase margin for more space between keys
+var dpadMargin = Math.floor(dpadSize * 0.75); // Increased margin for more spacing
+// Move the D-pad cluster further up and right for better pressability
+var dpadCenterX = dpadSize + 220; // Increased from 110px to 220px padding from left
+var dpadCenterY = LK.gui.bottomLeft.height - dpadSize - 260; // Increased from 110px to 260px padding from bottom
function createDPadBtns() {
- // Spread out the D-pad buttons for easier pressing and picture taking
- var spread = Math.floor(dpadSize * 1.5); // Increase distance between buttons
// Up
var btnUp = new DPadButton();
btnUp.x = dpadCenterX;
- btnUp.y = dpadCenterY - spread;
+ btnUp.y = dpadCenterY - dpadMargin;
btnUp.icon = new Text2('▲', {
size: Math.floor(dpadSize * 0.38),
fill: "#222"
});
@@ -224,9 +221,9 @@
dpadBtns['up'] = btnUp;
// Down
var btnDown = new DPadButton();
btnDown.x = dpadCenterX;
- btnDown.y = dpadCenterY + spread;
+ btnDown.y = dpadCenterY + dpadMargin;
btnDown.icon = new Text2('▼', {
size: Math.floor(dpadSize * 0.38),
fill: "#222"
});
@@ -235,9 +232,9 @@
LK.gui.bottomLeft.addChild(btnDown);
dpadBtns['down'] = btnDown;
// Left
var btnLeft = new DPadButton();
- btnLeft.x = dpadCenterX - spread;
+ btnLeft.x = dpadCenterX - dpadMargin;
btnLeft.y = dpadCenterY;
btnLeft.icon = new Text2('◀', {
size: Math.floor(dpadSize * 0.38),
fill: "#222"
@@ -247,9 +244,9 @@
LK.gui.bottomLeft.addChild(btnLeft);
dpadBtns['left'] = btnLeft;
// Right
var btnRight = new DPadButton();
- btnRight.x = dpadCenterX + spread;
+ btnRight.x = dpadCenterX + dpadMargin;
btnRight.y = dpadCenterY;
btnRight.icon = new Text2('▶', {
size: Math.floor(dpadSize * 0.38),
fill: "#222"
@@ -260,27 +257,8 @@
dpadBtns['right'] = btnRight;
}
createDPadBtns();
// --- D-Pad event handling ---
-// Take a picture of each D-pad button using facekit when pressed
-function takeButtonPicture(dir) {
- // Only take a picture if the button is visible and pressed
- if (dpadBtns[dir] && dpadBtns[dir].visible) {
- // Use facekit to take a snapshot (returns a promise-like object)
- facekit.takePicture({
- width: 400,
- height: 400,
- crop: true,
- quality: 0.9
- }, function (err, imageData) {
- if (!err) {
- // Optionally, you could display or store the imageData here
- // For now, just log to console for debugging
- console.log("Picture taken for button:", dir, imageData);
- }
- });
- }
-}
function dpadBtnForPos(x, y) {
var r = dpadSize / 2;
for (var dir in dpadBtns) {
var btn = dpadBtns[dir];
@@ -302,10 +280,8 @@
alpha: 1
}, {
duration: 80
});
- // Take a picture of the button pressed
- takeButtonPicture(dir);
}
};
// D-Pad touch/mouse up
LK.gui.bottomLeft.up = function (x, y, obj) {
Kill button. In-Game asset. 2d. High contrast. No shadows
Palugue doctors full body pixel art. In-Game asset. 2d. High contrast. No shadows
Sick viliger pixel art full body
Not sick viliger pixel art
Pixel art death block.
Viliger house pixel art. In-Game asset. 2d. High contrast. No shadows
Background sand image pixel art. 4k In-Game asset. 2d. High contrast. No shadows