Passa al contingut principal

A Look at HTML5 Canvas Interactivity

A Look at HTML5 Canvas Interactivity:
The HTML5 canvas element allows for developers to implement interactivity and drawing which was previously undoable without the use of a third party program such as flash. In this article we’re going to be tackling the problem of interactivity, and how to accomplish it using HTML5′s canvas tag. You could expand upon this information to make a basic HTML5 game.

Gaming

Games were something which until quite recently couldn’t be accomplished with just HTML and Javascript. With the canvas tag it’s become much more realistic to create a game or some sort of interactive idea with HTML5 rather than Flash which was what was traditionally considered to be the only practical way. To begin, lets take a look at keyboard input in canvas.

Keyboard Input

The canvas tag acts just like any other HTML tag. It has a width, a height and an ID. The content of the canvas tag is what the user sees should canvas be unsupported on their device. I’ve also set a function to run when the body loads, and a little div that contains data on how much you’ve moved the item about. We’re going to be making a cube which you can move around on the document with arrow keys. You could expand upon this further to add many more features.
<body onload="init();">

 <div>
 You've moved horizontally <span id="x" onload="counting(true);">0</span> and vertically <span id="y" onload="counting();">0</span>! <br />Don't leave the box to win! (Use Arrow Keys)
 </div>

 <canvas id="game" width="640" height="500">
 Oh no! Canvas isn't supported by your browser.

 </canvas>

</body>

Javascript

The Javascript is a little more difficult. In Javascript we can see what characters the user presses on their keyboard using e.keyCode. Each character on the keyboard has a predetermined number which you can check for. We’re going to be making a box which moves around, so we’ll concentrate on the arrow keys. To begin, paste this into your Javascript file. It’s just a bunch of variables we’ll be using:
var canvas, draw, width, height; // For drawing the canvas
var downcheck, upcheck, rightcheck, leftcheck; // For checking what direction is clicked

// Curent position
var up = 0;
var down = 0;
var left = 0;
var right = 0;
Next we gotta create the init() function, which will contain some basic information on what to do immediately when the document loads.
// The main function for initiating everything
function init() {

 // Get the canvas by ID
    canvas = document.getElementById('game');

    // Set a height and width for the canvas item
    height = canvas.height;
    width = canvas.width;

    // A variable we'll use to draw the actual item
    draw = canvas.getContext('2d');

 // We want to redraw every 30ms
 setInterval(redraw, 30);

 // When the user presses a key run a function, when the user stops
 // run another function. We'll get to these functions later.
 document.onkeydown = canvasMove;
 document.onkeyup = canvasStop;

}
Since moving rectangles on a canvas can get a little messy (the canvas will just redraw the element again and again without removing it, so you just end up with loads of rectangles), we’re going to be redrawing it every 30 milliseconds. This function is referenced in init().
// Wipe the canvas when we want to move the rectangle, then we can redraw it.
function clear(c) {
    c.clearRect(0, 0, width, height);
}

function redraw() {
 clear(draw);
 draw.fillStyle = 'rgba(0,0,0,0.5)';
 draw.fillRect(left - right , down - up, '100', '100');
}
Next we need to add functionality to move the box around. We want two arrow keys to be able to work in tandem, so we need to do something a little more complex than just an if statement. We set the check variables to true or false depending on what the user presses so we can have two variables true at the same time. This allows us to use multiple keys at once (diagonal movement).
function canvasMove(e) {

   // Check if the up arrow is pressed
   if(e.keyCode == '38') upcheck = true
   // else check if the left arrow is pressed and the up arrow is also true
   else if(e.keyCode == '37' &amp;&amp; upcheck == true) leftcheck = true; // Then set the left arrow to true
   // else check if the right arrow is true, repeat.
   else if(e.keyCode == '39' &amp;&amp; upcheck == true) rightcheck = true;
   // otherwise the up arrow is not being pressed, so it is false
 else upcheck = false; 

   // Repeat for every arrow direction
   if(e.keyCode == '40') downcheck = true;
   else if(e.keyCode == '37' &amp;&amp; downcheck == true) leftcheck = true;
   else if(e.keyCode == '39' &amp;&amp; downcheck == true) rightcheck = true;
   else downcheck = false;

  if(e.keyCode == '37') leftcheck = true;
  else if(e.keyCode == '40' &amp;&amp; leftcheck == true) downcheck = true;
  else if(e.keyCode == '38' &amp;&amp; leftcheck == true) upcheck = true;
  else leftcheck = false;

   if(e.keyCode == &quot;39&quot;) rightcheck = true;
   else if(e.keyCode == '40' &amp;&amp; rightcheck == true) downcheck = true;
   else if(e.keyCode == '38' &amp;&amp; rightcheck == true) upcheck = true;
   else rightcheck = false;

 // If the variables are true, increase the left and right movement accordingly.
 // We also run the counting function, to keep track of total movement.
   if(rightcheck == true) { left += 10; counting() };
   if(leftcheck == true) { right += 10; counting() };
   if(upcheck == true) { up += 10; counting(true) };
   if(downcheck == true) { down += 10; counting(true) };

}
Next we need to check when the user stops pressing the arrows and set the corresponding key checks to false
// When the user stops pressing a key, check which key it is and set it to false
function canvasStop(e) {

 if(e.keyCode == '38') {
  upcheck = false;
 }
 if(e.keyCode == '40') {
  downcheck = false;
 }
 if(e.keyCode == '37') {
  leftcheck = false;
 }
 if(e.keyCode == '39') {
  rightcheck = false;
 }

}
And finally, we have a little function which will do all the counting.
function counting(y) {

 if(y == true) {
  document.getElementById('y').innerHTML = parseInt(document.getElementById('y').innerHTML) + 1;
 }

 else {
  document.getElementById('x').innerHTML = parseInt(document.getElementById('x').innerHTML) + 1;
 }
}
And that’s it! Check out the demo page if you want to see it in action, or download the whole thing. Lets take a look at mouse interactivity first.

