<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>pong.js Example File | Qt Script</title> <link rel="stylesheet" type="text/css" href="style/offline-simple.css" /> <script type="text/javascript"> document.getElementsByTagName("link").item(0).setAttribute("href", "style/offline.css"); // loading style sheet breaks anchors that were jumped to before // so force jumping to anchor again setTimeout(function() { var anchor = location.hash; // need to jump to different anchor first (e.g. none) location.hash = "#"; setTimeout(function() { location.hash = anchor; }, 0); }, 0); </script> </head> <body> <div class="header" id="qtdocheader"> <div class="main"> <div class="main-rounded"> <div class="navigationbar"> <table><tr> <td >Qt 5.12</td><td ><a href="qtscript-index.html">Qt Script</a></td><td ><a href="qtscript-script-context2d-example.html">Context2D Example</a></td><td >pong.js Example File</td></tr></table><table class="buildversion"><tr> <td id="buildversion" width="100%" align="right"><a href="qtscript-index.html">Qt 5.12.6 Reference Documentation</a></td> </tr></table> </div> </div> <div class="content"> <div class="line"> <div class="content mainContent"> <div class="sidebar"><div class="sidebar-content" id="sidebar-content"></div></div> <h1 class="title">pong.js Example File</h1> <span class="subtitle">script/context2d/scripts/pong.js</span> <!-- $$$script/context2d/scripts/pong.js-description --> <div class="descr"> <a name="details"></a> <pre class="js"> // 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); </pre> </div> <!-- @@@script/context2d/scripts/pong.js --> </div> </div> </div> </div> </div> <div class="footer"> <p> <acronym title="Copyright">©</acronym> 2019 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners.<br/> The documentation provided herein is licensed under the terms of the <a href="http://www.gnu.org/licenses/fdl.html">GNU Free Documentation License version 1.3</a> as published by the Free Software Foundation.<br/> Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners. </p> </div> </body> </html>