diff options
Diffstat (limited to 'examples/script/context2d/scripts/pong.js')
-rw-r--r-- | examples/script/context2d/scripts/pong.js | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/examples/script/context2d/scripts/pong.js b/examples/script/context2d/scripts/pong.js new file mode 100644 index 0000000..2bff053 --- /dev/null +++ b/examples/script/context2d/scripts/pong.js @@ -0,0 +1,235 @@ +// 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); |