/**** * Classes ****/ var Instructions = Container.expand(function () { var self = Container.call(this); var instructionsText = new Text2('Instructions: Use your Left Click on mouse to move the hero.\n Right Click to shoot bullets.\n Kill all the monsters to advance to the next level. \n Good Luck!', { size: 30, fill: '#ffffff', align: 'center' }); self.addChild(instructionsText); instructionsText.x = 0 - instructionsText.width / 2; instructionsText.y = 2 - instructionsText.height / 2; }); // No assets are defined as this is a blank game var Hero = Container.expand(function () { var self = Container.call(this); self.attachAsset('hero', { anchorX: 0.5, anchorY: 0.5 }); self.targetPosition = { x: self.x, y: self.y }; self.speed = 5; self.direction = { x: 0, y: 0 }; self.update = function () { // Calculate the angle in radians and rotate the hero var angle = Math.atan2(self.direction.y, self.direction.x); self.rotation = angle; }; self.checkCollision = function (trees) { return false; }; }); var Tree = Container.expand(function () { var self = Container.call(this); self.attachAsset('tree', { anchorX: 0.5, anchorY: 0.5 }); }); var Monster = Container.expand(function () { var self = Container.call(this); self.attachAsset('monster', { anchorX: 0.5, anchorY: 0.5 }); self.isAlive = true; self.speed = 1; self.chaseHero = function (hero) { if (!self.isAlive || !hero) { return; } var dx = hero.x - self.x; var dy = hero.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 0) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } if (self.intersects(hero)) { if (LK.getScore() < 10) { LK.showGameOver({ text: 'You Suck', color: '#FFFFFF' }); } else { LK.showGameOver(); } } }; self.destroyedByBullet = function () { self.isAlive = false; LK.setScore(LK.getScore() + 1); scoreTxt.setText('# of Monsters Killed: ' + LK.getScore().toString()); bulletCount = Math.max(bulletCount + 1, 1); bulletCountTxt.setText('Bullets: ' + bulletCount); self.destroy(); }; }); var Bullet = Container.expand(function () { var self = Container.call(this); self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.direction = { x: 0, y: 0 }; self.move = function (trees) { if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) { self.destroy(); return true; } self.x += self.direction.x * self.speed; self.y += self.direction.y * self.speed; for (var i = 0; i < trees.length; i++) { if (self.intersects(trees[i])) { self.destroy(); return true; } } for (var j = 0; j < monsters.length; j++) { if (self.intersects(monsters[j]) && monsters[j].isAlive) { monsters[j].destroyedByBullet(); self.destroy(); return true; } } return false; }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 // Initialize game with black background }); /**** * Game Code ****/ var instructions = game.addChild(new Instructions()); instructions.x = 2048 / 2; instructions.y = 2732 / 3; var hero = game.addChild(new Hero()); hero.x = 2048 / 2; hero.y = 2732 / 2; // Create a text box to display hero's speed and direction // The heroInfo variable was not defined, so we remove the lines that reference it. var dragNode = null; var trees = []; function handleMove(obj) { var event = obj.event; var pos = event.getLocalPosition(game); if (dragNode) { var oldX = dragNode.x; var oldY = dragNode.y; if (dragNode === hero) { var targetX = pos.x; var targetY = pos.y; var distance = Math.sqrt(Math.pow(targetX - hero.x, 2) + Math.pow(targetY - hero.y, 2)); hero.direction.x = (targetX - hero.x) / distance; hero.direction.y = (targetY - hero.y) / distance; var nextX = hero.x + hero.direction.x * hero.speed; var nextY = hero.y + hero.direction.y * hero.speed; if (!hero.checkCollision(trees)) { hero.x = nextX; hero.y = nextY; } else { hero.direction.x = 0; hero.direction.y = 0; } } } } game.on('move', handleMove); game.on('down', function (obj) { if (instructions) { instructions.destroy(); instructions = null; } var event = obj.event; var pos = event.getLocalPosition(game); hero.targetPosition = { x: pos.x, y: pos.y }; hero.direction.x = hero.targetPosition.x - hero.x; hero.direction.y = hero.targetPosition.y - hero.y; var distance = Math.sqrt(hero.direction.x * hero.direction.x + hero.direction.y * hero.direction.y); hero.direction.x /= distance; hero.direction.y /= distance; }); // Add touch controls for mobile devices LK.on('touchstart', function (obj) { var event = obj.event; var pos = event.getLocalPosition(game); hero.targetPosition = { x: pos.x, y: pos.y }; hero.direction.x = hero.targetPosition.x - hero.x; hero.direction.y = hero.targetPosition.y - hero.y; var distance = Math.sqrt(hero.direction.x * hero.direction.x + hero.direction.y * hero.direction.y); hero.direction.x /= distance; hero.direction.y /= distance; }); // Update the text box every game tick LK.on('tick', function () { if (hero.targetPosition) { var distanceToTarget = hero.targetPosition ? Math.sqrt(Math.pow(hero.targetPosition.x - hero.x, 2) + Math.pow(hero.targetPosition.y - hero.y, 2)) : 0; } if (distanceToTarget > hero.speed) { var nextX = hero.x + hero.direction.x * hero.speed; var nextY = hero.y + hero.direction.y * hero.speed; if (!hero.checkCollision(trees)) { hero.x = nextX; hero.y = nextY; } } else { hero.x = hero.targetPosition.x; hero.y = hero.targetPosition.y; hero.direction.x = 0; hero.direction.y = 0; } levelResetTxt.setText('Level Number: ' + levelResetCount.toString()); }); game.on('up', function (obj) { dragNode = null; }); var bullets = []; game.on('rightdown', function (obj) { var event = obj.event; var pos = event.getLocalPosition(game); if (bulletCount > 0) { var bullet = game.addChild(new Bullet()); bullet.x = hero.x; bullet.y = hero.y; var targetX = pos.x; var targetY = pos.y; var distance = Math.sqrt(Math.pow(targetX - hero.x, 2) + Math.pow(targetY - hero.y, 2)); bullet.direction = { x: (targetX - hero.x) / distance, y: (targetY - hero.y) / distance }; bullet.speed = 10; bullets.push(bullet); bulletCount--; bulletCountTxt.setText('Bullets: ' + bulletCount); } }); LK.on('tick', function () { for (var i = bullets.length - 1; i >= 0; i--) { if (bullets[i].move(trees)) { bullets.splice(i, 1); } } var allMonstersKilled = monsters.every(function (monster) { return !monster.isAlive; }); if (allMonstersKilled) { resetLevel(); } else { for (var i = 0; i < monsters.length; i++) { monsters[i].chaseHero(hero); } } }); // Add fewer trees for (var i = 0; i < 5; i++) { var tree = game.addChild(new Tree()); tree.x = Math.random() * 2048; tree.y = Math.random() * 2732; trees.push(tree); } var monsters = []; for (var i = 0; i < 5; i++) { var monster = game.addChild(new Monster()); var edge = Math.floor(Math.random() * 4); switch (edge) { case 0: monster.x = Math.random() * 2048; monster.y = 0; break; case 1: monster.x = 2048; monster.y = Math.random() * 2732; break; case 2: monster.x = Math.random() * 2048; monster.y = 2732; break; case 3: monster.x = 0; monster.y = Math.random() * 2732; break; } monsters.push(monster); } function resetLevel() { levelResetCount++; // Remove existing trees and monsters trees.forEach(function (tree) { tree.destroy(); }); monsters.forEach(function (monster) { monster.destroy(); }); trees = []; monsters = []; // Add trees for (var i = 0; i < 5 + levelResetCount; i++) { var tree; var positionValid; do { positionValid = true; tree = new Tree(); tree.x = Math.random() * 2048; tree.y = Math.random() * 2732; // Check if the tree spawns on top of the hero if (tree.intersects(hero)) { positionValid = false; } } while (!positionValid); game.addChild(tree); trees.push(tree); } // Add monsters for (var i = 0; i < 6 + levelResetCount; i++) { var monster = game.addChild(new Monster()); var edge = Math.floor(Math.random() * 4); switch (edge) { case 0: // Top edge monster.x = Math.random() * 2048; monster.y = 0; break; case 1: // Right edge monster.x = 2048; monster.y = Math.random() * 2732; break; case 2: // Bottom edge monster.x = Math.random() * 2048; monster.y = 2732; break; case 3: // Left edge monster.x = 0; monster.y = Math.random() * 2732; break; } monsters.push(monster); } } var levelResetCount = 1; var bulletCount = 10; var bulletCountTxt = new Text2('Bullets Left: ' + bulletCount, { size: 30, fill: '#ffffff' }); LK.gui.bottomRight.addChild(bulletCountTxt); bulletCountTxt.anchor.set(1, 0); bulletCountTxt.x = -50; bulletCountTxt.y = -50; var bulletNoteTxt = new Text2('Bullets that hit a monster are returned, All others are lost', { size: 20, fill: '#ffffff' }); LK.gui.bottomRight.addChild(bulletNoteTxt); bulletNoteTxt.anchor.set(1, 0); bulletNoteTxt.x = -50; bulletNoteTxt.y = -80; var score = 0; var scoreTxt = new Text2('# of Monsters Killed: 0', { size: 30, fill: '#ffffff' }); LK.gui.topRight.addChild(scoreTxt); scoreTxt.anchor.set(1, 0); scoreTxt.x = -50; scoreTxt.y = 50; var levelResetTxt = new Text2(levelResetCount.toString(), { size: 30, fill: '#ffffff' }); LK.gui.top.addChild(levelResetTxt); levelResetTxt.anchor.set(1, 0); levelResetTxt.y = 50; // Add a button for mobile devices to fire the bullet
/****
* Classes
****/
var Instructions = Container.expand(function () {
var self = Container.call(this);
var instructionsText = new Text2('Instructions: Use your Left Click on mouse to move the hero.\n Right Click to shoot bullets.\n Kill all the monsters to advance to the next level. \n Good Luck!', {
size: 30,
fill: '#ffffff',
align: 'center'
});
self.addChild(instructionsText);
instructionsText.x = 0 - instructionsText.width / 2;
instructionsText.y = 2 - instructionsText.height / 2;
});
// No assets are defined as this is a blank game
var Hero = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('hero', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetPosition = {
x: self.x,
y: self.y
};
self.speed = 5;
self.direction = {
x: 0,
y: 0
};
self.update = function () {
// Calculate the angle in radians and rotate the hero
var angle = Math.atan2(self.direction.y, self.direction.x);
self.rotation = angle;
};
self.checkCollision = function (trees) {
return false;
};
});
var Tree = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 0.5
});
});
var Monster = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('monster', {
anchorX: 0.5,
anchorY: 0.5
});
self.isAlive = true;
self.speed = 1;
self.chaseHero = function (hero) {
if (!self.isAlive || !hero) {
return;
}
var dx = hero.x - self.x;
var dy = hero.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance > 0) {
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
if (self.intersects(hero)) {
if (LK.getScore() < 10) {
LK.showGameOver({
text: 'You Suck',
color: '#FFFFFF'
});
} else {
LK.showGameOver();
}
}
};
self.destroyedByBullet = function () {
self.isAlive = false;
LK.setScore(LK.getScore() + 1);
scoreTxt.setText('# of Monsters Killed: ' + LK.getScore().toString());
bulletCount = Math.max(bulletCount + 1, 1);
bulletCountTxt.setText('Bullets: ' + bulletCount);
self.destroy();
};
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.direction = {
x: 0,
y: 0
};
self.move = function (trees) {
if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
self.destroy();
return true;
}
self.x += self.direction.x * self.speed;
self.y += self.direction.y * self.speed;
for (var i = 0; i < trees.length; i++) {
if (self.intersects(trees[i])) {
self.destroy();
return true;
}
}
for (var j = 0; j < monsters.length; j++) {
if (self.intersects(monsters[j]) && monsters[j].isAlive) {
monsters[j].destroyedByBullet();
self.destroy();
return true;
}
}
return false;
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 // Initialize game with black background
});
/****
* Game Code
****/
var instructions = game.addChild(new Instructions());
instructions.x = 2048 / 2;
instructions.y = 2732 / 3;
var hero = game.addChild(new Hero());
hero.x = 2048 / 2;
hero.y = 2732 / 2;
// Create a text box to display hero's speed and direction
// The heroInfo variable was not defined, so we remove the lines that reference it.
var dragNode = null;
var trees = [];
function handleMove(obj) {
var event = obj.event;
var pos = event.getLocalPosition(game);
if (dragNode) {
var oldX = dragNode.x;
var oldY = dragNode.y;
if (dragNode === hero) {
var targetX = pos.x;
var targetY = pos.y;
var distance = Math.sqrt(Math.pow(targetX - hero.x, 2) + Math.pow(targetY - hero.y, 2));
hero.direction.x = (targetX - hero.x) / distance;
hero.direction.y = (targetY - hero.y) / distance;
var nextX = hero.x + hero.direction.x * hero.speed;
var nextY = hero.y + hero.direction.y * hero.speed;
if (!hero.checkCollision(trees)) {
hero.x = nextX;
hero.y = nextY;
} else {
hero.direction.x = 0;
hero.direction.y = 0;
}
}
}
}
game.on('move', handleMove);
game.on('down', function (obj) {
if (instructions) {
instructions.destroy();
instructions = null;
}
var event = obj.event;
var pos = event.getLocalPosition(game);
hero.targetPosition = {
x: pos.x,
y: pos.y
};
hero.direction.x = hero.targetPosition.x - hero.x;
hero.direction.y = hero.targetPosition.y - hero.y;
var distance = Math.sqrt(hero.direction.x * hero.direction.x + hero.direction.y * hero.direction.y);
hero.direction.x /= distance;
hero.direction.y /= distance;
});
// Add touch controls for mobile devices
LK.on('touchstart', function (obj) {
var event = obj.event;
var pos = event.getLocalPosition(game);
hero.targetPosition = {
x: pos.x,
y: pos.y
};
hero.direction.x = hero.targetPosition.x - hero.x;
hero.direction.y = hero.targetPosition.y - hero.y;
var distance = Math.sqrt(hero.direction.x * hero.direction.x + hero.direction.y * hero.direction.y);
hero.direction.x /= distance;
hero.direction.y /= distance;
});
// Update the text box every game tick
LK.on('tick', function () {
if (hero.targetPosition) {
var distanceToTarget = hero.targetPosition ? Math.sqrt(Math.pow(hero.targetPosition.x - hero.x, 2) + Math.pow(hero.targetPosition.y - hero.y, 2)) : 0;
}
if (distanceToTarget > hero.speed) {
var nextX = hero.x + hero.direction.x * hero.speed;
var nextY = hero.y + hero.direction.y * hero.speed;
if (!hero.checkCollision(trees)) {
hero.x = nextX;
hero.y = nextY;
}
} else {
hero.x = hero.targetPosition.x;
hero.y = hero.targetPosition.y;
hero.direction.x = 0;
hero.direction.y = 0;
}
levelResetTxt.setText('Level Number: ' + levelResetCount.toString());
});
game.on('up', function (obj) {
dragNode = null;
});
var bullets = [];
game.on('rightdown', function (obj) {
var event = obj.event;
var pos = event.getLocalPosition(game);
if (bulletCount > 0) {
var bullet = game.addChild(new Bullet());
bullet.x = hero.x;
bullet.y = hero.y;
var targetX = pos.x;
var targetY = pos.y;
var distance = Math.sqrt(Math.pow(targetX - hero.x, 2) + Math.pow(targetY - hero.y, 2));
bullet.direction = {
x: (targetX - hero.x) / distance,
y: (targetY - hero.y) / distance
};
bullet.speed = 10;
bullets.push(bullet);
bulletCount--;
bulletCountTxt.setText('Bullets: ' + bulletCount);
}
});
LK.on('tick', function () {
for (var i = bullets.length - 1; i >= 0; i--) {
if (bullets[i].move(trees)) {
bullets.splice(i, 1);
}
}
var allMonstersKilled = monsters.every(function (monster) {
return !monster.isAlive;
});
if (allMonstersKilled) {
resetLevel();
} else {
for (var i = 0; i < monsters.length; i++) {
monsters[i].chaseHero(hero);
}
}
});
// Add fewer trees
for (var i = 0; i < 5; i++) {
var tree = game.addChild(new Tree());
tree.x = Math.random() * 2048;
tree.y = Math.random() * 2732;
trees.push(tree);
}
var monsters = [];
for (var i = 0; i < 5; i++) {
var monster = game.addChild(new Monster());
var edge = Math.floor(Math.random() * 4);
switch (edge) {
case 0:
monster.x = Math.random() * 2048;
monster.y = 0;
break;
case 1:
monster.x = 2048;
monster.y = Math.random() * 2732;
break;
case 2:
monster.x = Math.random() * 2048;
monster.y = 2732;
break;
case 3:
monster.x = 0;
monster.y = Math.random() * 2732;
break;
}
monsters.push(monster);
}
function resetLevel() {
levelResetCount++;
// Remove existing trees and monsters
trees.forEach(function (tree) {
tree.destroy();
});
monsters.forEach(function (monster) {
monster.destroy();
});
trees = [];
monsters = [];
// Add trees
for (var i = 0; i < 5 + levelResetCount; i++) {
var tree;
var positionValid;
do {
positionValid = true;
tree = new Tree();
tree.x = Math.random() * 2048;
tree.y = Math.random() * 2732;
// Check if the tree spawns on top of the hero
if (tree.intersects(hero)) {
positionValid = false;
}
} while (!positionValid);
game.addChild(tree);
trees.push(tree);
}
// Add monsters
for (var i = 0; i < 6 + levelResetCount; i++) {
var monster = game.addChild(new Monster());
var edge = Math.floor(Math.random() * 4);
switch (edge) {
case 0:
// Top edge
monster.x = Math.random() * 2048;
monster.y = 0;
break;
case 1:
// Right edge
monster.x = 2048;
monster.y = Math.random() * 2732;
break;
case 2:
// Bottom edge
monster.x = Math.random() * 2048;
monster.y = 2732;
break;
case 3:
// Left edge
monster.x = 0;
monster.y = Math.random() * 2732;
break;
}
monsters.push(monster);
}
}
var levelResetCount = 1;
var bulletCount = 10;
var bulletCountTxt = new Text2('Bullets Left: ' + bulletCount, {
size: 30,
fill: '#ffffff'
});
LK.gui.bottomRight.addChild(bulletCountTxt);
bulletCountTxt.anchor.set(1, 0);
bulletCountTxt.x = -50;
bulletCountTxt.y = -50;
var bulletNoteTxt = new Text2('Bullets that hit a monster are returned, All others are lost', {
size: 20,
fill: '#ffffff'
});
LK.gui.bottomRight.addChild(bulletNoteTxt);
bulletNoteTxt.anchor.set(1, 0);
bulletNoteTxt.x = -50;
bulletNoteTxt.y = -80;
var score = 0;
var scoreTxt = new Text2('# of Monsters Killed: 0', {
size: 30,
fill: '#ffffff'
});
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.anchor.set(1, 0);
scoreTxt.x = -50;
scoreTxt.y = 50;
var levelResetTxt = new Text2(levelResetCount.toString(), {
size: 30,
fill: '#ffffff'
});
LK.gui.top.addChild(levelResetTxt);
levelResetTxt.anchor.set(1, 0);
levelResetTxt.y = 50;
// Add a button for mobile devices to fire the bullet
Make a Tree. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a monster that is half bat half ogre. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
create a small bullet projectile. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
Create a single bearded man in a suit reaching out holding an imaginary weapon, I want him generated in 32 bit graphic style and i want to see his entire body. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.