Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Дёрганное перемещение по точкам. (http://www.flasher.ru/forum/showthread.php?t=171931)

Parez 27.11.2011 23:12

Дёрганное перемещение по точкам.
 
Сделал старым дедовским способом перемещение по массиву точек. Но на каждой точке объект почему-то подтормаживается и движение получается дёрганым. Проверял FPS, всё норм.

Вот собственно функция перемещения (по событию ENTER_FRAME):
Код AS3:

private function moveMonster(event:Event):void
{
        if(distToCurPt() > thres)
        {
                this.x += xVel;
                this.y += yVel;
        }
        else
        {
                if(tgPoint < pathArray.length-1)
                {
                        tgPoint+=1;
                        var dir:Number = Math.atan2(pathArray[tgPoint].y - this.y,pathArray[tgPoint].x - this.x);
 
                        xVel = Math.cos(dir)*speed;
                        yVel = Math.sin(dir)*speed;
                        this.rotation = dir/Math.PI*180;
                }
                else
                {
                        removeEventListener(Event.ENTER_FRAME, moveMonster);
                }
        }
}

Вот то, как это выглядит: http://megaswf.com/serve/1377010
В чём может быть причина?

Dukobpa3 28.11.2011 00:14

Код AS3:

if(distToCurPt() > thres)

Что это такое?
Такое впечатление что она двигается не каждый кадр, а через один-два кадра. (чтобы понять нужно увидеть процедуру distToCurPt() )

Если это действительно так то нужно пересмотреть логику так чтобы объект двигался каждый кадр в любом случае, а вот расстояние варьировалось при надобности.

Добавлено через 49 секунд
Или точек добавить.

Parez 28.11.2011 00:23

Вот функция distToCurPt (вычисляет расстояние от текущего положения до целевой точки):
Код AS3:

private function distToCurPt():Number
{
        var dist:Number = Point.distance(new Point(this.x,this.y),pathArray[tgPoint]);
        return dist;
}

thres - погрешность. То есть скорость/2.

Цитата:

Или точек добавить.
Если добавить точек, всё будет выглядеть ещё печальнее...

И да, если попробовать нарисовать просто длинную прямую линию, движение будет гладким. Торможение происходит только на поворотах...

Dukobpa3 28.11.2011 00:28

Цитата:

Торможение происходит только на поворотах...
Это потому что у вас происходит выбор: ИЛИ движение ИЛИ поворот.
Следует не разделять это а делать одновременно. Потому что там где есть поворот не происходит движение и объект затормаживает для того чтобы повернуться.

Но погрешности появятся я думаю. Он углы срезать начнет и в таком духе, но думаю это не критично.

Parez 28.11.2011 00:44

О, спасибо большое. Я как-то об этом даже не подумал. Дописал две строчки:

Код AS3:

private function moveMonster(event:Event):void
{
        if(distToCurPt() > thres)
        {
                this.x += xVel;
                this.y += yVel;
        }
        else
        {
                if(tgPoint < pathArray.length-1)
                {
                        tgPoint+=1;
                        var dir:Number = Math.atan2(pathArray[tgPoint].y - this.y,pathArray[tgPoint].x - this.x);
 
                        xVel = Math.cos(dir)*speed;
                        yVel = Math.sin(dir)*speed;
                        this.rotation = dir/Math.PI*180;
 
                        //Вот эти заветные 2 строчки:
                        this.x += xVel;
                        this.y += yVel;
                }
                else
                {
                        removeEventListener(Event.ENTER_FRAME, moveMonster);
                }
        }
}

И теперь без всяких тормозов, да и углы не срезает, т.к. перемещение происходит уже после изменения направления)

Dukobpa3 28.11.2011 00:50

Убери верхнее условие вообще. Оно никакого функционала не несет теперь.

Parez 28.11.2011 01:03

Не скажите... Можно разве что изменить немного структуру if/then/else, но суть от этого не изменится.
Код AS3:

private function moveMonster(event:Event):void
{
        if(distToCurPt() < thres)
        {
                if(tgPoint < pathArray.length-1)
                {
                        tgPoint+=1;
                        var dir:Number = Math.atan2(pathArray[tgPoint].y - this.y,pathArray[tgPoint].x - this.x);
 
                        xVel = Math.cos(dir)*speed;
                        yVel = Math.sin(dir)*speed;
                        this.rotation = dir/Math.PI*180;
 
                }
                else
                {
                        removeEventListener(Event.ENTER_FRAME, moveMonster);
                }
        }
        this.x += xVel;
        this.y += yVel;
}

Вы это имели в виду?

Dukobpa3 28.11.2011 01:17

примерно так


Часовой пояс GMT +4, время: 07:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.