236 lines
5.7 KiB
JavaScript
236 lines
5.7 KiB
JavaScript
// globals
|
|
playarea_canvas = document.getElementById('tutorial');
|
|
playarea_canvas.resize(320,200);
|
|
playarea = playarea_canvas.getContext('2d');
|
|
//p1_scr = document.getElementById('p1_scr');
|
|
//p2_scr = document.getElementById('p2_scr');
|
|
//status_msg = document.getElementById('status');
|
|
//debug = document.getElementById('debug');
|
|
ball_direction = 0;
|
|
up = -1;
|
|
down = 1;
|
|
|
|
//key codes
|
|
key_up = 38;
|
|
key_down = 40;
|
|
key_W = 87;
|
|
key_S = 83;
|
|
key_pause = 32;
|
|
|
|
speed = 2; //controls the speed of the ball
|
|
paddle_inc = 10; //how many pixels paddle can move in either direction
|
|
pause = false;
|
|
|
|
player_1 = 0; //player IDs
|
|
player_2 = 1;
|
|
player_1_scr = 0; //player scores
|
|
player_2_scr = 0;
|
|
player_1_direction = null; //null = no movement whatsoever
|
|
player_2_direction = null;
|
|
|
|
pa = new Array();
|
|
divider = new Array();
|
|
paddle_1 = new Array();
|
|
paddle_2 = new Array();
|
|
ball = new Array();
|
|
|
|
|
|
function sleep(numberMillis)
|
|
{
|
|
var now = new Date();
|
|
var exitTime = now.getTime() + numberMillis;
|
|
while (true) {
|
|
now = new Date();
|
|
if (now.getTime() > exitTime)
|
|
return;
|
|
}
|
|
}
|
|
|
|
function init()
|
|
{
|
|
pa['width'] = 150;
|
|
pa['height'] = 140;
|
|
pa['player_margin'] = 10; //area behind player paddles
|
|
pa['foreground'] = "#FFFFFF";
|
|
pa['background'] = "#000000";
|
|
|
|
divider['pos'] = pa['width']/2;
|
|
divider['width'] = 4;
|
|
|
|
paddle_1['width'] = 8;
|
|
paddle_1['height'] = 64;
|
|
paddle_1['x'] = pa['player_margin'];
|
|
paddle_1['y'] = (pa['height'] /2 ) - (paddle_1['height'] / 2);
|
|
|
|
paddle_2['width'] = 8;
|
|
paddle_2['height'] = 64;
|
|
paddle_2['x'] = (pa['width'] - pa['player_margin'] - paddle_2['width']);
|
|
paddle_2['y'] = (pa['height'] /2 ) - (paddle_2['height'] / 2);
|
|
|
|
ball['width'] = 10;
|
|
ball['height'] = 10;
|
|
ball['x'] = (pa['width']/2) - (ball['width'] / 2);
|
|
ball['y'] = (pa['height']/2) - (ball['height'] / 2);
|
|
|
|
ball_direction = Math.random() * 360; //initialize ball direction, which is determined by angle, at random
|
|
speed = 2;
|
|
}
|
|
|
|
function renderPlayarea()
|
|
{
|
|
playarea.beginPath();
|
|
|
|
playarea.clearRect(0,0,pa['width'],pa['height']);
|
|
playarea.fillStyle = pa['background'];
|
|
playarea.strokeStyle = pa['foreground'];
|
|
playarea.fillRect(0,0, pa['width'], pa['height']);
|
|
|
|
//move paddles
|
|
if(player_1_direction != null)
|
|
{
|
|
if(player_1_direction == up)
|
|
paddle_1['y'] = paddle_1['y'] - paddle_inc;
|
|
else
|
|
paddle_1['y'] = paddle_1['y'] + paddle_inc;
|
|
}
|
|
if(player_2_direction != null)
|
|
{
|
|
if(player_2_direction == up)
|
|
paddle_2['y'] = paddle_2['y'] - paddle_inc;
|
|
else
|
|
paddle_2['y'] = paddle_2['y'] + paddle_inc;
|
|
}
|
|
playarea.rect(paddle_1['x'],paddle_1['y'],paddle_1['width'],paddle_1['height']);
|
|
playarea.rect(paddle_2['x'],paddle_2['y'],paddle_2['width'],paddle_2['height']);
|
|
|
|
//move ball
|
|
playarea.rect(ball['x'], ball['y'], ball['width'], ball['height']);
|
|
ball['x'] = ball['x'] + Math.cos((ball_direction)*Math.PI/180) * speed;
|
|
ball['y'] = ball['y'] + Math.sin((ball_direction)*Math.PI/180) * speed;
|
|
|
|
playarea.fillStyle = pa['foreground'];
|
|
playarea.fill();
|
|
|
|
playarea.beginPath();
|
|
//redraw divider
|
|
playarea.lineWidth = divider['width'];
|
|
playarea.lineTo(divider['pos'], 0);
|
|
playarea.lineTo(divider['pos'], pa['height'] = 200);
|
|
playarea.lineWidth = 1;
|
|
|
|
playarea.stroke();
|
|
playarea.closePath();
|
|
}
|
|
|
|
function testCollisions()
|
|
{
|
|
//make sure paddles don't go beyond play area
|
|
if(((paddle_1['y'] <= 0) && (player_1_direction == up)) || ((paddle_1['y'] >= (pa['height'] - paddle_1['height'])) && (player_1_direction == down)))
|
|
player_1_direction = null;
|
|
if(((paddle_2['y'] <= 0) && (player_2_direction == up)) || ((paddle_2['y'] >= (pa['height'] - paddle_2['height'])) && (player_2_direction == down)))
|
|
player_2_direction = null;
|
|
|
|
//check to see if ball went beyond paddles, and if so, score accordingly and reset playarea
|
|
if(ball['x'] <= 0)
|
|
{
|
|
setScore(player_2);
|
|
init()
|
|
sleep(1000);
|
|
}
|
|
if(ball['x'] >= (pa['width'] - ball['width']))
|
|
{
|
|
setScore(player_1);
|
|
init();
|
|
sleep(1000);
|
|
}
|
|
|
|
//check to see if ball hit top or bottom wall. if so, change direction
|
|
if((ball['y'] >= (pa['height'] - ball['height'])) || ball['y'] <= 0)
|
|
ball_direction = -ball_direction;
|
|
|
|
//check to see if the ball hit a paddle, and if so, change ball angle dependant on where it hit the paddle
|
|
if((ball['x'] <= (paddle_1['x'] + paddle_1['width'])) && (ball['y'] >= paddle_1['y']) && (ball['y'] <= (paddle_1['y'] + paddle_1['height'])))
|
|
{
|
|
ball_direction = -ball_direction/2;
|
|
speed += .5;
|
|
}
|
|
if(((ball['x'] + ball['width']) >= paddle_2['x']) && (ball['y'] >= paddle_2['y']) && (ball['y'] <= (paddle_2['y'] + paddle_2['height'])))
|
|
{
|
|
ball_direction = (180+ball_direction)/2;
|
|
speed += .5;
|
|
}
|
|
}
|
|
|
|
function setScore(p)
|
|
{
|
|
if(p == player_1)
|
|
{
|
|
player_1_scr++;
|
|
//p1_scr.firstChild.nodeValue = player_1_scr;
|
|
}
|
|
if(p == player_2)
|
|
{
|
|
player_2_scr++;
|
|
//p2_scr.firstChild.nodeValue = player_2_scr;
|
|
}
|
|
}
|
|
|
|
|
|
//handle input
|
|
document.onkeydown = function(ev)
|
|
{
|
|
switch(ev.keyCode)
|
|
{
|
|
case key_W:
|
|
player_1_direction = up;
|
|
break;
|
|
case key_S:
|
|
player_1_direction = down;
|
|
break;
|
|
case key_up:
|
|
player_2_direction = up;
|
|
break;
|
|
case key_down:
|
|
player_2_direction = down;
|
|
break;
|
|
}
|
|
}
|
|
|
|
document.onkeyup = function(ev)
|
|
{
|
|
switch(ev.keyCode)
|
|
{
|
|
case key_W:
|
|
case key_S:
|
|
player_1_direction = null;
|
|
break;
|
|
case key_up:
|
|
case key_down:
|
|
player_2_direction = null;
|
|
break;
|
|
case key_pause:
|
|
if(pause == false)
|
|
{
|
|
clearInterval(game);
|
|
//status_msg.style.visibility = "visible";
|
|
pause = true;
|
|
}
|
|
else
|
|
{
|
|
game = setInterval(main, 25);
|
|
//status_msg.style.visibility = "hidden";
|
|
pause = false;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function main()
|
|
{
|
|
testCollisions();
|
|
renderPlayarea();
|
|
}
|
|
|
|
init();
|
|
game = setInterval(main, 25);
|