Mouse Input

So we’re going to be making a simple drawing application, and it’s surprisingly easy with canvas. As usual, we’ll start by doing some HTML.
<body onload="init();">
<div id="drawingcontainer">
 <div class="text">
  Draw below!
 </div>
 <div id="options">
  <input type="submit" value="1px" onclick="changeSize(1);" />
  <input type="submit" value="2px" onclick="changeSize(2);" />
  <input type="submit" value="3px" onclick="changeSize(3);" />
  <input type="submit" value="5px" onclick="changeSize(5);" />
  <input type="submit" value="10px" onclick="changeSize(10);" />
  <input type="submit" value="15px" onclick="changeSize(20);" />

  <input type="submit" onclick="changeColor('#871de0');" class="purple" value="" />
  <input type="submit" onclick="changeColor('#eb159d');" class="pink" value="" />
  <input type="submit" onclick="changeColor('#c92626');" class="red" value="" />
  <input type="submit" onclick="changeColor('#db551b');" class="orange" value="" />
  <input type="submit" onclick="changeColor('#ddc41e');" class="yellow" value="" />
  <input type="submit" onclick="changeColor('#76b80f');" class="green" value="" />
  <input type="submit" onclick="changeColor('#1974b4');" class="blue" value="" />
  <input type="submit" onclick="changeColor('#000');" class="black" value="" />
  <input type="submit" onclick="changeColor('#FFF');" class="white" value="" />
 </div>

 <canvas width="690" height="500" id="drawing">
 Your browser doesn't support canvas
 </canvas>
</div>

</body>
Next lets define some simple variables, and run the initial init() function.
var canvas, draw;

var started = false;
var x, y;

function init() {

 // Get the drawing canvas
 canvas = document.getElementById('drawing');
 context = canvas.getContext('2d');

 // Add some event listeners so we can figure out what's happening
 // and run a few functions when they are executed.
 canvas.addEventListener('mousemove', mousemovement, false);
 canvas.addEventListener('mousedown', mouseclick, false);
 canvas.addEventListener('mouseup', mouseunclick, false);

}
Next we run some simple functions that will happen when the user clicks, moves while clicking, and unclicks. All they do is track the mouse position and draw a line where appropriate.
function mouseclick() {
 // When the mouse is clicked. Change started to true and move
 // the initial position to the position of the mouse
 context.beginPath();
 context.moveTo(x, y);
 started = true;

}
// For getting the mouse position, basically. This gets the position
// of the canvas element, so we can use it to calculate the mouse
// position on the canvas
function getOffset(e) {
    var cx = 0;
    var cy = 0;

    while(e && !isNaN(e.offsetLeft) && !isNaN(e.offsetTop)) {
        cx += e.offsetLeft - e.scrollLeft;
        cy += e.offsetTop - e.scrollTop;
        e = e.offsetParent;
    }
    return { top: cy, left: cx };
}

function mousemovement(e) {

 // Get mouse position

 if(e.offsetX || e.offsetY) {
  x = e.pageX - getOffset(document.getElementById('drawing')).left - window.pageXOffset;
  y = e.pageY - getOffset(document.getElementById('drawing')).top - window.pageYOffset;
 }
 else if(e.layerX || e.layerY) {
  x = (e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft)
  - getOffset(document.getElementById('drawing')).left - window.pageXOffset;
  y = (e.clientY + document.body.scrollTop + document.documentElement.scrollTop)
  - getOffset(document.getElementById('drawing')).top;
 } 

 // If started is true, then draw a line
 if(started) {
  contextMouse.lineTo(x, y);
  contextMouse.stroke();

 }

}

function mouseunclick() {
 // Change started to false when the user unclicks the mouse
 if(started) {
  started = false;
 }

}
Finally we just have to run two extra functions for changing the colour and size of the line.
// Change size
function changeSize(s) {
 context.lineWidth = s;
}

