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
var dx = player.x - tree.x;
var dy = player.y - tree.y;
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;
}
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
@@ -1,6 +1,305 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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
+ var dx = player.x - tree.x;
+ var dy = player.y - tree.y;
+ 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;
+ }
+ 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();
\ No newline at end of file