/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Draggable base class for all sandbox elements
var Draggable = Container.expand(function () {
var self = Container.call(this);
self.isDragging = false;
// Called when user presses down on the element
self.down = function (x, y, obj) {
self.isDragging = true;
self.dragOffsetX = x - self.x;
self.dragOffsetY = y - self.y;
dragNode = self;
};
// Called when user releases the element
self.up = function (x, y, obj) {
self.isDragging = false;
dragNode = null;
};
return self;
});
// Player class
var Player = Draggable.expand(function () {
var self = Draggable.call(this);
var gfx = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'player';
return self;
});
// Obstacle class
var Obstacle = Draggable.expand(function () {
var self = Draggable.call(this);
var gfx = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'obstacle';
return self;
});
// Goal class
var Goal = Draggable.expand(function () {
var self = Draggable.call(this);
var gfx = self.attachAsset('goal', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'goal';
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xf0f0f0
});
/****
* Game Code
****/
// Basic shapes for sandbox elements
// --- Global state ---
var sandboxElements = []; // All placed elements
var dragNode = null; // Currently dragged element
var mode = 'edit'; // 'edit' or 'play'
var playerStart = {
x: 400,
y: 1366
}; // Default player start
var goalStart = {
x: 1648,
y: 1366
}; // Default goal start
// --- UI ---
// Title
var titleTxt = new Text2('Me Game Creat', {
size: 90,
fill: 0x222222
});
titleTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(titleTxt);
// Mode toggle button
var modeBtn = new Text2('Play', {
size: 70,
fill: 0xFFFFFF
});
modeBtn.anchor.set(0.5, 0.5);
modeBtn.x = 0;
modeBtn.y = 0;
modeBtn.bg = 0x3a8ee6;
modeBtn.padding = 30;
LK.gui.topRight.addChild(modeBtn);
// Add element buttons
var addPlayerBtn = new Text2('Add Player', {
size: 60,
fill: 0x3A8EE6
});
addPlayerBtn.anchor.set(0.5, 0.5);
addPlayerBtn.y = 0;
LK.gui.left.addChild(addPlayerBtn);
var addGoalBtn = new Text2('Add Goal', {
size: 60,
fill: 0x4AD66D
});
addGoalBtn.anchor.set(0.5, 0.5);
addGoalBtn.y = 120;
LK.gui.left.addChild(addGoalBtn);
var addObstacleBtn = new Text2('Add Obstacle', {
size: 60,
fill: 0xE64A3A
});
addObstacleBtn.anchor.set(0.5, 0.5);
addObstacleBtn.y = 240;
LK.gui.left.addChild(addObstacleBtn);
// Info text
var infoTxt = new Text2('Drag elements. Tap Play to test!', {
size: 60,
fill: 0x444444
});
infoTxt.anchor.set(0.5, 0);
infoTxt.y = 0;
LK.gui.bottom.addChild(infoTxt);
// --- Sandbox background grid ---
var bgGrid = LK.getAsset('bgGrid', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(bgGrid);
// --- Add initial elements ---
function addInitialElements() {
// Add player
var player = new Player();
player.x = playerStart.x;
player.y = playerStart.y;
sandboxElements.push(player);
game.addChild(player);
// Add goal
var goal = new Goal();
goal.x = goalStart.x;
goal.y = goalStart.y;
sandboxElements.push(goal);
game.addChild(goal);
}
addInitialElements();
// --- Add element handlers ---
addPlayerBtn.down = function (x, y, obj) {
if (mode !== 'edit') return;
var player = new Player();
player.x = 400 + Math.random() * 200;
player.y = 400 + Math.random() * 400;
sandboxElements.push(player);
game.addChild(player);
};
addGoalBtn.down = function (x, y, obj) {
if (mode !== 'edit') return;
var goal = new Goal();
goal.x = 1648 - Math.random() * 200;
goal.y = 400 + Math.random() * 400;
sandboxElements.push(goal);
game.addChild(goal);
};
addObstacleBtn.down = function (x, y, obj) {
if (mode !== 'edit') return;
var obs = new Obstacle();
obs.x = 1024 + (Math.random() - 0.5) * 600;
obs.y = 1366 + (Math.random() - 0.5) * 800;
sandboxElements.push(obs);
game.addChild(obs);
};
// --- Mode toggle handler ---
modeBtn.down = function (x, y, obj) {
if (mode === 'edit') {
// Switch to play mode
if (!getPlayer() || !getGoal()) {
infoTxt.setText('Need at least 1 Player and 1 Goal!');
return;
}
mode = 'play';
modeBtn.setText('Edit');
infoTxt.setText('Drag to move player. Reach the goal!');
setEditMode(false);
startPlayMode();
} else {
// Switch to edit mode
mode = 'edit';
modeBtn.setText('Play');
infoTxt.setText('Drag elements. Tap Play to test!');
setEditMode(true);
stopPlayMode();
}
};
// --- Helper functions ---
function getPlayer() {
for (var i = 0; i < sandboxElements.length; ++i) {
if (sandboxElements[i].type === 'player') return sandboxElements[i];
}
return null;
}
function getGoal() {
for (var i = 0; i < sandboxElements.length; ++i) {
if (sandboxElements[i].type === 'goal') return sandboxElements[i];
}
return null;
}
function getObstacles() {
var arr = [];
for (var i = 0; i < sandboxElements.length; ++i) {
if (sandboxElements[i].type === 'obstacle') arr.push(sandboxElements[i]);
}
return arr;
}
// Enable/disable dragging for all elements
function setEditMode(enabled) {
for (var i = 0; i < sandboxElements.length; ++i) {
sandboxElements[i].interactive = enabled;
}
}
// Remove all elements except player and goal
function removeObstacles() {
for (var i = sandboxElements.length - 1; i >= 0; --i) {
if (sandboxElements[i].type === 'obstacle') {
sandboxElements[i].destroy();
sandboxElements.splice(i, 1);
}
}
}
// --- Play mode logic ---
var playState = {
moving: false,
vx: 0,
vy: 0,
speed: 18,
lastX: 0,
lastY: 0,
lastIntersectGoal: false,
lastIntersectObs: []
};
function startPlayMode() {
// Reset player to start
var player = getPlayer();
var goal = getGoal();
if (!player || !goal) return;
player.x = playerStart.x;
player.y = playerStart.y;
playState.vx = 0;
playState.vy = 0;
playState.moving = false;
playState.lastIntersectGoal = false;
playState.lastIntersectObs = [];
// Obstacles cannot be moved
setEditMode(false);
// Player is draggable in play mode
player.interactive = true;
}
function stopPlayMode() {
// Player and all elements are draggable again
setEditMode(true);
}
// --- Dragging logic (edit mode) ---
function handleEditMove(x, y, obj) {
if (dragNode && dragNode.isDragging) {
dragNode.x = x - dragNode.dragOffsetX;
dragNode.y = y - dragNode.dragOffsetY;
}
}
// --- Play mode movement (drag to move player) ---
function handlePlayMove(x, y, obj) {
var player = getPlayer();
if (!player) return;
// Only allow dragging player
if (dragNode === player) {
player.x = x;
player.y = y;
}
}
// --- Game move handler ---
game.move = function (x, y, obj) {
if (mode === 'edit') {
handleEditMove(x, y, obj);
} else if (mode === 'play') {
handlePlayMove(x, y, obj);
}
};
// --- Game down handler ---
game.down = function (x, y, obj) {
if (mode === 'edit') {
// Find topmost element under pointer
for (var i = sandboxElements.length - 1; i >= 0; --i) {
var el = sandboxElements[i];
var dx = x - el.x;
var dy = y - el.y;
var w = el.width || 180;
var h = el.height || 180;
if (Math.abs(dx) < w / 2 && Math.abs(dy) < h / 2) {
dragNode = el;
el.isDragging = true;
el.dragOffsetX = x - el.x;
el.dragOffsetY = y - el.y;
break;
}
}
} else if (mode === 'play') {
// Only allow dragging player
var player = getPlayer();
if (player) {
var dx = x - player.x;
var dy = y - player.y;
var w = player.width || 180;
var h = player.height || 180;
if (Math.abs(dx) < w / 2 && Math.abs(dy) < h / 2) {
dragNode = player;
player.isDragging = true;
player.dragOffsetX = x - player.x;
player.dragOffsetY = y - player.y;
}
}
}
};
// --- Game up handler ---
game.up = function (x, y, obj) {
if (dragNode) {
dragNode.isDragging = false;
dragNode = null;
}
};
// --- Game update loop ---
game.update = function () {
if (mode === 'play') {
var player = getPlayer();
var goal = getGoal();
var obstacles = getObstacles();
// Check for win
var intersectGoal = player && goal && player.intersects(goal);
if (!playState.lastIntersectGoal && intersectGoal) {
// Win!
LK.effects.flashScreen(0x4ad66d, 800);
LK.showYouWin();
return;
}
playState.lastIntersectGoal = intersectGoal;
// Check for collision with obstacles
for (var i = 0; i < obstacles.length; ++i) {
var obs = obstacles[i];
var intersectObs = player && obs && player.intersects(obs);
if (!playState.lastIntersectObs[i]) {
if (intersectObs) {
// Hit obstacle: flash red, reset player
LK.effects.flashObject(player, 0xe64a3a, 600);
player.x = playerStart.x;
player.y = playerStart.y;
}
}
playState.lastIntersectObs[i] = intersectObs;
}
}
};
// --- Utility: Remove all elements (for future expansion) ---
function clearSandbox() {
for (var i = sandboxElements.length - 1; i >= 0; --i) {
sandboxElements[i].destroy();
sandboxElements.splice(i, 1);
}
}
// --- Prevent elements in top-left 100x100 px ---
bgGrid.x = 0;
bgGrid.y = 0;
// --- End of file --- ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,376 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Draggable base class for all sandbox elements
+var Draggable = Container.expand(function () {
+ var self = Container.call(this);
+ self.isDragging = false;
+ // Called when user presses down on the element
+ self.down = function (x, y, obj) {
+ self.isDragging = true;
+ self.dragOffsetX = x - self.x;
+ self.dragOffsetY = y - self.y;
+ dragNode = self;
+ };
+ // Called when user releases the element
+ self.up = function (x, y, obj) {
+ self.isDragging = false;
+ dragNode = null;
+ };
+ return self;
+});
+// Player class
+var Player = Draggable.expand(function () {
+ var self = Draggable.call(this);
+ var gfx = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'player';
+ return self;
+});
+// Obstacle class
+var Obstacle = Draggable.expand(function () {
+ var self = Draggable.call(this);
+ var gfx = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'obstacle';
+ return self;
+});
+// Goal class
+var Goal = Draggable.expand(function () {
+ var self = Draggable.call(this);
+ var gfx = self.attachAsset('goal', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'goal';
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0xf0f0f0
+});
+
+/****
+* Game Code
+****/
+// Basic shapes for sandbox elements
+// --- Global state ---
+var sandboxElements = []; // All placed elements
+var dragNode = null; // Currently dragged element
+var mode = 'edit'; // 'edit' or 'play'
+var playerStart = {
+ x: 400,
+ y: 1366
+}; // Default player start
+var goalStart = {
+ x: 1648,
+ y: 1366
+}; // Default goal start
+// --- UI ---
+// Title
+var titleTxt = new Text2('Me Game Creat', {
+ size: 90,
+ fill: 0x222222
+});
+titleTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(titleTxt);
+// Mode toggle button
+var modeBtn = new Text2('Play', {
+ size: 70,
+ fill: 0xFFFFFF
+});
+modeBtn.anchor.set(0.5, 0.5);
+modeBtn.x = 0;
+modeBtn.y = 0;
+modeBtn.bg = 0x3a8ee6;
+modeBtn.padding = 30;
+LK.gui.topRight.addChild(modeBtn);
+// Add element buttons
+var addPlayerBtn = new Text2('Add Player', {
+ size: 60,
+ fill: 0x3A8EE6
+});
+addPlayerBtn.anchor.set(0.5, 0.5);
+addPlayerBtn.y = 0;
+LK.gui.left.addChild(addPlayerBtn);
+var addGoalBtn = new Text2('Add Goal', {
+ size: 60,
+ fill: 0x4AD66D
+});
+addGoalBtn.anchor.set(0.5, 0.5);
+addGoalBtn.y = 120;
+LK.gui.left.addChild(addGoalBtn);
+var addObstacleBtn = new Text2('Add Obstacle', {
+ size: 60,
+ fill: 0xE64A3A
+});
+addObstacleBtn.anchor.set(0.5, 0.5);
+addObstacleBtn.y = 240;
+LK.gui.left.addChild(addObstacleBtn);
+// Info text
+var infoTxt = new Text2('Drag elements. Tap Play to test!', {
+ size: 60,
+ fill: 0x444444
+});
+infoTxt.anchor.set(0.5, 0);
+infoTxt.y = 0;
+LK.gui.bottom.addChild(infoTxt);
+// --- Sandbox background grid ---
+var bgGrid = LK.getAsset('bgGrid', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 0
+});
+game.addChild(bgGrid);
+// --- Add initial elements ---
+function addInitialElements() {
+ // Add player
+ var player = new Player();
+ player.x = playerStart.x;
+ player.y = playerStart.y;
+ sandboxElements.push(player);
+ game.addChild(player);
+ // Add goal
+ var goal = new Goal();
+ goal.x = goalStart.x;
+ goal.y = goalStart.y;
+ sandboxElements.push(goal);
+ game.addChild(goal);
+}
+addInitialElements();
+// --- Add element handlers ---
+addPlayerBtn.down = function (x, y, obj) {
+ if (mode !== 'edit') return;
+ var player = new Player();
+ player.x = 400 + Math.random() * 200;
+ player.y = 400 + Math.random() * 400;
+ sandboxElements.push(player);
+ game.addChild(player);
+};
+addGoalBtn.down = function (x, y, obj) {
+ if (mode !== 'edit') return;
+ var goal = new Goal();
+ goal.x = 1648 - Math.random() * 200;
+ goal.y = 400 + Math.random() * 400;
+ sandboxElements.push(goal);
+ game.addChild(goal);
+};
+addObstacleBtn.down = function (x, y, obj) {
+ if (mode !== 'edit') return;
+ var obs = new Obstacle();
+ obs.x = 1024 + (Math.random() - 0.5) * 600;
+ obs.y = 1366 + (Math.random() - 0.5) * 800;
+ sandboxElements.push(obs);
+ game.addChild(obs);
+};
+// --- Mode toggle handler ---
+modeBtn.down = function (x, y, obj) {
+ if (mode === 'edit') {
+ // Switch to play mode
+ if (!getPlayer() || !getGoal()) {
+ infoTxt.setText('Need at least 1 Player and 1 Goal!');
+ return;
+ }
+ mode = 'play';
+ modeBtn.setText('Edit');
+ infoTxt.setText('Drag to move player. Reach the goal!');
+ setEditMode(false);
+ startPlayMode();
+ } else {
+ // Switch to edit mode
+ mode = 'edit';
+ modeBtn.setText('Play');
+ infoTxt.setText('Drag elements. Tap Play to test!');
+ setEditMode(true);
+ stopPlayMode();
+ }
+};
+// --- Helper functions ---
+function getPlayer() {
+ for (var i = 0; i < sandboxElements.length; ++i) {
+ if (sandboxElements[i].type === 'player') return sandboxElements[i];
+ }
+ return null;
+}
+function getGoal() {
+ for (var i = 0; i < sandboxElements.length; ++i) {
+ if (sandboxElements[i].type === 'goal') return sandboxElements[i];
+ }
+ return null;
+}
+function getObstacles() {
+ var arr = [];
+ for (var i = 0; i < sandboxElements.length; ++i) {
+ if (sandboxElements[i].type === 'obstacle') arr.push(sandboxElements[i]);
+ }
+ return arr;
+}
+// Enable/disable dragging for all elements
+function setEditMode(enabled) {
+ for (var i = 0; i < sandboxElements.length; ++i) {
+ sandboxElements[i].interactive = enabled;
+ }
+}
+// Remove all elements except player and goal
+function removeObstacles() {
+ for (var i = sandboxElements.length - 1; i >= 0; --i) {
+ if (sandboxElements[i].type === 'obstacle') {
+ sandboxElements[i].destroy();
+ sandboxElements.splice(i, 1);
+ }
+ }
+}
+// --- Play mode logic ---
+var playState = {
+ moving: false,
+ vx: 0,
+ vy: 0,
+ speed: 18,
+ lastX: 0,
+ lastY: 0,
+ lastIntersectGoal: false,
+ lastIntersectObs: []
+};
+function startPlayMode() {
+ // Reset player to start
+ var player = getPlayer();
+ var goal = getGoal();
+ if (!player || !goal) return;
+ player.x = playerStart.x;
+ player.y = playerStart.y;
+ playState.vx = 0;
+ playState.vy = 0;
+ playState.moving = false;
+ playState.lastIntersectGoal = false;
+ playState.lastIntersectObs = [];
+ // Obstacles cannot be moved
+ setEditMode(false);
+ // Player is draggable in play mode
+ player.interactive = true;
+}
+function stopPlayMode() {
+ // Player and all elements are draggable again
+ setEditMode(true);
+}
+// --- Dragging logic (edit mode) ---
+function handleEditMove(x, y, obj) {
+ if (dragNode && dragNode.isDragging) {
+ dragNode.x = x - dragNode.dragOffsetX;
+ dragNode.y = y - dragNode.dragOffsetY;
+ }
+}
+// --- Play mode movement (drag to move player) ---
+function handlePlayMove(x, y, obj) {
+ var player = getPlayer();
+ if (!player) return;
+ // Only allow dragging player
+ if (dragNode === player) {
+ player.x = x;
+ player.y = y;
+ }
+}
+// --- Game move handler ---
+game.move = function (x, y, obj) {
+ if (mode === 'edit') {
+ handleEditMove(x, y, obj);
+ } else if (mode === 'play') {
+ handlePlayMove(x, y, obj);
+ }
+};
+// --- Game down handler ---
+game.down = function (x, y, obj) {
+ if (mode === 'edit') {
+ // Find topmost element under pointer
+ for (var i = sandboxElements.length - 1; i >= 0; --i) {
+ var el = sandboxElements[i];
+ var dx = x - el.x;
+ var dy = y - el.y;
+ var w = el.width || 180;
+ var h = el.height || 180;
+ if (Math.abs(dx) < w / 2 && Math.abs(dy) < h / 2) {
+ dragNode = el;
+ el.isDragging = true;
+ el.dragOffsetX = x - el.x;
+ el.dragOffsetY = y - el.y;
+ break;
+ }
+ }
+ } else if (mode === 'play') {
+ // Only allow dragging player
+ var player = getPlayer();
+ if (player) {
+ var dx = x - player.x;
+ var dy = y - player.y;
+ var w = player.width || 180;
+ var h = player.height || 180;
+ if (Math.abs(dx) < w / 2 && Math.abs(dy) < h / 2) {
+ dragNode = player;
+ player.isDragging = true;
+ player.dragOffsetX = x - player.x;
+ player.dragOffsetY = y - player.y;
+ }
+ }
+ }
+};
+// --- Game up handler ---
+game.up = function (x, y, obj) {
+ if (dragNode) {
+ dragNode.isDragging = false;
+ dragNode = null;
+ }
+};
+// --- Game update loop ---
+game.update = function () {
+ if (mode === 'play') {
+ var player = getPlayer();
+ var goal = getGoal();
+ var obstacles = getObstacles();
+ // Check for win
+ var intersectGoal = player && goal && player.intersects(goal);
+ if (!playState.lastIntersectGoal && intersectGoal) {
+ // Win!
+ LK.effects.flashScreen(0x4ad66d, 800);
+ LK.showYouWin();
+ return;
+ }
+ playState.lastIntersectGoal = intersectGoal;
+ // Check for collision with obstacles
+ for (var i = 0; i < obstacles.length; ++i) {
+ var obs = obstacles[i];
+ var intersectObs = player && obs && player.intersects(obs);
+ if (!playState.lastIntersectObs[i]) {
+ if (intersectObs) {
+ // Hit obstacle: flash red, reset player
+ LK.effects.flashObject(player, 0xe64a3a, 600);
+ player.x = playerStart.x;
+ player.y = playerStart.y;
+ }
+ }
+ playState.lastIntersectObs[i] = intersectObs;
+ }
+ }
+};
+// --- Utility: Remove all elements (for future expansion) ---
+function clearSandbox() {
+ for (var i = sandboxElements.length - 1; i >= 0; --i) {
+ sandboxElements[i].destroy();
+ sandboxElements.splice(i, 1);
+ }
+}
+// --- Prevent elements in top-left 100x100 px ---
+bgGrid.x = 0;
+bgGrid.y = 0;
+// --- End of file ---
\ No newline at end of file