Firefox/Projects/Multitouch Polish/DOM Events/Examples: Difference between revisions
< Firefox | Projects | Multitouch Polish | DOM Events
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 7: | Line 7: | ||
if (lastused >= 4) return; | if (lastused >= 4) return; | ||
if (assignedFingers[event.streamId]) { | if (assignedFingers[event.streamId]) { | ||
divId = assignedFingers[event.streamId]; | divId = assignedFingers[event.streamId]; | ||
} else { | } else { | ||
divId = "trackingdiv" + (++lastused); | divId = "trackingdiv" + (++lastused); | ||
assignedFingers[event.streamId] = divId; | assignedFingers[event.streamId] = divId; | ||
} | } | ||
document.getElementById(divId).style.left = event.clientX + 'px'; | document.getElementById(divId).style.left = event.clientX + 'px'; | ||
document.getElementById(divId).style.top = event.clientY + 'px'; | document.getElementById(divId).style.top = event.clientY + 'px'; | ||
} | } | ||
document.addEventListener("MozTouchMove", touchMove, false); | document.addEventListener("MozTouchMove", touchMove, false); | ||
| Line 70: | Line 70: | ||
function touchmove(e) { | function touchmove(e) { | ||
var | var img1 = document.getElementById("image1"); | ||
var | var img2 = document.getElementById("image2"); | ||
var diagonal, sidesize; | var diagonal, sidesize; | ||
if (fingerIds[0] == e.streamId) { // finger 1 | if (fingerIds[0] == e.streamId) { // finger 1 | ||
X1 = e.clientX; | |||
Y1 = e.clientY; | |||
} else if (fingerIds[1] == e.streamId) { // finger 2 | } else if (fingerIds[1] == e.streamId) { // finger 2 | ||
diagonal = dist(X1, e.clientX, Y1, e.clientY); | diagonal = dist(X1, e.clientX, Y1, e.clientY); | ||
sidesize = diagonal / Math.sqrt(2); | |||
img1.style.left = ((e.clientX < X1) ? e.clientX : X1) + "px" | |||
img1.style.top = ((e.clientY < Y1) ? e.clientY : Y1) + "px" | |||
img1.style.width = sidesize + "px" | |||
img1.style.height = sidesize + "px" | |||
} else if (fingerIds[2] == e.streamId) { // finger 3 | } else if (fingerIds[2] == e.streamId) { // finger 3 | ||
X2 = e.clientX; | X2 = e.clientX; | ||
Y2 = e.clientY; | |||
} else if (fingerIds[3] == e.streamId) { // finger 4 | } else if (fingerIds[3] == e.streamId) { // finger 4 | ||
diagonal = dist(X2, e.clientX, Y2, e.clientY); | diagonal = dist(X2, e.clientX, Y2, e.clientY); | ||
sidesize = diagonal / Math.sqrt(2); | |||
img2.style.left = ((e.clientX < X2) ? e.clientX : X2) + "px" | |||
img2.style.top = ((e.clientY < Y2) ? e.clientY : Y2) + "px" | |||
img2.style.width = sidesize + "px" | |||
img2.style.height = sidesize + "px" | |||
} | } | ||
}</pre> | |||
== Image crop == | |||
The code for the image crop is just about resizing as well, except that we let a free aspect ratio resize of the div. | |||
<pre>function touchmove(e) { | |||
var t = document.getElementById("cropbox"); | |||
if (fingerIds[0] == e.streamId) { // finger 1 | |||
t.style.left = e.clientX + "px"; | |||
t.style.top = e.clientY + "px"; | |||
X = e.clientX; | |||
Y = e.clientY; | |||
} else if (fingerIds[1] == e.streamId) { // finger 2 | |||
t.style.width = (e.clientX - X) + "px" | |||
t.style.height = (e.clientY - Y) + "px" | |||
} | |||
} | |||
</pre> | |||
== Pong == | |||
Omitting the code for rendering the graphics and the game logic, the part that controls the game pads is really simple: the contact point that is moving on the left side of the game area sets the position for the first player, and the contact point on the right side is the second player | |||
<pre>function touchmove(e) { | |||
if (e.clientX < screen.width / 2) | |||
//we subtract padsize/2 to center the pad on the touch point | |||
player1 = e.clientY - padsize/2; | |||
else | |||
player2 = e.clientY - padsize/2; | |||
}</pre> | }</pre> | ||
Latest revision as of 20:52, 19 August 2009
Tracking divs
var assignedFingers = {};
var lastused = 0;
function touchMove(event) {
var divId;
if (lastused >= 4) return;
if (assignedFingers[event.streamId]) {
divId = assignedFingers[event.streamId];
} else {
divId = "trackingdiv" + (++lastused);
assignedFingers[event.streamId] = divId;
}
document.getElementById(divId).style.left = event.clientX + 'px';
document.getElementById(divId).style.top = event.clientY + 'px';
}
document.addEventListener("MozTouchMove", touchMove, false);
document.addEventListener("MozTouchRelease", function() { lastused--; }, false);
Drawing canvas
var canvasctx = null;
function fadeOut() {
canvasctx.fillStyle = 'rgba(255,255,255,.15)';
canvasctx.fillRect(0,0,1100,600);
}
window.setInterval(fadeOut,180);
function listenTo(event) {
canvasctx.fillStyle='rgba(0,0,0,1)';
canvasctx.beginPath();
canvasctx.arc(event.clientX, event.clientY, 20, 0, Math.PI*2, 1);
canvasctx.fill();
canvasctx.closePath();
}
document.addEventListener("MozTouchMove", listenTo, false);
document.addEventListener("DOMContentLoaded", function() {
canvasctx = document.getElementById("drawingcanvas").getContext('2d');
}, false);
Image resizing
This example keeps the image ratio to a square by calculating the distance between the two fingers and using that as the diagonal size of the image
document.addEventListener("MozTouchDown", touchdown, false);
document.addEventListener("MozTouchRelease", touchrelease, false);
document.addEventListener("MozTouchMove", touchmove, false);
var X1, Y1, X2, Y2;
var fingersTracked = 0;
var fingerIds = [-1,-1,-1,-1];
function touchdown(e) {
if (fingersTracked < 4)
fingerIds[fingersTracked] = e.streamId;
fingersTracked++;
}
function touchrelease(e) {
fingersTracked--;
}
function dist(x1,x2,y1,y2) {
return Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
}
function touchmove(e) {
var img1 = document.getElementById("image1");
var img2 = document.getElementById("image2");
var diagonal, sidesize;
if (fingerIds[0] == e.streamId) { // finger 1
X1 = e.clientX;
Y1 = e.clientY;
} else if (fingerIds[1] == e.streamId) { // finger 2
diagonal = dist(X1, e.clientX, Y1, e.clientY);
sidesize = diagonal / Math.sqrt(2);
img1.style.left = ((e.clientX < X1) ? e.clientX : X1) + "px"
img1.style.top = ((e.clientY < Y1) ? e.clientY : Y1) + "px"
img1.style.width = sidesize + "px"
img1.style.height = sidesize + "px"
} else if (fingerIds[2] == e.streamId) { // finger 3
X2 = e.clientX;
Y2 = e.clientY;
} else if (fingerIds[3] == e.streamId) { // finger 4
diagonal = dist(X2, e.clientX, Y2, e.clientY);
sidesize = diagonal / Math.sqrt(2);
img2.style.left = ((e.clientX < X2) ? e.clientX : X2) + "px"
img2.style.top = ((e.clientY < Y2) ? e.clientY : Y2) + "px"
img2.style.width = sidesize + "px"
img2.style.height = sidesize + "px"
}
}
Image crop
The code for the image crop is just about resizing as well, except that we let a free aspect ratio resize of the div.
function touchmove(e) {
var t = document.getElementById("cropbox");
if (fingerIds[0] == e.streamId) { // finger 1
t.style.left = e.clientX + "px";
t.style.top = e.clientY + "px";
X = e.clientX;
Y = e.clientY;
} else if (fingerIds[1] == e.streamId) { // finger 2
t.style.width = (e.clientX - X) + "px"
t.style.height = (e.clientY - Y) + "px"
}
}
Pong
Omitting the code for rendering the graphics and the game logic, the part that controls the game pads is really simple: the contact point that is moving on the left side of the game area sets the position for the first player, and the contact point on the right side is the second player
function touchmove(e) {
if (e.clientX < screen.width / 2)
//we subtract padsize/2 to center the pad on the touch point
player1 = e.clientY - padsize/2;
else
player2 = e.clientY - padsize/2;
}