adding 502 error
41
games/space-invaders502/enemies.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{"zero": [
|
||||
{"x": 0, "y": 0},
|
||||
{"x": 0, "y": 1},
|
||||
{"x": 0, "y": 2},
|
||||
{"x": 0, "y": 3},
|
||||
{"x": 0, "y": 4},
|
||||
{"x": 1, "y": 0},
|
||||
{"x": 1, "y": 4},
|
||||
{"x": 2, "y": 0},
|
||||
{"x": 2, "y": 1},
|
||||
{"x": 2, "y": 2},
|
||||
{"x": 2, "y": 3},
|
||||
{"x": 2, "y": 4}
|
||||
],
|
||||
"five": [
|
||||
{"x": 0, "y": 0},
|
||||
{"x": 0, "y": 1},
|
||||
{"x": 0, "y": 2},
|
||||
{"x": 0, "y": 4},
|
||||
{"x": 1, "y": 0},
|
||||
{"x": 1, "y": 2},
|
||||
{"x": 1, "y": 4},
|
||||
{"x": 2, "y": 0},
|
||||
{"x": 2, "y": 2},
|
||||
{"x": 2, "y": 3},
|
||||
{"x": 2, "y": 4}
|
||||
],
|
||||
"two": [
|
||||
{"x": 0, "y": 0},
|
||||
{"x": 0, "y": 3},
|
||||
{"x": 0, "y": 2},
|
||||
{"x": 0, "y": 4},
|
||||
{"x": 1, "y": 0},
|
||||
{"x": 1, "y": 2},
|
||||
{"x": 1, "y": 4},
|
||||
{"x": 2, "y": 0},
|
||||
{"x": 2, "y": 2},
|
||||
{"x": 2, "y": 1},
|
||||
{"x": 2, "y": 4}
|
||||
]
|
||||
}
|
||||
BIN
games/space-invaders502/images/32_enemy.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
games/space-invaders502/images/32_laser_blue.png
Normal file
|
After Width: | Height: | Size: 597 B |
BIN
games/space-invaders502/images/32_laser_red.png
Normal file
|
After Width: | Height: | Size: 460 B |
BIN
games/space-invaders502/images/32_player.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
games/space-invaders502/images/64_1.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
games/space-invaders502/images/64_2.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
games/space-invaders502/images/64_laser_blue.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
games/space-invaders502/images/64_laser_red.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
games/space-invaders502/images/background.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
20
games/space-invaders502/index.html
Normal file
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>404 Space Invaders</title>
|
||||
</head>
|
||||
<body>
|
||||
<canvas id='canvas' height="480" width="512"></canvas>
|
||||
<script src="js/utils.js"></script>
|
||||
|
||||
<script src="js/assets.js"></script>
|
||||
<script src="js/draw.js"></script>
|
||||
<script src="js/update.js"></script>
|
||||
<script src="js/controls.js"></script>
|
||||
<script src="js/objects.js"></script>
|
||||
<script src="js/ai.js"></script>
|
||||
|
||||
<script src="js/game.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
41
games/space-invaders502/js/ai.js
Normal file
@@ -0,0 +1,41 @@
|
||||
var updateEnemies = function(){
|
||||
|
||||
if (hasReachedEnd()) {
|
||||
changeEnemyDirection();
|
||||
return;
|
||||
}
|
||||
var enemyMovement;
|
||||
if (enemyDirection == LEFT) enemyMovement = -10;
|
||||
else enemyMovement = 10;
|
||||
|
||||
for (var i = 0 ; i < enemies.length; i++){
|
||||
var enemy = enemies[i];
|
||||
enemy.x = enemy.x + enemyMovement ;
|
||||
}
|
||||
}
|
||||
|
||||
var hasReachedEnd = function(){
|
||||
var threshold = 32;
|
||||
|
||||
for (var i = 0 ; i < enemies.length; i++){
|
||||
var enemy = enemies[i];
|
||||
if (enemyDirection == RIGHT && enemy.x > canvas.width - threshold - 32) return true;
|
||||
else if (enemyDirection == LEFT && enemy.x < threshold) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
var changeEnemyDirection = function(){
|
||||
if (enemyDirection == LEFT) enemyDirection = RIGHT;
|
||||
else enemyDirection = LEFT;
|
||||
|
||||
for (var i = 0 ; i < enemies.length; i++){
|
||||
var enemy = enemies[i];
|
||||
enemy.y = enemy.y + 30 ;
|
||||
}
|
||||
}
|
||||
|
||||
var enemyShot = function(){
|
||||
var enemy = enemies[Math.floor(Math.random()*enemies.length)];
|
||||
enemyShots.push({x:enemy.x, y: enemy.y});
|
||||
}
|
||||
45
games/space-invaders502/js/assets.js
Normal file
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
Ship and laser assets by Cpt_Flash
|
||||
Available at: http://opengameart.org/content/space-ships-2-units
|
||||
License: GPL 3.0
|
||||
**/
|
||||
|
||||
// Background image
|
||||
var bgReady = false;
|
||||
var bgImage = new Image();
|
||||
|
||||
bgImage.onload = function () {
|
||||
bgReady = true;
|
||||
};
|
||||
bgImage.src = "images/background.png";
|
||||
|
||||
// Hero image
|
||||
var heroReady = false;
|
||||
var heroImage = new Image();
|
||||
heroImage.onload = function () {
|
||||
heroReady = true;
|
||||
};
|
||||
heroImage.src = "images/32_player.png";
|
||||
|
||||
// Monster image
|
||||
var monsterReady = false;
|
||||
var monsterImage = new Image();
|
||||
monsterImage.onload = function () {
|
||||
monsterReady = true;
|
||||
};
|
||||
monsterImage.src = "images/32_enemy.png";
|
||||
|
||||
// Hero image
|
||||
var shotReady = false;
|
||||
var shotImage = new Image();
|
||||
shotImage.onload = function () {
|
||||
shotReady = true;
|
||||
};
|
||||
shotImage.src = "images/32_laser_blue.png";
|
||||
|
||||
var shotRedReady = false;
|
||||
var shotRedImage = new Image();
|
||||
shotRedImage.onload = function () {
|
||||
shotRedReady = true;
|
||||
};
|
||||
shotRedImage.src = "images/32_laser_red.png";
|
||||
40
games/space-invaders502/js/controls.js
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
// Handle keyboard controls
|
||||
var keysDown = {};
|
||||
|
||||
var KEY_UP =38, KEY_DOWN =40, KEY_LEFT =37, KEY_RIGHT =39;
|
||||
|
||||
addEventListener("keydown", function (e) {
|
||||
keysDown[e.keyCode] = true;
|
||||
}, false);
|
||||
|
||||
addEventListener("keyup", function (e) {
|
||||
delete keysDown[e.keyCode];
|
||||
}, false);
|
||||
|
||||
addEventListener("mousemove", function(evt) {
|
||||
hero.x = evt.pageX - 24 ;
|
||||
}, false);
|
||||
|
||||
var lastShot = 0;
|
||||
var SHOT_DELAY = 1000;
|
||||
|
||||
addEventListener("click", function(evt) {
|
||||
if (!hero.dead) {
|
||||
var now = new Date().getTime();
|
||||
if (lastShot +SHOT_DELAY < now ) {
|
||||
lastShot = now;
|
||||
playerShots.push({x:evt.pageX, y: hero.y});
|
||||
}
|
||||
}
|
||||
}, false);
|
||||
|
||||
|
||||
//Called from update.js
|
||||
var controls = function(modifier){
|
||||
if (KEY_LEFT in keysDown) { // Player holding left
|
||||
hero.x -= hero.speed * modifier;
|
||||
}
|
||||
if (KEY_RIGHT in keysDown) { // Player holding right
|
||||
hero.x += hero.speed * modifier;
|
||||
}
|
||||
}
|
||||
45
games/space-invaders502/js/draw.js
Normal file
@@ -0,0 +1,45 @@
|
||||
// Create the canvas
|
||||
var canvas = document.getElementById("canvas");
|
||||
var ctx = canvas.getContext("2d");
|
||||
|
||||
var SIZE = 32;
|
||||
|
||||
var vy = 0;
|
||||
// Draw everything
|
||||
var render = function () {
|
||||
if (bgReady) {
|
||||
|
||||
ctx.drawImage(bgImage, 0, vy);
|
||||
ctx.drawImage(bgImage, 0, bgImage.height-Math.abs(vy));
|
||||
|
||||
if (Math.abs(vy) > bgImage.height) vy = 0;
|
||||
vy -= 2;
|
||||
}
|
||||
|
||||
if (heroReady && !hero.dead) {
|
||||
ctx.drawImage(heroImage, hero.x, hero.y,SIZE, SIZE);
|
||||
}
|
||||
|
||||
for (var i=0; i < enemies.length; i++){
|
||||
var enemy = enemies[i];
|
||||
ctx.drawImage(monsterImage, enemy.x, enemy.y,SIZE, SIZE);
|
||||
|
||||
}
|
||||
for (var i=0; i < enemyShots.length; i++){
|
||||
var shot = enemyShots[i];
|
||||
ctx.drawImage(shotRedImage, shot.x, shot.y ,SIZE, SIZE);
|
||||
}
|
||||
|
||||
for (var i=0; i < playerShots.length; i++){
|
||||
var shot = playerShots[i];
|
||||
ctx.drawImage(shotImage, shot.x, shot.y ,SIZE, SIZE);
|
||||
}
|
||||
|
||||
if (hero.dead){
|
||||
ctx.fillStyle = "rgb(250, 0, 0)";
|
||||
ctx.font = "48px Helvetica";
|
||||
ctx.textAlign = "center";
|
||||
ctx.textBaseline = "top";
|
||||
ctx.fillText("Game Over", canvas.width / 2, canvas.height/ 2);
|
||||
}
|
||||
};
|
||||
28
games/space-invaders502/js/game.js
Normal file
@@ -0,0 +1,28 @@
|
||||
// Reset the game when the player catches a monster
|
||||
var reset = function () {
|
||||
hero.x = canvas.width / 2;
|
||||
hero.y = canvas.height - 64;
|
||||
};
|
||||
|
||||
// The main game loop
|
||||
var main = function () {
|
||||
var now = Date.now();
|
||||
var delta = now - then;
|
||||
|
||||
update(delta / 1000);
|
||||
render();
|
||||
|
||||
then = now;
|
||||
|
||||
// Request to do this again ASAP
|
||||
requestAnimationFrame(main);
|
||||
};
|
||||
|
||||
// Cross-browser support for requestAnimationFrame
|
||||
var w = window;
|
||||
requestAnimationFrame = w.requestAnimationFrame || w.webkitRequestAnimationFrame || w.msRequestAnimationFrame || w.mozRequestAnimationFrame;
|
||||
|
||||
// Let's play this game!
|
||||
var then = Date.now();
|
||||
reset();
|
||||
main();
|
||||
29
games/space-invaders502/js/objects.js
Normal file
@@ -0,0 +1,29 @@
|
||||
// Game objects
|
||||
var hero = {};
|
||||
var playerShots = [];
|
||||
var enemyShots = [];
|
||||
|
||||
var shotSpeed = 200;
|
||||
|
||||
var RIGHT = 1, LEFT = 0;
|
||||
var enemies = [];
|
||||
var enemyDirection = RIGHT;
|
||||
var loadEnemy = function(offset, json){
|
||||
var size = 32;
|
||||
|
||||
for (var i = 0; i< json.length; i++){
|
||||
var pos = json[i];
|
||||
var enemy = {x: offset.x + pos.x * size, y: offset.y + pos.y * size} ;
|
||||
enemies.push(enemy);
|
||||
}
|
||||
}
|
||||
|
||||
loadJSON('enemies.json',
|
||||
function(data) {
|
||||
|
||||
loadEnemy({ x: 50, y: 50 }, data.five);
|
||||
loadEnemy({ x: 180, y: 50 }, data.zero);
|
||||
loadEnemy({ x: 300, y: 50 }, data.two);
|
||||
},
|
||||
function(xhr) { console.error(xhr); }
|
||||
);
|
||||
45
games/space-invaders502/js/update.js
Normal file
@@ -0,0 +1,45 @@
|
||||
|
||||
// Update game objects
|
||||
var update = function (modifier) {
|
||||
controls(modifier);
|
||||
|
||||
for (var i = 0; i< playerShots.length; i++){
|
||||
var shot = playerShots[i];
|
||||
shot.y = shot.y - modifier * shotSpeed;
|
||||
|
||||
for (var e= 0; e < enemies.length; e++){
|
||||
var enemy = enemies[e];
|
||||
if (collision(shot, enemy)) {
|
||||
console.log("Collision with enemy ", shot, enemy);
|
||||
playerShots.splice(i, 1);
|
||||
enemies.splice(e, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i< enemyShots.length; i++){
|
||||
var shot = enemyShots[i];
|
||||
shot.y = shot.y + modifier * shotSpeed;
|
||||
|
||||
if (collision(shot, hero)) {
|
||||
console.log("Collision with hero ", shot, hero);
|
||||
enemyShots.splice(i, 1);
|
||||
hero.dead = true;
|
||||
}
|
||||
}
|
||||
//updateEnemies();
|
||||
// Are they touching?
|
||||
};
|
||||
|
||||
var collision = function(shot, enemy){
|
||||
return shot.x <= (enemy.x + 32)
|
||||
&& enemy.x <= (shot.x + 32)
|
||||
&& shot.y <= (enemy.y + 32)
|
||||
&& enemy.y <= (shot.y + 32)
|
||||
}
|
||||
|
||||
//AI METHODS
|
||||
setInterval(function(){updateEnemies()}, 500);
|
||||
|
||||
setInterval(function(){enemyShot()}, 1000);
|
||||
11
games/space-invaders502/js/utils.js
Normal file
@@ -0,0 +1,11 @@
|
||||
var loadJSON = function (path, success, error)
|
||||
{
|
||||
var oReq = new XMLHttpRequest();
|
||||
oReq.onload = function reqListener () {
|
||||
jsonData = JSON.parse(this.responseText);
|
||||
console.log("Loading JSON data", jsonData);
|
||||
success(jsonData);
|
||||
};;
|
||||
oReq.open("get", path, true);
|
||||
oReq.send();
|
||||
}
|
||||