User prompt
add a button that opens the inventory and add a button that opens a new map
User prompt
fix the bug where if the player touches the tree he would go inside it
Code edit (1 edits merged)
Please save this source code
User prompt
Forest Explorer
Initial prompt
make me a 2D explorer game that takes place in the forest
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Berry = Container.expand(function () { var self = Container.call(this); var berryGraphics = self.attachAsset('berry', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; return self; }); var Creature = Container.expand(function () { var self = Container.call(this); var creatureGraphics = self.attachAsset('creature', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.direction = Math.random() * Math.PI * 2; self.changeDirectionTimer = 0; self.update = function () { self.changeDirectionTimer++; if (self.changeDirectionTimer > 120) { self.direction = Math.random() * Math.PI * 2; self.changeDirectionTimer = 0; } self.x += Math.cos(self.direction) * self.speed; self.y += Math.sin(self.direction) * self.speed; // Keep creatures in bounds if (self.x < 50 || self.x > 1998) { self.direction = Math.PI - self.direction; } if (self.y < 50 || self.y > 2682) { self.direction = -self.direction; } }; return self; }); var Crystal = Container.expand(function () { var self = Container.call(this); var crystalGraphics = self.attachAsset('crystal', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.glowDirection = 1; self.update = function () { if (!self.collected) { crystalGraphics.alpha += 0.02 * self.glowDirection; if (crystalGraphics.alpha >= 1) { self.glowDirection = -1; } else if (crystalGraphics.alpha <= 0.3) { self.glowDirection = 1; } } }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.targetX = null; self.targetY = null; self.isMoving = false; self.moveTo = function (x, y) { self.targetX = x; self.targetY = y; self.isMoving = true; }; self.update = function () { if (self.isMoving && self.targetX !== null && self.targetY !== null) { var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.speed) { self.x = self.targetX; self.y = self.targetY; self.isMoving = false; } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var Thorn = Container.expand(function () { var self = Container.call(this); var thornGraphics = self.attachAsset('thorn', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var Tree = Container.expand(function () { var self = Container.call(this); var treeGraphics = self.attachAsset('tree', { anchorX: 0.5, anchorY: 1.0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2d5016 }); /**** * Game Code ****/ // Game variables var player; var crystals = []; var berries = []; var trees = []; var thorns = []; var creatures = []; var areasDiscovered = 0; var itemsCollected = 0; // UI Elements var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); var itemsTxt = new Text2('Items: 0', { size: 60, fill: 0xFFFFFF }); itemsTxt.anchor.set(0, 0); itemsTxt.y = 100; LK.gui.topRight.addChild(itemsTxt); // Create ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0, anchorY: 0, x: 0, y: 0 })); // Create player player = game.addChild(new Player()); player.x = 1024; player.y = 1366; // Generate forest elements function generateForestElements() { // Create trees for (var i = 0; i < 15; i++) { var tree = new Tree(); tree.x = Math.random() * 1900 + 100; tree.y = Math.random() * 2500 + 200; trees.push(tree); game.addChild(tree); } // Create crystals for (var i = 0; i < 8; i++) { var crystal = new Crystal(); crystal.x = Math.random() * 1800 + 200; crystal.y = Math.random() * 2400 + 200; crystals.push(crystal); game.addChild(crystal); } // Create berries for (var i = 0; i < 12; i++) { var berry = new Berry(); berry.x = Math.random() * 1800 + 200; berry.y = Math.random() * 2400 + 200; berries.push(berry); game.addChild(berry); } // Create thorns for (var i = 0; i < 6; i++) { var thorn = new Thorn(); thorn.x = Math.random() * 1800 + 200; thorn.y = Math.random() * 2400 + 200; thorns.push(thorn); game.addChild(thorn); } // Create creatures for (var i = 0; i < 4; i++) { var creature = new Creature(); creature.x = Math.random() * 1600 + 300; creature.y = Math.random() * 2200 + 300; creatures.push(creature); game.addChild(creature); } } generateForestElements(); // Touch controls game.down = function (x, y, obj) { player.moveTo(x, y); }; // Update score display function updateScore() { scoreTxt.setText('Score: ' + LK.getScore()); itemsTxt.setText('Items: ' + itemsCollected); } // Check collisions and interactions game.update = function () { // Check crystal collection for (var i = crystals.length - 1; i >= 0; i--) { var crystal = crystals[i]; if (!crystal.collected && player.intersects(crystal)) { crystal.collected = true; crystal.alpha = 0; itemsCollected++; LK.setScore(LK.getScore() + 10); updateScore(); LK.getSound('collect').play(); crystals.splice(i, 1); crystal.destroy(); } } // Check berry collection for (var i = berries.length - 1; i >= 0; i--) { var berry = berries[i]; if (!berry.collected && player.intersects(berry)) { berry.collected = true; berry.alpha = 0; itemsCollected++; LK.setScore(LK.getScore() + 5); updateScore(); LK.getSound('collect').play(); berries.splice(i, 1); berry.destroy(); } } // Check thorn collisions for (var i = 0; i < thorns.length; i++) { var thorn = thorns[i]; if (player.intersects(thorn)) { // Push player away from thorn var dx = player.x - thorn.x; var dy = player.y - thorn.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { player.x = thorn.x + dx / distance * 60; player.y = thorn.y + dy / distance * 60; } player.isMoving = false; LK.effects.flashObject(player, 0xff0000, 500); LK.getSound('danger').play(); } } // Check creature encounters for (var i = 0; i < creatures.length; i++) { var creature = creatures[i]; if (player.intersects(creature)) { // Push player away from creature var dx = player.x - creature.x; var dy = player.y - creature.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { player.x = creature.x + dx / distance * 70; player.y = creature.y + dy / distance * 70; } player.isMoving = false; LK.effects.flashObject(player, 0x8b4513, 500); LK.setScore(Math.max(0, LK.getScore() - 2)); updateScore(); LK.getSound('danger').play(); } } // Check tree collisions (blocking) for (var i = 0; i < trees.length; i++) { var tree = trees[i]; if (player.intersects(tree)) { // Push player away from tree (account for tree anchor being at bottom center) var dx = player.x - tree.x; var dy = player.y - (tree.y - tree.height / 2); // Adjust for tree anchor point var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { // Increase push distance to ensure player stays outside tree bounds player.x = tree.x + dx / distance * (tree.width / 2 + 35); player.y = tree.y - tree.height / 2 + dy / distance * (tree.height / 2 + 35); } player.isMoving = false; } } // Keep player in bounds if (player.x < 30) player.x = 30; if (player.x > 2018) player.x = 2018; if (player.y < 30) player.y = 30; if (player.y > 2702) player.y = 2702; // Check win condition if (itemsCollected >= 15) { LK.showYouWin(); } }; // Play ambient forest music LK.playMusic('forestAmbient'); // Initialize score display updateScore();
===================================================================
--- original.js
+++ change.js
@@ -277,15 +277,16 @@
// Check tree collisions (blocking)
for (var i = 0; i < trees.length; i++) {
var tree = trees[i];
if (player.intersects(tree)) {
- // Push player away from tree
+ // Push player away from tree (account for tree anchor being at bottom center)
var dx = player.x - tree.x;
- var dy = player.y - tree.y;
+ var dy = player.y - (tree.y - tree.height / 2); // Adjust for tree anchor point
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
- player.x = tree.x + dx / distance * 50;
- player.y = tree.y + dy / distance * 80;
+ // Increase push distance to ensure player stays outside tree bounds
+ player.x = tree.x + dx / distance * (tree.width / 2 + 35);
+ player.y = tree.y - tree.height / 2 + dy / distance * (tree.height / 2 + 35);
}
player.isMoving = false;
}
}