Files
sis/js/spaceinvaders-core.js
Fabrice Ecaille 883157e3a6 Initial commit
2013-09-25 18:26:19 +02:00

234 lines
5.4 KiB
JavaScript

var WAVES = [
{
wave : [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ],
move : function() {
var offset = (PLAYGROUND_WIDTH - 16 * this.width) / 2;
if (Math.abs((this.getOriginX() - this.getX())) >= offset) {
this.directionX *= -1;
this.y = (this.y + this.height / 4);
}
}
},
{
wave : [ [ 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ],
move : function() {
var offset = (PLAYGROUND_WIDTH - 16 * this.width) / 2;
if (Math.abs((this.getOriginX() - this.getX())) >= offset) {
this.directionX *= -1;
this.y = (this.y + this.height / 4);
}
}
} ];
Game = {
running : false,
wave : -1,
aliens : [],
ship : null,
score : 0,
init : function() {
"use strict";
Game.wave = Game.wave + 1;
var row, col;
var wave = WAVES[Game.wave].wave;
for (row = 0; row < wave.length; row = row + 1) {
var aliensRow = wave[row], type = aliensRow[0], offset = (PLAYGROUND_WIDTH - ((aliensRow.length - 1) * 0.5 + aliensRow.length)
* ALIENS_WIDTH) / 2;
for (col = 0; col < aliensRow.length; col = col + 1) {
Game.setAlien(col, row, offset, type, WAVES[Game.wave].move);
}
}
SCOREBOARD.init();
SCOREBOARD.set_score( Game.score );
Game.setShip();
Game.running = true;
},
levelComplete : function() {
"use strict";
Game.running = false;
setTimeout(function() {
Game.init();
}, 3000);
},
hit : function() {
"use strict";
if( !Game.running ) {
return false;
}
console.log( "Game.hit" );
var health = Game.ship.hit();
$(".alienShot").remove();
$(".shipShot").remove();
$("#life" + Game.ship.lives).remove();
Game.running = false;
Game.ship.lives = Game.ship.lives - 1;
$("#hero").children().hide();
if( Game.ship.lives > 0 ) {
var _this = Game.ship;
setTimeout(function() {
Game.running = true;
$("#hero").children().show();
_this.health = 1;
}, 2000);
}
else {
GUI.drawText( $("#message"), game_over, true );
Game.show_game_over();
}
},
setAlien : function(x, y, offset, type, move) {
"use strict";
var id = x * ROWS + y;
var alien = new Alien("alien" + id, {
x : offset + x * ALIENS_WIDTH * 1.5,
y : START_Y + (y * 1.25 * ALIENS_HEIGHT)
}, move);
$("#actors").addSprite("alien" + id, $.extend({posx : alien.x, posy : alien.y}, animations.alien));
alien.node = $("#alien" + id);
alien.node.addClass("alien");
$("#alien" + id)[0].alien = alien;
Game.aliens.push(alien);
},
setShip : function() {
var type = SHIPS.scout;
Game.ship = new Ship("ship", {
x : $("#hero").x(),
y : $("#hero").y()
}, 3, animations.hero.ship.animation);
var hero = $("#hero");
$.each(animations.hero,
function(id, obj){
hero.addSprite(id, obj);
});
Game.ship.node = $("#hero");
},
addToScore : function( toAdd ) {
Game.score = Game.score + toAdd;
SCOREBOARD.add( toAdd );
},
control : function() {
if( !Game.running ) {
return false;
}
$(document).keyup(function(e){
switch(e.keyCode) {
case 37:
e.preventDefault();
Game.ship.left(false);
break;
case 39:
e.preventDefault();
Game.ship.right(false);
break;
}
});
$(document).keydown(function(e){
switch(e.keyCode) {
case 37:
e.preventDefault();
Game.ship.left(true);
break;
case 39:
e.preventDefault();
Game.ship.right(true);
break;
case 32:
e.preventDefault();
Game.ship.fire($("#shipShots"), "shipShot");
return false;
}
});
},
alienControl : function() {
if( !Game.running ) {
return false;
}
$.each(Game.aliens, function(index, alien ) {
alien.move();
if( alien.health > 0 && Math.random() < alien.aggression ) {
alien.fire($("#aliensShots"), "alienShot");
}
});
},
heroShotCollision : function() {
if( !Game.running ) {
return false;
}
$(".shipShot").each(function(i,e) {
var posy = $(this).y();
if( posy < -$(this).height() ) {
this.remove();
return;
}
var weapon = $(this)[0].weapon;
$(this).y(weapon.directionY * weapon.speed, true);
$(this).x(weapon.directionX * weapon.speed, true);
var collisions = $(this).collision(".alien,."+$.gQ.groupCssClass);
collisions.each( function() {
var alien = $(this)[0];
var aliensNotInArray = $.grep( Game.aliens, function( elementOfArray, index) {
return elementOfArray.id == alien.id;
}, true);
Game.aliens = aliensNotInArray;
$(this)[0].alien.hit();
})
if( collisions.length > 0 ) {
this.remove()
}
if( Game.aliens.length == 0 ) {
Game.running = false;
Game.levelComplete();
}
});
},
alienShotCollision : function() {
if( !Game.running ) {
return false;
}
$(".alienShot").each(function(i,e) {
var posy = $(this).y();
if( posy > PLAYGROUND_HEIGHT ) {
this.remove();
return;
}
var weapon = $(this)[0].weapon;
$(this).y(weapon.directionY * weapon.speed, true);
$(this).x(weapon.directionX * weapon.speed, true);
var collisions = $(this).collision("#ship,."+$.gQ.groupCssClass);
collisions.each( function() {
Game.hit();
})
if( collisions.length > 0 ) {
this.remove()
}
});
}
};