examples/script/context2d/scripts/pong.js
changeset 0 1918ee327afb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/script/context2d/scripts/pong.js	Mon Jan 11 14:00:40 2010 +0000
@@ -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);