Files
Elliot Smith 27c4b94d38 Be more discriminating when handling touch events
Check the position and type of the touch event to determine
whether acceleration is being applied.

The only issue with this is that if a touch moves from the right
of the screen to the left, if a touchend event occurs in the left
side of the screen, it won't stop the acceleration. But it's a
better solution than counting the number of touches.

Also added a check on touch move events, so that only moves which
occur on the left of the screen are counted as turns. The reason
for this is that in some cases, the touch identifier was being
incorrectly applied: so a touch which started on the left of
the screen could accidentally be continued by a touchmove
occurring on the right of the screen, resulting in a violent right
turn. (It appears as though the touch ID can mistakenly
transfer between touches with different fingers.)

By testing where the touchmove occurs, the violent turn effect
can be removed, as only a finger on the left-hand side of the
screen can cause moves.
2014-05-30 16:16:49 +01:00

189 lines
4.6 KiB
JavaScript

// Generated by CoffeeScript 1.7.1
/*
TouchController (stick + buttons) for touch devices
Based on the touch demo by Seb Lee-Delisle <http://seb.ly/>
@class bkcore.controllers.TouchController
@author Thibaut 'BKcore' Despoulain <http://bkcore.com>
*/
(function() {
var TouchController, Vec2, exports, _base;
TouchController = (function() {
TouchController.isCompatible = function() {
return 'ontouchstart' in document.documentElement;
};
/*
Creates a new TouchController
@param dom DOMElement The element that will listen to touch events
@param stickMargin int The left margin in px for stick detection
@param buttonCallback function Callback for non-stick touches
*/
function TouchController(dom, stickMargin, buttonCallback) {
this.dom = dom;
this.stickMargin = stickMargin != null ? stickMargin : 200;
this.buttonCallback = buttonCallback != null ? buttonCallback : null;
this.active = true;
this.touches = null;
this.stickID = -1;
this.stickPos = new Vec2(0, 0);
this.stickStartPos = new Vec2(0, 0);
this.stickVector = new Vec2(0, 0);
this.dom.addEventListener('touchstart', ((function(_this) {
return function(e) {
return _this.touchStart(e);
};
})(this)), false);
this.dom.addEventListener('touchmove', ((function(_this) {
return function(e) {
return _this.touchMove(e);
};
})(this)), false);
this.dom.addEventListener('touchend', ((function(_this) {
return function(e) {
return _this.touchEnd(e);
};
})(this)), false);
}
/*
@private
*/
TouchController.prototype.touchStart = function(event) {
var touch, _i, _len, _ref;
if (!this.active) {
return;
}
_ref = event.changedTouches;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
touch = _ref[_i];
if (this.stickID < 0 && touch.clientX < this.stickMargin) {
this.stickID = touch.identifier;
this.stickStartPos.set(touch.clientX, touch.clientY);
this.stickPos.copy(this.stickStartPos);
this.stickVector.set(0, 0);
continue;
} else {
if (typeof this.buttonCallback === "function") {
this.buttonCallback(true, touch, event);
}
}
}
this.touches = event.touches;
return false;
};
/*
@private
*/
TouchController.prototype.touchMove = function(event) {
var touch, _i, _len, _ref;
event.preventDefault();
if (!this.active) {
return;
}
_ref = event.changedTouches;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
touch = _ref[_i];
if (this.stickID === touch.identifier && touch.clientX < this.stickMargin) {
this.stickPos.set(touch.clientX, touch.clientY);
this.stickVector.copy(this.stickPos).substract(this.stickStartPos);
break;
}
}
this.touches = event.touches;
return false;
};
/*
@private
*/
TouchController.prototype.touchEnd = function(event) {
var touch, _i, _len, _ref;
if (!this.active) {
return;
}
this.touches = event.touches;
_ref = event.changedTouches;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
touch = _ref[_i];
if (this.stickID === touch.identifier) {
this.stickID = -1;
this.stickVector.set(0, 0);
break;
} else {
if (typeof this.buttonCallback === "function") {
this.buttonCallback(false, touch, event);
}
}
}
return false;
};
return TouchController;
})();
/*
Internal class used for vector2
@class Vec2
@private
*/
Vec2 = (function() {
function Vec2(x, y) {
this.x = x != null ? x : 0;
this.y = y != null ? y : 0;
}
Vec2.prototype.substract = function(vec) {
this.x -= vec.x;
this.y -= vec.y;
return this;
};
Vec2.prototype.copy = function(vec) {
this.x = vec.x;
this.y = vec.y;
return this;
};
Vec2.prototype.set = function(x, y) {
this.x = x;
this.y = y;
return this;
};
return Vec2;
})();
/*
Exports
@package bkcore
*/
exports = exports != null ? exports : this;
exports.bkcore || (exports.bkcore = {});
(_base = exports.bkcore).controllers || (_base.controllers = {});
exports.bkcore.controllers.TouchController = TouchController;
}).call(this);