// Change color
function changeColor(c) {
 context.strokeStyle = c;
}
And that’s it! To finish off lets just add a little CSS:
body {
 margin: 0;
 padding:  0;
 background: url('background.gif');
 font-family: Arial, Helvetica, sans-serif;
}

canvas {
 box-shadow: 0px 0px 30px rgba(0,0,0,0.3);
 float: left;
 border-radius: 6px;
 display: block;
}

div {
 font-family: 'Droid Sans', Helvetica, Arial, sans-serif;
 font-size: 30px;
 padding: 15px;
 line-height: 30px;
}

#options {
 float: left;
}

h3 {
 float: left;
 margin: 0;
}

div span {
 float: left;
 text-transform: uppercase;
 padding: 0 20px 20px 20px;
 font-size: 14px;
 font-weight: bold;
}

div input {
 float: left;
 display: inline;
}

div input[type=range] {
 position: relative;
 top: 6px;
}

#options input[type=submit] {
 border: 0;
 border-radius: 4px;
 margin-right: 10px;
 width: 35px;
 box-shadow: inset 0px 0px 10px rgba(0,0,0,0.2);
 height: 35px;
 position: relative;
 cursor: pointer;
}

#options input[type=submit]:hover {
 box-shadow: inset 0px 0px 10px rgba(0,0,0,0.5);
}

#options input[type=submit]:active {
 top: 2px;
}

.purple { background: #871de0; }
.pink { background: #eb159d; }
.red { background: #c92626; }
.orange { background: #db551b; }
.yellow { background: #ddc41e; }
.green { background: #76b80f; }
.blue { background: #1974b4; }
.black { background: #000; }
.white { background: #fff; }

#drawingcontainer {
 width: 710px;
 margin: 0px auto;
}
I’ve set up a demo page to try out both of these things. Check out the demo below, or download if you want to play around with the script directly.

Comentaris

Entrades populars d'aquest blog

10 alternativas a Cuevana para ver películas online

10 alternativas a Cuevana para ver películas online : Durante este último tiempo, en Cuevana se sucedieron varios “problemas” por los cuales hubo que ajustar algunas cosas antes de tiempo (como el rediseño del sitio), que dejaron a algunos usuarios ciertos problemas para acceder a las películas o series del portal. Pero realmente esto es algo que no incumbe a los usuarios y, como sabemos, existen muchas otras alternativas a Cuevana dando vueltas por Internet, que intentaremos presentar aquí mismo. Los sitios que repasaremos funcionan del mismo modo que Cuevana, mediante la instalación de un plugin que permite visualizar los videos de Megaupload o WUShare, entre otros servicios, en una calidad de imágen realmente excelente. Tal como sucede con el más popular servicio, todos ellos tienen publicidad que en algunos casos resulta insoportable, pero como dice Federico en DotPod “a caballo regalado no se le miran los dientes”. Alternativas a Cuevana 1. Moviezet Posiblemente el mejor clon d...

Learn Composition from the Photography of Henri Cartier-Bresson

“Do you see it?” This question is a photographic mantra. Myron Barnstone , my mentor, repeats this question every day with the hopes that we do “see it.” This obvious question reminds me that even though I have seen Cartier-Bresson’s prints and read his books, there are major parts of his work which remain hidden from public view. Beneath the surface of perfectly timed snap shots is a design sensibility that is rarely challenged by contemporary photographers. Henri Cartier-Bresson. © Martine Franck Words To Know 1:1.5 Ratio: The 35mm negative measures 36mm x 24mm. Mathematically it can be reduced to a 3:2 ratio. Reduced even further it will be referred to as the 1:1.5 Ratio or the 1.5 Rectangle. Eyes: The frame of an image is created by two vertical lines and two horizontal lines. The intersection of these lines is called an eye. The four corners of a negative can be called the “eyes.” This is extremely important because the diagonals connecting these lines will form the breakdown ...

Más de 50 de las mejores herramientas online para profesores

No es una exageración afirmar que hay ciento de aplicaciones educativas por ahí por la red, para todos los gustos y de todos los colores, por lo que es difícil tratar de recogerlas todas en un listado. Sin embargo, algunas destacan más que otras por su innovación y por su capacidad para conseguir adeptos, y esas son las que protagonizan la presente recopilación. Son 50 interesantes herramientas online basadas en las recopilaciones de EduArea , las muchas ya tratadas en Wwwhat’s new y las destacadas por la experiencia. 1. Dropbox : Un disco duro virtual con varios GB gratuitos y al que se accede desde casi cualquier dispositivo. Sin embargo, es muchísimo más que eso, de hecho ya comentamos 20 razones . 2. Google Drive : La evolución de Google Docs que suma a sus múltiples herramientas de creación de documentos, un considerable espacio virtual gratuito. 3. CloudMagic : Una extensión y una app multidispositivo para buscar información simultáneamente en Gmail, Twitter, Facebook, Evernote ...