PDA

Просмотр полной версии : Притормаживание на поворотах.


Bорон
26.09.2007, 12:25
Доброго времени суток.


Возникла проблема - персонаж при резком повороте в любом направлении (резкой смене нажатых клавиш курсора) замирает на пару секунд неподвижно.
Не могу понять чем это вызвано.
Подскажите пожалуста...

персонаж.
http://nightfolk.net/work/mu/index.html


_root.rabbit.meta = {
direct:'stop_right',
x_pos:_root.rabbit._x,
y_pos:_root.rabbit._y,
move_pointer:null
}
_root.v_dir=0;
_global.step_delay=41;
_global.step_size=4;
_root.rabbit.avatar.gotoAndStop(_root.rabbit.meta.direct);

function move_up(){
if(_root.rabbit._y<60){
return;
}
_root.rabbit.meta.y_pos-=_global.step_size;
_root.rabbit._y = _root.rabbit.meta.y_pos;
}

function move_down(){
if(_root.rabbit._y>490){
return;
}
_root.rabbit.meta.y_pos+=_global.step_size;
_root.rabbit._y = _root.rabbit.meta.y_pos;
}

function move_left(){
if(_root.rabbit._x<20){
return;
}
_root.rabbit.meta.x_pos-=_global.step_size;
_root.rabbit._x = _root.rabbit.meta.x_pos;
}

function move_right(){
if(_root.rabbit._x>480){
return;
}
_root.rabbit.meta.x_pos+=_global.step_size;
_root.rabbit._x = _root.rabbit.meta.x_pos;
}

stop();

_root.keyListener = new Object();
_root.keyListener.onKeyUp = function() {
_root.v_dir--;
if(_root.v_dir>0){
return;
}
clearInterval(_root.rabbit.meta.move_pointer);
_root.rabbit.meta.move_pointer=null;
switch(_root.rabbit.meta.direct){
case 'move_up':
_root.rabbit.meta.direct = 'stop_up';
break;
case 'move_left':
_root.rabbit.meta.direct = 'stop_left';
break;
case 'move_right':
_root.rabbit.meta.direct = 'stop_right';
break;
case 'move_down':
_root.rabbit.meta.direct = 'stop_down';
break;
}
_root.rabbit.avatar.gotoAndStop(_root.rabbit.meta.direct);
}
_root.keyListener.onKeyDown = function() {
if(Key.isDown(Key.UP)){
if(_root.rabbit.meta.direct == 'move_up'){
return;
}
_root.v_dir++;
if(_root.rabbit.meta.direct.indexOf('stop')==-1){
clearInterval(_root.rabbit.meta.move_pointer);
_root.rabbit.meta.move_pointer=null;
}
_root.rabbit.meta.direct = 'move_up';
_root.rabbit.avatar.gotoAndStop(_root.rabbit.meta.direct);
if(_root.rabbit.meta.move_pointer==null){
_root.rabbit.meta.move_pointer = setInterval(move_up,_global.step_delay);
}
return;
}
if(Key.isDown(Key.DOWN)){
if(_root.rabbit.meta.direct == 'move_down'){
return;
}
_root.v_dir++;
if(_root.rabbit.meta.direct.indexOf('stop')==-1){
clearInterval(_root.rabbit.meta.move_pointer);
_root.rabbit.meta.move_pointer=null;
}
_root.rabbit.meta.direct = 'move_down';
_root.rabbit.avatar.gotoAndStop(_root.rabbit.meta.direct);
if(_root.rabbit.meta.move_pointer==null){
_root.rabbit.meta.move_pointer = setInterval(move_down,_global.step_delay);
}
return;
}
if(Key.isDown(Key.LEFT)){
if(_root.rabbit.meta.direct == 'move_left'){
return;
}
_root.v_dir++;
if(_root.rabbit.meta.direct.indexOf('stop')==-1){
clearInterval(_root.rabbit.meta.move_pointer);
_root.rabbit.meta.move_pointer=null;
}
_root.rabbit.meta.direct = 'move_left';
_root.rabbit.avatar.gotoAndStop(_root.rabbit.meta.direct);
if(_root.rabbit.meta.move_pointer==null){
_root.rabbit.meta.move_pointer = setInterval(move_left,_global.step_delay);
}
return;
}
if(Key.isDown(Key.RIGHT)){
if(_root.rabbit.meta.direct == 'move_right'){
return;
}
_root.v_dir++;
if(_root.rabbit.meta.direct.indexOf('stop')==-1){
clearInterval(_root.rabbit.meta.move_pointer);
_root.rabbit.meta.move_pointer=null;
}
_root.rabbit.meta.direct = 'move_right';
_root.rabbit.avatar.gotoAndStop(_root.rabbit.meta.direct);
if(_root.rabbit.meta.move_pointer==null){
_root.rabbit.meta.move_pointer = setInterval(move_right,_global.step_delay);
}
return;
}
}
Key.addListener(_root.keyListener);

Очень надеюсь на вашу помощь. С уважением. Ворон.

Mnilionic
26.09.2007, 16:02
У меня ничего не замирает.Отлично скользит как на коньках.
Единственное, сначала он сам ползал безостановки (кнопками можно было направление задавать), а потом он остановился и ползать начинал только при нажатых кнопках.

А вообще скрипт надо сократить раза в 2-3 тогда и работать будет надёжней

Fernando Costa
26.09.2007, 16:09
иногда в очень редких случаях таки замирает. Попробуй организовать на кейдаун обычный кейз с брейками, без ифоф и ретурнов как у тебя, может помогет

Bорон
26.09.2007, 16:42
2Fernando Costa:
Спасибо, попробую.
Хотя чуствую пятой точкой - не в ifах дело.
Я что то забыл...

Mnilionic
26.09.2007, 21:11
при нажатии кнопки Вы проверяете не была ли она нажата ранее путям сравнения строк для каждого из направлений:

if(_root.rabbit.meta.direct == 'move_up'){}

фишка в том, что пока я жму кнопку "вверх" всё работает.
Но если я неотпуская нажму "влево", то direct меняется!!!
А поскольку я попрежденму жму "вверх" (я её не отпускал), то выше приведёное условие не сробатывает.

учитесь оптимизировать одинакове части кода.
К примеру функции move_up(), move_left() и тд можно заменить одной применив несложную систему:

// границы скольжения крлика
var box = new Array();
box["y_min"] = 60;
box["y_max"] = 490;
box["x_min"] = 20;
box["x_max"] = 480;

// функция движения
function move_to(axis:String, direct:Number) {
if(rabbit["_"+axis] < box[axis+"_min"] || rabbit["_"+axis] > box[axis+"_max"]) return;
rabbit.meta[axis+"_pos"] += step_size * direct;
rabbit["_"+axis] = rabbit.meta[axis+"_pos"]
}
/* при нажати на соответсвующую кнопку запускаешь функцию с параметрами:
* ось движения ("x" или "y") и направления (+1 или -1)
* например вверх: move_to("y", -1)
* вправо: move_to("x", +1)
*/

Bорон
27.09.2007, 00:52
Спасибо большое за ликбез.
Замечательное решение!
Сейчас буду переписывать.