# snake like manifold logic

17 September 2016 00:35
I'm back in my calback adventures !
I am using manfold sensor inspired by petigor tutorials to control a cube.

```function setup_direction(){
var head = m_scenes.get_object_by_name("Cube");

var key_up     = m_ctl.create_keyboard_sensor(m_ctl.KEY_T);
var key_down   = m_ctl.create_keyboard_sensor(m_ctl.KEY_G);
var key_right    = m_ctl.create_keyboard_sensor(m_ctl.KEY_H);
var key_left   = m_ctl.create_keyboard_sensor(m_ctl.KEY_F);

var direction_array = [
key_up, key_down, key_right, key_left
];

var up_logic = function(s){return (s[0])};
var down_logic = function(s){return (s[1])};
var right_logic = function(s){return (s[2])};
var left_logic = function(s){return (s[3])};

function moveHead_cb(obj, id, pulse, param){
if (pulse == 1){
console.log(id, param);
var head_pos = m_trans.get_translation(obj);
}
else{
console.log("no pulse");
}
};

direction_array, up_logic, moveHead_cb, [2,-1]);
direction_array, down_logic, moveHead_cb, [2,1]);
direction_array, right_logic, moveHead_cb, [0,1]);
direction_array, left_logic, moveHead_cb, [0,-1]);
}
});
```

after that i added a js callback in a node setup to get a function called every second. Because the snake only moves or chanes direction every Xmillisecond

```function setup_direction(){
m_logic_nodes.append_custom_callback("SNAKEMOVE", snakemove);
var head = m_scenes.get_object_by_name("Cube");
var direction = []

var key_up     = m_ctl.create_keyboard_sensor(m_ctl.KEY_T);
var key_down   = m_ctl.create_keyboard_sensor(m_ctl.KEY_G);
var key_right    = m_ctl.create_keyboard_sensor(m_ctl.KEY_H);
var key_left   = m_ctl.create_keyboard_sensor(m_ctl.KEY_F);

var direction_array = [
key_up, key_down, key_right, key_left
];

var up_logic = function(s){return (s[0])};
var down_logic = function(s){return (s[1])};
var right_logic = function(s){return (s[2])};
var left_logic = function(s){return (s[3])};

function moveHead_cb(obj, id, pulse, param){
if (pulse == 1){
console.log(id, param);
var head_pos = m_trans.get_translation(obj);
}
else{
console.log("no pulse");
}
};

function setDirection_cb(obj, id, pulse, param){
//getdirection = getdirection();
console.log(param)//, getdirection);

}
// function getdirection(){
//     return true;
// }

direction_array, up_logic, setDirection_cb, [2,-1]);
direction_array, down_logic, setDirection_cb, [2,1]);
direction_array, right_logic, setDirection_cb, [0,1]);
direction_array, left_logic, setDirection_cb, [0,-1]);

function snakemove() {
console.log("move");
}

}
});
```

So… I wonder if i could use the JSCALLBACK to trigger a sensor, a pulse or something so that it could help trigger the movement only when the JSCALLBACK has been called. I would prefer not to use a global variable.

Is you want more precision please ask. I am a bit confused and not sure how to explain expose my question
21 September 2016 11:34
Can the JS callback be used as a pulse ?

I mean that i have this function called every second i would like it to be part of the mannifold logic to stay in the B4W programming style.

I have this delay function in the logic nodes that triggers a JS callback. I think i want to use that function as a promie for the logic part of the manifold logic. That way the movement could be triggered only every second. Snake stlyle.
21 September 2016 18:22
I have this delay function in the logic nodes that triggers a JS callback. I think i want to use that function as a promie for the logic part of the manifold logic. That way the movement could be triggered only every second. Snake stlyle.
Hello!
Sorry for the delay!

I think that JS_Callback is not a good solution for your task, at least not the optimal one.
We'll dig a little into your question and will give some advice
Blend4Web Team - developer
04 October 2016 14:18
I have this delay function in the logic nodes that triggers a JS callback. I think i want to use that function as a promie for the logic part of the manifold logic. That way the movement could be triggered only every second. Snake stlyle.
Hello!
Sorry for such a long delay (we were hard working on the latest release stuff)!

So again I think that JS_Callback is not suitable for your task. You can easily perform per second translation with the help of m_time.set_timeout method and global variable.
Something like this:
```// global vars
var _is_moving = false;
...

function moveHead_cb(obj, id, pulse, param){
if (pulse == 1){
// to prevent accumulation of translation
if (!_is_moving)
per_second_translation(obj, param);
}
else{
console.log("Key unpressed");
}

...

function per_second_translation(obj, param) {
_is_moving = true;
m_time.set_timeout(function() {
// console.log(id, param);
var head_pos = m_trans.get_translation(obj);

_is_moving = false;
}
, 1000);
}
```

Besides you should use m_ctl.CT_CONTINUOUS manifold control type.

I've attached a simple example project
Blend4Web Team - developer