|
//-----------------------------------------------------------------------------
/**来自鼠标和触摸屏处理输入数据的静态类
* The static class that handles input data from the mouse and touchscreen.
*
* @class TouchInput
*/
function TouchInput() {
throw new Error('This is a static class');
}
/**初始化触摸系统
* Initializes the touch system.
*
* @static
* @method initialize
*/
TouchInput.initialize = function() {
this.clear();
this._setupEventHandlers();
};
/**在帧中的伪键重复的等待时间
* The wait time of the pseudo key repeat in frames.
*
* @static
* @property keyRepeatWait
* @type Number
*/
TouchInput.keyRepeatWait = 24;
/**在帧中的伪键重复的间隔时间。
* The interval of the pseudo key repeat in frames.
*
* @static
* @property keyRepeatInterval
* @type Number
*/
TouchInput.keyRepeatInterval = 6;
/**清除所有的触摸数据。
* Clears all the touch data.
*
* @static
* @method clear
*/
TouchInput.clear = function() {
this._mousePressed = false;
this._screenPressed = false;
this._pressedTime = 0;
this._events = {};
this._events.triggered = false;
this._events.cancelled = false;
this._events.moved = false;
this._events.released = false;
this._events.wheelX = 0;
this._events.wheelY = 0;
this._triggered = false;
this._cancelled = false;
this._moved = false;
this._released = false;
this._wheelX = 0;
this._wheelY = 0;
this._x = 0;
this._y = 0;
this._date = 0;
};
/**更新触摸数据
* Updates the touch data.
*
* @static
* @method update
*/
TouchInput.update = function() {
this._triggered = this._events.triggered;
this._cancelled = this._events.cancelled;
this._moved = this._events.moved;
this._released = this._events.released;
this._wheelX = this._events.wheelX;
this._wheelY = this._events.wheelY;
this._events.triggered = false;
this._events.cancelled = false;
this._events.moved = false;
this._events.released = false;
this._events.wheelX = 0;
this._events.wheelY = 0;
if (this.isPressed()) {
this._pressedTime++;
}
};
/**检查鼠标按钮或触摸屏当前是否按下。
* Checks whether the mouse button or touchscreen is currently pressed down.
*
* @static
* @method isPressed
* @return {Boolean} True if the mouse button or touchscreen is pressed
*/
TouchInput.isPressed = function() {
return this._mousePressed || this._screenPressed;
};
/**检查是否鼠标左键或触摸屏刚按下
* Checks whether the left mouse button or touchscreen is just pressed.
*
* @static
* @method isTriggered
* @return {Boolean} True if the mouse button or touchscreen is triggered
*/
TouchInput.isTriggered = function() {
return this._triggered;
};
/**检查是否鼠标左键或触摸屏刚按或者出现一个伪按键重复。
* Checks whether the left mouse button or touchscreen is just pressed
* or a pseudo key repeat occurred.
*
* @static
* @method isRepeated
* @return {Boolean} True if the mouse button or touchscreen is repeated
*/
TouchInput.isRepeated = function() {
return (this.isPressed() &&
(this._triggered ||
(this._pressedTime >= this.keyRepeatWait &&
this._pressedTime % this.keyRepeatInterval === 0)));
};
/**检查鼠标左键或触摸屏是否保持按下
* Checks whether the left mouse button or touchscreen is kept depressed.
*
* @static
* @method isLongPressed
* @return {Boolean} True if the left mouse button or touchscreen is long-pressed
*/
TouchInput.isLongPressed = function() {
return this.isPressed() && this._pressedTime >= this.keyRepeatWait;
};
/**检查是否鼠标右键刚好按下
* Checks whether the right mouse button is just pressed.
*
* @static
* @method isCancelled
* @return {Boolean} True if the right mouse button is just pressed
*/
TouchInput.isCancelled = function() {
return this._cancelled;
};
/**检查鼠标或手指在触摸屏上是否被移动
* Checks whether the mouse or a finger on the touchscreen is moved.
*
* @static
* @method isMoved
* @return {Boolean} True if the mouse or a finger on the touchscreen is moved
*/
TouchInput.isMoved = function() {
return this._moved;
};
/**检查是否鼠标左键或触摸屏被松开
* Checks whether the left mouse button or touchscreen is released.
*
* @static
* @method isReleased
* @return {Boolean} True if the mouse button or touchscreen is released
*/
TouchInput.isReleased = function() {
return this._released;
};
/**[只读]水平滚动量
* [read-only] The horizontal scroll amount.
*
* @static
* @property wheelX
* @type Number
*/
//定义属性
Object.defineProperty(TouchInput, 'wheelX', {
get: function() {
return this._wheelX;
},
configurable: true
});
/**[只读]垂直滚动量
* [read-only] The vertical scroll amount.
*
* @static
* @property wheelY
* @type Number
*/
//定义属性
Object.defineProperty(TouchInput, 'wheelY', {
get: function() {
return this._wheelY;
},
configurable: true
});
/**[只读]最新触摸事件的画布区域的x坐标。
* [read-only] The x coordinate on the canvas area of the latest touch event.
*
* @static
* @property x
* @type Number
*/
//定义属性
Object.defineProperty(TouchInput, 'x', {
get: function() {
return this._x;
},
configurable: true
});
/**[只读]最新触摸事件的画布区域的y坐标。
* [read-only] The y coordinate on the canvas area of the latest touch event.
*
* @static
* @property y
* @type Number
*/
//定义属性
Object.defineProperty(TouchInput, 'y', {
get: function() {
return this._y;
},
configurable: true
});
/**[只读]最后一个输入的时间的毫秒
* [read-only] The time of the last input in milliseconds.
*
* @static
* @property date
* @type Number
*/
//定义属性
Object.defineProperty(TouchInput, 'date', {
get: function() {
return this._date;
},
configurable: true
});
/**安装事件操作者
* @static
* @method _setupEventHandlers
* @private
*/
TouchInput._setupEventHandlers = function() {
document.addEventListener('mousedown', this._onMouseDown.bind(this));
document.addEventListener('mousemove', this._onMouseMove.bind(this));
document.addEventListener('mouseup', this._onMouseUp.bind(this));
document.addEventListener('wheel', this._onWheel.bind(this));
document.addEventListener('touchstart', this._onTouchStart.bind(this));
document.addEventListener('touchmove', this._onTouchMove.bind(this));
document.addEventListener('touchend', this._onTouchEnd.bind(this));
document.addEventListener('touchcancel', this._onTouchCancel.bind(this));
document.addEventListener('pointerdown', this._onPointerDown.bind(this));
};
/**当鼠标按下
* @static
* @method _onMouseDown
* @param {MouseEvent} event
* @private
*/
TouchInput._onMouseDown = function(event) {
if (event.button === 0) {
this._onLeftButtonDown(event);
} else if (event.button === 1) {
this._onMiddleButtonDown(event);
} else if (event.button === 2) {
this._onRightButtonDown(event);
}
};
/**当左键按下
* @static
* @method _onLeftButtonDown
* @param {MouseEvent} event
* @private
*/
TouchInput._onLeftButtonDown = function(event) {
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
if (Graphics.isInsideCanvas(x, y)) {
this._mousePressed = true;
this._pressedTime = 0;
this._onTrigger(x, y);
}
};
/**当中间按下
* @static
* @method _onMiddleButtonDown
* @param {MouseEvent} event
* @private
*/
TouchInput._onMiddleButtonDown = function(event) {
};
/**当右键按下
* @static
* @method _onRightButtonDown
* @param {MouseEvent} event
* @private
*/
TouchInput._onRightButtonDown = function(event) {
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
if (Graphics.isInsideCanvas(x, y)) {
this._onCancel(x, y);
}
};
/**当鼠标移动
* @static
* @method _onMouseMove
* @param {MouseEvent} event
* @private
*/
TouchInput._onMouseMove = function(event) {
if (this._mousePressed) {
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
this._onMove(x, y);
}
};
/**当鼠标抬起
* @static
* @method _onMouseUp
* @param {MouseEvent} event
* @private
*/
TouchInput._onMouseUp = function(event) {
if (event.button === 0) {
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
this._mousePressed = false;
this._onRelease(x, y);
}
};
/**当滚动
* @static
* @method _onWheel
* @param {WheelEvent} event
* @private
*/
TouchInput._onWheel = function(event) {
this._events.wheelX += event.deltaX;
this._events.wheelY += event.deltaY;
event.preventDefault();
};
/**当触摸开始
* @static
* @method _onTouchStart
* @param {TouchEvent} event
* @private
*/
TouchInput._onTouchStart = function(event) {
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var x = Graphics.pageToCanvasX(touch.pageX);
var y = Graphics.pageToCanvasY(touch.pageY);
if (Graphics.isInsideCanvas(x, y)) {
this._screenPressed = true;
this._pressedTime = 0;
if (event.touches.length >= 2) {
this._onCancel(x, y);
} else {
this._onTrigger(x, y);
}
event.preventDefault();
}
}
if (window.cordova || window.navigator.standalone) {
event.preventDefault();
}
};
/**当触摸移动
* @static
* @method _onTouchMove
* @param {TouchEvent} event
* @private
*/
TouchInput._onTouchMove = function(event) {
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var x = Graphics.pageToCanvasX(touch.pageX);
var y = Graphics.pageToCanvasY(touch.pageY);
this._onMove(x, y);
}
};
/**当触摸结束
* @static
* @method _onTouchEnd
* @param {TouchEvent} event
* @private
*/
TouchInput._onTouchEnd = function(event) {
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var x = Graphics.pageToCanvasX(touch.pageX);
var y = Graphics.pageToCanvasY(touch.pageY);
this._screenPressed = false;
this._onRelease(x, y);
}
};
/**当触摸取消
* @static
* @method _onTouchCancel
* @param {TouchEvent} event
* @private
*/
TouchInput._onTouchCancel = function(event) {
this._screenPressed = false;
};
/**当指示物按下
* @static
* @method _onPointerDown
* @param {PointerEvent} event
* @private
*/
TouchInput._onPointerDown = function(event) {
if (event.pointerType === 'touch' && !event.isPrimary) {
var x = Graphics.pageToCanvasX(event.pageX);
var y = Graphics.pageToCanvasY(event.pageY);
if (Graphics.isInsideCanvas(x, y)) {
// For Microsoft Edge
this._onCancel(x, y);
event.preventDefault();
}
}
};
/**当触发
* @static
* @method _onTrigger
* @param {Number} x
* @param {Number} y
* @private
*/
TouchInput._onTrigger = function(x, y) {
this._events.triggered = true;
this._x = x;
this._y = y;
this._date = Date.now();
};
/**当取消
* @static
* @method _onCancel
* @param {Number} x
* @param {Number} y
* @private
*/
TouchInput._onCancel = function(x, y) {
this._events.cancelled = true;
this._x = x;
this._y = y;
};
/**当移动
* @static
* @method _onMove
* @param {Number} x
* @param {Number} y
* @private
*/
TouchInput._onMove = function(x, y) {
this._events.moved = true;
this._x = x;
this._y = y;
};
/**当释放
* @static
* @method _onRelease
* @param {Number} x
* @param {Number} y
* @private
*/
TouchInput._onRelease = function(x, y) {
this._events.released = true;
this._x = x;
this._y = y;
};
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-5-12 18:05
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.