142 lines
2.9 KiB
JavaScript
142 lines
2.9 KiB
JavaScript
var controllerTypes = [
|
|
"desktop",
|
|
"mobile",
|
|
"console"
|
|
];
|
|
|
|
class Controller {
|
|
constructor (type, options = {}) {
|
|
if (controllerTypes.indexOf(type) < 0) return new Error(
|
|
"Controller type must be \"desktop\", \"mobile\" or \"console\". "
|
|
);
|
|
this.type = type;
|
|
|
|
this.mappings = {};
|
|
this.actions = {};
|
|
|
|
switch (this.type) {
|
|
case "desktop":
|
|
if (options.domElement) {
|
|
this.domElement = options.domElement;
|
|
} else {
|
|
this.domElement = document.querySelector(":root");
|
|
}
|
|
break;
|
|
case "mobile":
|
|
if (options.domElements) {
|
|
this.domElements = options.domElements;
|
|
} else {
|
|
this.domElements = {
|
|
"main": document.querySelector(":root")
|
|
};
|
|
}
|
|
break;
|
|
case "console":
|
|
if (!options.gamepad) return new Error("A gamepad object must be passed. ");
|
|
this.gamepad = options.gamepad;
|
|
break;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
registerMapping (mapping, action) {
|
|
this.mappings[mapping] = action;
|
|
}
|
|
registerAction (action, callback) {
|
|
this.actions[action] = callback;
|
|
}
|
|
unregisterMapping (mapping) {
|
|
delete this.mappings[mapping];
|
|
}
|
|
unregisterAction (action) {
|
|
delete this.actions[action];
|
|
}
|
|
grab () {
|
|
switch (this.type) {
|
|
case "desktop":
|
|
this.domElement.requestPointerLock();
|
|
|
|
this.domElement.onkeyup = this.domElement.onkeydown = processKeyEvent.bind(this);
|
|
|
|
this.domElement.onmousemove = this.domElement.onmousedown = this.domElement.onmouseup = processMouseEvent.bind(this);
|
|
break;
|
|
default:
|
|
|
|
}
|
|
}
|
|
release () {
|
|
switch (this.type) {
|
|
case "desktop":
|
|
document.exitPointerLock();
|
|
|
|
this.domElement.onkeyup = this.domElement.onkeydown = null;
|
|
|
|
this.domElement.onmousemove = null;
|
|
this.domElement.onmousedown = this.domElement.onmouseup = null;
|
|
break;
|
|
default:
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
var processKeyEvent = function (event) {
|
|
var mapping = this.mappings[event.code];
|
|
if (!mapping) return;
|
|
|
|
let eventType;
|
|
|
|
switch (event.type) {
|
|
case "keydown":
|
|
eventType = "down";
|
|
break;
|
|
case "keyup":
|
|
eventType = "up";
|
|
break;
|
|
default:
|
|
|
|
}
|
|
|
|
var action = this.actions[mapping];
|
|
if (typeof action == "function") action(eventType);
|
|
};
|
|
|
|
var processMouseEvent = function (event) {
|
|
let eventType;
|
|
let mappingName;
|
|
let movement;
|
|
|
|
switch (eventType) {
|
|
case "mousedown":
|
|
eventType = "down";
|
|
mappingName = "MouseDown" + event.which;
|
|
break;
|
|
case "mousemove":
|
|
eventType = "move";
|
|
mappingName = "MouseMove";
|
|
|
|
movement = [event.movementX, event.movementY];
|
|
break;
|
|
case "mouseup":
|
|
eventType = "up";
|
|
mappingName = "MouseUp" + event.which;
|
|
break;
|
|
default:
|
|
|
|
}
|
|
|
|
var mapping = this.mappings[mappingName];
|
|
if (!mapping) return;
|
|
|
|
var action = this.actions[mapping];
|
|
if (typeof action == "function") action(((eventType == "move") ? movement : eventType));
|
|
};
|
|
|
|
module.exports = {
|
|
"Controller": Controller
|
|
};
|
|
|
|
global.core.on("pre-init", function () {
|
|
global.core.emit("input-init");
|
|
});
|