2012-08-20 21:01:40 +02:00
debug = false ;
2012-08-15 08:55:08 +02:00
2012-08-19 17:11:01 +02:00
player _pos = [ 0.5 * window . innerWidth , 0.9 * window . innerHeight ] ;
enemy _pos = [ 0.5 * window . innerWidth , 0.1 * window . innerHeight ] ;
2012-08-19 17:45:26 +02:00
new _enemy _pos = [ enemy _pos [ 0 ] , enemy _pos [ 1 ] ] ;
2012-08-14 23:08:49 +02:00
pewpew = 0 ;
2012-08-19 17:52:14 +02:00
herzles = 0 ;
2012-08-19 18:00:47 +02:00
lastshoot = 0 ;
2012-08-14 23:08:49 +02:00
document . onkeydown = onKeyDown ;
function onKeyDown ( e ) {
e = e || window . event ;
if ( e . keyCode == '37' ) { // left
player _pos [ 0 ] -= 10 ;
}
if ( e . keyCode == '39' ) { // right
player _pos [ 0 ] += 10 ;
}
if ( e . keyCode == '32' ) { // space = fire
2012-08-19 18:00:47 +02:00
if ( ( new Date ( ) ) . getTime ( ) - lastshoot > 300 ) {
shoot ( player _pos ) ;
}
2012-08-14 23:08:49 +02:00
}
}
shoots = [ ] ;
2012-08-15 08:55:08 +02:00
function shoot ( pos ) {
2012-08-19 18:00:47 +02:00
lastshoot = ( new Date ( ) ) . getTime ( ) ;
2012-08-19 17:52:14 +02:00
shoots [ shoots . length ] = [ pos [ 0 ] , pos [ 1 ] , false ] ;
2012-08-14 23:08:49 +02:00
// pewpew = 5;
}
function isCollided ( a , b ) {
2012-08-14 23:20:12 +02:00
var a _left = a . getClientRects ( ) [ 0 ] . left ;
var a _right = a . getClientRects ( ) [ 0 ] . right ;
var a _top = a . getClientRects ( ) [ 0 ] . top ;
var a _bottom = a . getClientRects ( ) [ 0 ] . bottom ;
var b _left = b . getClientRects ( ) [ 0 ] . left ;
var b _right = b . getClientRects ( ) [ 0 ] . right ;
var b _top = b . getClientRects ( ) [ 0 ] . top ;
var b _bottom = b . getClientRects ( ) [ 0 ] . bottom ;
2012-08-14 23:08:49 +02:00
return ! (
( a _left > b _right ) ||
( a _right < b _left ) ||
( a _top > b _bottom ) ||
( a _bottom < b _top )
) ;
}
2012-08-15 08:55:08 +02:00
function detectCollisions ( ) {
2012-08-14 23:08:49 +02:00
// detect collision
var enemydiv = document . getElementById ( "enemy" ) ;
for ( var i = 0 ; i < shoots . length ; i ++ ) {
if ( shoots [ i ] ) {
var shootdiv = document . getElementById ( 'shoot' + i ) ;
if ( shootdiv && isCollided ( shootdiv , enemydiv ) ) {
pewpew = 5 ;
2012-08-19 17:52:14 +02:00
if ( ! shoots [ i ] [ 2 ] ) {
herzles ++ ;
shoots [ i ] [ 2 ] = true ; // hit once
}
2012-08-14 23:08:49 +02:00
}
}
}
2012-08-15 08:55:08 +02:00
}
2012-08-14 23:08:49 +02:00
2012-08-15 08:55:08 +02:00
function render ( ) {
2012-08-14 23:08:49 +02:00
// render shoots
for ( var i = 0 ; i < shoots . length ; i ++ ) {
if ( shoots [ i ] ) {
var shootdiv = document . getElementById ( 'shoot' + i ) ;
if ( ! shootdiv ) {
shootdiv = document . createElement ( 'div' ) ;
shootdiv . setAttribute ( 'id' , 'shoot' + i ) ;
shootdiv . setAttribute ( 'class' , 'shoot' ) ;
2012-08-15 08:55:08 +02:00
shootdiv . innerHTML = 'i' ;
2012-08-14 23:08:49 +02:00
var body = document . getElementsByTagName ( 'body' ) [ 0 ] ;
body . appendChild ( shootdiv ) ;
}
2012-08-19 16:59:23 +02:00
shootdiv . style . left = ( shoots [ i ] [ 0 ]
- Math . round ( shootdiv . getClientRects ( ) [ 0 ] . width / 2 ) ) + 'px' ;
2012-08-14 23:08:49 +02:00
shootdiv . style . top = shoots [ i ] [ 1 ] ;
2012-08-15 08:55:08 +02:00
if ( debug )
shootdiv . style . border = "1px solid" ;
2012-08-14 23:08:49 +02:00
} else {
if ( deldiv = document . getElementById ( 'shoot' + i ) ) {
var body = document . getElementsByTagName ( 'body' ) [ 0 ] ;
body . removeChild ( deldiv ) ;
}
}
}
// render pew pew
var pewpewdiv = document . getElementById ( "pewpew" ) ;
if ( pewpew > 0 ) {
pewpewdiv . innerHTML = "pew! pew!" ;
} else {
pewpewdiv . innerHTML = "" ;
}
2012-08-19 17:52:14 +02:00
// herzles
var herzlesdiv = document . getElementById ( "herzles" ) ;
if ( herzles > 0 ) {
2012-08-19 18:40:48 +02:00
if ( pewpew > 0 ) {
herzlesdiv . innerHTML = herzles + " <3" ;
} else {
herzlesdiv . innerHTML = "" ;
}
2012-08-19 17:52:14 +02:00
}
2012-08-14 23:08:49 +02:00
// render player
var playerdiv = document . getElementById ( "player" ) ;
2012-08-19 17:11:01 +02:00
playerdiv . style . left = ( player _pos [ 0 ]
- Math . round ( playerdiv . getClientRects ( ) [ 0 ] . width / 2 ) ) + 'px' ;
playerdiv . style . top = ( player _pos [ 1 ]
- Math . round ( playerdiv . getClientRects ( ) [ 0 ] . height / 2 ) ) + 'px' ;
2012-08-15 08:55:08 +02:00
if ( debug )
playerdiv . style . border = "1px solid" ;
2012-08-14 23:08:49 +02:00
// render enemy
var enemydiv = document . getElementById ( "enemy" ) ;
2012-08-19 17:11:01 +02:00
enemydiv . style . left = ( enemy _pos [ 0 ]
- Math . round ( enemydiv . getClientRects ( ) [ 0 ] . width / 2 ) ) + 'px' ;
enemydiv . style . top = ( enemy _pos [ 1 ]
- Math . round ( enemydiv . getClientRects ( ) [ 0 ] . height / 2 ) ) + 'px' ;
2012-08-15 08:55:08 +02:00
if ( debug )
enemydiv . style . border = "1px solid" ;
}
2012-08-14 23:08:49 +02:00
2012-08-19 17:45:26 +02:00
function lerp ( t , a , b ) {
return ( a + t * ( b - a ) ) ;
}
2012-08-19 18:27:02 +02:00
function dist ( a , b ) {
return ( b [ 1 ] - a [ 1 ] ) / ( b [ 0 ] - a [ 0 ] ) ;
}
2012-08-19 17:45:26 +02:00
var a = 0 ;
2012-08-15 08:55:08 +02:00
function animate ( ) {
2012-08-19 17:45:26 +02:00
// inc loop counter
a ++ ;
2012-08-14 23:08:49 +02:00
// animate shoots
for ( var i = 0 ; i < shoots . length ; i ++ ) {
if ( shoots [ i ] ) {
shoots [ i ] [ 1 ] -= 20 ;
if ( shoots [ i ] [ 1 ] < 0 ) {
delete ( shoots [ i ] ) ;
}
}
}
// animate pew pew
if ( pewpew > 0 ) {
pewpew -= 1 ;
}
// animate enemy
2012-08-19 17:45:26 +02:00
// every now and then change direction
2012-08-19 18:46:33 +02:00
var min = - 75 ;
var max = + 75 ;
2012-08-19 17:45:26 +02:00
if ( a % 15 == 0 ) {
var off = min + parseInt ( Math . random ( ) * ( max - min ) ) ;
new _enemy _pos [ 0 ] += off ;
var off = min + parseInt ( Math . random ( ) * ( max - min ) ) ;
new _enemy _pos [ 1 ] += off ;
}
2012-08-19 18:27:02 +02:00
// avoid shoots
2012-08-19 18:32:49 +02:00
var avoiding _shoots = false ;
2012-08-19 18:27:02 +02:00
for ( var i = 0 ; i < shoots . length ; i ++ ) {
if ( shoots [ i ] ) {
if ( dist ( enemy _pos , shoots [ i ] ) < 100 ) {
2012-08-19 18:32:49 +02:00
avoiding _shoots = true ;
2012-08-19 18:27:02 +02:00
new _enemy _pos [ 0 ] = lerp ( - 0.50 , enemy _pos [ 0 ] , shoots [ i ] [ 0 ] ) ;
new _enemy _pos [ 1 ] = lerp ( - 0.35 , enemy _pos [ 1 ] , shoots [ i ] [ 1 ] ) ;
}
}
}
// avoid corners
2012-08-19 18:32:49 +02:00
if ( ! avoiding _shoots ) {
if ( new _enemy _pos [ 0 ] < 0.1 * window . innerWidth || new _enemy _pos [ 0 ] > 0.9 * window . innerWidth ) {
new _enemy _pos [ 0 ] = lerp ( 0.2 , enemy _pos [ 0 ] , 0.5 * window . innerWidth ) ;
}
if ( new _enemy _pos [ 1 ] < 0.1 * window . innerHeight || new _enemy _pos [ 1 ] > 0.5 * window . innerHeight ) {
new _enemy _pos [ 1 ] = lerp ( 0.2 , enemy _pos [ 1 ] , 0.25 * window . innerHeight ) ;
}
2012-08-19 18:27:02 +02:00
}
// stay inside!
if ( new _enemy _pos [ 0 ] < 0 ) new _enemy _pos [ 0 ] = 0 ;
if ( new _enemy _pos [ 0 ] > window . innerWidth ) new _enemy _pos [ 0 ] = window . innerWidth ;
2012-08-19 19:39:17 +02:00
if ( new _enemy _pos [ 1 ] < 0.1 * window . innerHeight ) new _enemy _pos [ 1 ] = 0.1 * window . innerHeight ;
2012-08-19 18:27:02 +02:00
if ( new _enemy _pos [ 1 ] > 0.5 * window . innerHeight ) new _enemy _pos [ 0 ] = 0.5 * window . innerHeight ;
2012-08-19 17:45:26 +02:00
// slowly move to desired position
enemy _pos [ 0 ] = lerp ( 0.15 , enemy _pos [ 0 ] , new _enemy _pos [ 0 ] ) ;
enemy _pos [ 1 ] = lerp ( 0.15 , enemy _pos [ 1 ] , new _enemy _pos [ 1 ] ) ;
2012-08-15 08:55:08 +02:00
}
function gameLoop ( ) {
detectCollisions ( ) ;
render ( ) ;
animate ( ) ;
2012-08-14 23:08:49 +02:00
setTimeout ( "gameLoop()" , 100 ) ;
}
2012-08-19 17:11:01 +02:00
function init ( ) {
2012-08-19 19:39:17 +02:00
if ( debug ) {
borderdiv = document . createElement ( 'div' ) ;
borderdiv . style . position = "absolute" ;
borderdiv . style . left = "10%" ;
borderdiv . style . width = "80%" ;
borderdiv . style . top = "10%" ;
borderdiv . style . height = "80%" ;
borderdiv . style . border = "1px solid" ;
var body = document . getElementsByTagName ( 'body' ) [ 0 ] ;
body . appendChild ( borderdiv ) ;
}
2012-08-19 17:11:01 +02:00
gameLoop ( ) ;
}