29 July 2016 19:16
Hello:
I'm trying to implement a first person character movement so far I've been able to make the mouse rotation and the chamera vertical rotation and the movement with the keyboard wasd, but, the movement (w-forward, s-backwards, a-strafe-left and d-strafe-right) has a problem. It doesn't do the diagonal movement aka forward-left or forward-right, you know? The code in the movement function is:
Is this a good way to do it? Well, it doesn't cause it doesn't work the way I thought. But could it be a better way to do it? Maybe implementing two different functions for walk and strafe would work?
Any suggestion is welcome
I'm trying to implement a first person character movement so far I've been able to make the mouse rotation and the chamera vertical rotation and the movement with the keyboard wasd, but, the movement (w-forward, s-backwards, a-strafe-left and d-strafe-right) has a problem. It doesn't do the diagonal movement aka forward-left or forward-right, you know? The code in the movement function is:
function setup_movement() {
var key_w = m_ctl.create_keyboard_sensor(m_ctl.KEY_W);
var key_s = m_ctl.create_keyboard_sensor(m_ctl.KEY_S);
var key_a = m_ctl.create_keyboard_sensor(m_ctl.KEY_A);
var key_d = m_ctl.create_keyboard_sensor(m_ctl.KEY_D);
var key_up = m_ctl.create_keyboard_sensor(m_ctl.KEY_UP);
var key_down = m_ctl.create_keyboard_sensor(m_ctl.KEY_DOWN);
var move_array = [
key_w, key_up,
key_s, key_down,
key_a, key_d
];
var forward_logic = function(s){return (s[0] || s[1])};
var backward_logic = function(s){return (s[2] || s[3])};
var strafe_left_logic = function(s){return (s[4])};
var strafe_right_logic = function(s){return (s[5])};
function move_cb(obj, id, pulse) {
if (pulse == 1) {
if(id=="FORWARD") {
var move_dir = 1;
// m_anim.apply(_character_rig, "character_run");
}
if(id=="BACKWARD") {
var move_dir = -1;
}
// m_anim.apply(_character_rig, "character_run");
if(id=="STRAFE_LEFT") {
var strafe_dir = 1;
}
// m_anim.apply(_character_rig, "character_run");
if(id=="STRAFE_RIGHT") {
var strafe_dir = -1;
}
// m_anim.apply(_character_rig, "character_run");
} else {
var move_dir = 0;
var strafe_dir = 0;
// m_anim.apply(_character_rig, "character_idle_01");
}
m_phy.set_character_move_dir(obj, move_dir, strafe_dir);
// m_anim.play(_character_rig);
// m_anim.set_behavior(_character_rig, m_anim.AB_CYCLIC);
};
m_ctl.create_sensor_manifold(_character, "FORWARD", m_ctl.CT_TRIGGER,
move_array, forward_logic, move_cb);
m_ctl.create_sensor_manifold(_character, "BACKWARD", m_ctl.CT_TRIGGER,
move_array, backward_logic, move_cb);
m_ctl.create_sensor_manifold(_character, "STRAFE_LEFT", m_ctl.CT_TRIGGER,
move_array, strafe_left_logic, move_cb);
m_ctl.create_sensor_manifold(_character, "STRAFE_RIGHT", m_ctl.CT_TRIGGER,
move_array, strafe_right_logic, move_cb);
}
Is this a good way to do it? Well, it doesn't cause it doesn't work the way I thought. But could it be a better way to do it? Maybe implementing two different functions for walk and strafe would work?
Any suggestion is welcome