ollie-controller
Version:
A tool to control Ollie from your computer
271 lines (257 loc) • 6.06 kB
JavaScript
var registerCommonKeys = require('./registerCommonKeys');
var keyboardGUIUpdateAction = require('./gui/keyboardGUIUpdateAction');
module.exports = function(ollie, config, $) {
var keys = {
w:{},
a:{},
s:{},
d:{},
UP:{},
DOWN:{},
RIGHT:{},
LEFT:{},
tab:{},
shift:{},
space:{},
}
var movement = {heading:0, speed:0, speedSlowDownIntervalId: []};
movement.speedSlowDownMethod = function() {
movement.speed--;
if (movement.speed < 0) {
movement.speed = 0;
}
}
var runner = function() {
registerCommonKeys(config, $);
$(document).keydown(function(event) {
switch(event.keyCode) {
case 87:
//w
keys.w.ticked = true;
break;
case 65:
//a
keys.a.ticked = true;
break;
case 83:
//s
keys.s.ticked = true;
break;
case 68:
//d
keys.d.ticked = true;
break;
case 38:
//UP
keys.UP.ticked = true;
break;
case 37:
//LEFT
keys.LEFT.ticked = true;
break;
case 40:
//DOWN
keys.DOWN.ticked = true;
break;
case 39:
//RIGHT
keys.RIGHT.ticked = true;
break;
case 16:
//shift
keys.shift.ticked = true;
break;
}
});
$(document).keyup(function(event) {
switch(event.keyCode) {
case 87:
//w
keys.w.ticked = false;
keys.w.newKeyUp = true;
break;
case 65:
//a
keys.a.ticked = false;
break;
case 83:
//s
keys.s.ticked = false;
break;
case 68:
//d
keys.d.ticked = false;
break;
case 38:
//UP
keys.UP.ticked = false;
keys.UP.newKeyUp = true;
break;
case 37:
//LEFT
keys.LEFT.ticked = false;
keys.LEFT.newKeyUp = true;
break;
case 40:
//DOWN
keys.DOWN.ticked = false;
keys.DOWN.newKeyUp = true;
break;
case 39:
//RIGHT
keys.RIGHT.ticked = false;
keys.RIGHT.newKeyUp = true;
break;
case 16:
//shift
keys.shift.ticked = false;
break;
}
});
}
var intervalFunction = function() {
if (keys.w.ticked) {
if (movement.speedSlowDownIntervalId[0]) {
for (var i = movement.speedSlowDownIntervalId.length - 1; i >= 0; i--) {
clearInterval(movement.speedSlowDownIntervalId[i]);
movement.speedSlowDownIntervalId.pop();
};
}
if (movement.speed < 50) { // fast accel
movement.speed += 7;
} else {
movement.speed += 5;
}
if (movement.speed > config.sp) {
movement.speed = config.sp;
};
} else if (keys.w.newKeyUp) {
keys.w.newKeyUp = false;
if (movement.speedSlowDownIntervalId[0]) { // get rid of the intervals who bypassed somehow ticked before adding new ones
for (var i = movement.speedSlowDownIntervalId.length - 1; i >= 0; i--) {
clearInterval(movement.speedSlowDownIntervalId[i]);
movement.speedSlowDownIntervalId.pop();
};
}
movement.speedSlowDownIntervalId[movement.speedSlowDownIntervalId.length] = setTimeout(function() { // wait a while before making the speed fall
movement.speedSlowDownIntervalId[movement.speedSlowDownIntervalId.length] = setInterval(movement.speedSlowDownMethod, 100);
},2000);
}
if (keys.d.ticked) {
movement.heading+= 10;
if (movement.heading > 360) {
movement.heading = 10;
};
}
if (keys.s.ticked) {
movement.speed-= 10;
if (movement.speed < 0) {
movement.speed = 0;
};
}
if (keys.a.ticked) {
movement.heading-= 10;
if (movement.heading < 0) {
movement.heading = 350;
};
}
var f = -1; // winkel emulation
if (keys.UP.ticked) {
f = 0;
}
if (keys.DOWN.ticked) {
f = 180;
}
if (keys.UP.ticked || keys.DOWN.ticked) {
if (keys.UP.ticked) {
if (keys.RIGHT.ticked) {
f += 45;
}
if (keys.LEFT.ticked) {
f -= 45;
}
} else {
if (keys.RIGHT.ticked) {
f -= 45;
}
if (keys.LEFT.ticked) {
f += 45;
}
}
} else {
if (keys.RIGHT.ticked) {
f += 90;
}
if (keys.LEFT.ticked) {
f -= 90;
}
}
// f manipulation and simplification
if (f < 0) {
f = 360+f;
}
f = Math.round(f/45);
movement.lm = 'Off', movement.rm = 'Off', movement.lp = 255, movement.rp = 255;
if ( !(keys.DOWN.ticked || keys.UP.ticked || keys.RIGHT.ticked || keys.LEFT.ticked || ( keys.DOWN.newKeyUp || keys.UP.newKeyUp || keys.RIGHT.newKeyUp || keys.LEFT.newKeyUp )) ) { // returns false if one of them is ticked
if (keys.w.ticked || keys.a.ticked || keys.s.ticked || keys.d.ticked || (movement.speed > 0)) {
ollie.roll(movement.speed, movement.heading, config.mode);
}
} else {
keys.DOWN.newKeyUp = keys.UP.newKeyUp = keys.RIGHT.newKeyUp = keys.LEFT.newKeyUp = false;
switch(f){
case 0:
movement.lm = 'Forward';
movement.rm = 'Forward';
break;
case 1:
movement.lm = 'Reverse';
movement.rm = 'Forward';
movement.lp = Math.floor(movement.lp / 2);
break;
case 2:
movement.lm = 'Reverse';
movement.rm = 'Forward';
break;
case 3:
movement.lm = 'Reverse';
movement.rm = 'Forward';
movement.rp = Math.floor(movement.rp / 2);
break;
case 4:
movement.lm = 'Reverse';
movement.rm = 'Reverse';
break;
case 5:
movement.lm = 'Forward';
movement.rm = 'Reverse';
movement.lp = Math.floor(movement.lp / 2);
break;
case 6:
movement.lm = 'Forward';
movement.rm = 'Reverse';
break;
case 7:
movement.lm = 'Forward';
movement.rm = 'Reverse';
movement.rp = Math.floor(movement.rp / 2);
break;
case 8:
movement.lm = 'Break';
movement.rm = 'Break';
break;
}
ollie.setRawMotorValues(movement.lm,movement.lp,movement.rm,movement.rp);
}
keyboardGUIUpdateAction(movement.speed, movement.heading);
}
var ret = function() {
this.runMe = function(){
runner();
this.interval = setInterval(intervalFunction,30);
}
this.clearMe = function() {
clearInterval(this.interval);
}
}
return new ret();
}