Initial commit

This commit is contained in:
2024-01-13 18:20:27 +01:00
commit 4265d64e57
57 changed files with 1623 additions and 0 deletions

View 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});
}

View 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
404_games/space-invaders/js/controls.js vendored Normal file
View 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;
}
}

View 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);
}
};

View 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();

View 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.four);
loadEnemy({ x: 180, y: 50 }, data.zero);
loadEnemy({ x: 300, y: 50 }, data.four);
},
function(xhr) { console.error(xhr); }
);

View 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);

View 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();
}