Форум 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=118771)

Xpb7 03.12.2008 14:52

Плавное движение растра
 
Народ. Подскажите как вы боритесь с подергиваниями при необхоимости равномерно перемещать больших и средних размеров растр?
У меня проблема, аналагична этой http://www.flasher.ru/forum/showthre...E2%E0%ED%E8%E5.

Я перепробывал всё, что советовалось в выше приведенном линке.

Только в моем случае, мне нужна создать имитацию скорости, не особо большой. Делаю так, у меня есть псд отдного колышка забора.
Я их размножываю, получая 3 длинных части забора, 2е из которых распологаются на экране, а 3я за ним. Сдвигаю на EnterFtame все 3 части,
и когда 1я скрывается за экраном, перекидваю её за экран вправо, продливая забор, и так по кругу. Так вот, подергивания и как будто мерцания преследуют сие действо.
У меня уже навязчивая идея попробовать BitmapData.scroll().
Посдкажите что-нибудь!

Loshadka 03.12.2008 16:45

Сори. Несколько не по вашему вопросу.
А мерцание происходит при удалении - создании одного из кусков забора?

Xpb7 03.12.2008 18:12

Нет, добавляются они перед анимацией. И дефекты движения, включая,
своеброзное мерцание, скорее даже подергивание, происходят при движении.

Loshadka 03.12.2008 18:16

Насколько я понимаю - тут решили эту проблему: http://tmgame.mail.ru/
Вы бы кусочек маленький исходников выложили, где имменно происходит "передергивание".

Xpb7 03.12.2008 19:36

Там и при меньших скоростях дергается..
В общем, кончено, наименьшее подергивание происходит при работе с Битмапом, ещё вечером попробую
BitmapData.scroll(), хотя думаю разницы не будет.

ZlPredator 03.12.2008 19:57

Лучше избегать небольших скоростей и выравнивать итоговые координаты под целый пиксель. Но если сильно необходимо двигать с очень маленькой скоростью, то нарисуйте все части забора в один Bitmap и двигайте его по дробным частям пикселя. Чтобы забор не съедал много памяти, можно создать только один кусок, а на каждый кадр перерисовывать. В итоге что-то типа:

Код AS3:

class Zabor extends Shape
{
        private var bgImage:BitmapData;
        private var bgDimension:Rectangle;
 
        public function Zabor(clip:DisplayObject):void
        {
                bgDimension = clip.getRect(null);
                bgImage = new BitmapData(bgDimension.width, bgDimension.height);
                bgImage.draw(clip);
        }
 
        public function redraw(delta:Number,width:Number):void
        {
                graphics.clear();
                var matrix:Matrix = new Matrix();
                matrix.translate(delta % bgDimension.width, 0);
                graphics.beginBitmapFill(bgImage, matrix, true, true);
                graphics.drawRect(width, bgDimension.height);
                graphics.endFill();
        }
}

Такой объект помещаете куда вам надо и вызываете через промежутки меняя delta.

TERRORist 03.12.2008 20:44

Я когда переходил на AS3 тоже заметил этот неприятный глюк.. . По моему мнению происходит он изза того что в AS2 у координат был тип Number и соответственно мы могли двигать на полпикселя объекты, а в AS3 тип - int и мы на полпихеля соответственно не подвинем...

BitmapData.scroll() тоже не поможет так как тоже работает только с целыми значениями смещения

короче полная попа. Единственный совет не забывать включать Smoothing у картинки

aksios 03.12.2008 21:39

Проще не париться и воткнуть зацикленый кусок видео.

ZlPredator 03.12.2008 21:47

Цитата:

Сообщение от TERRORist (Сообщение 781406)
Я когда переходил на AS3 тоже заметил этот неприятный глюк.. . По моему мнению происходит он изза того что в AS2 у координат был тип Number и соответственно мы могли двигать на полпикселя объекты, а в AS3 тип - int и мы на полпихеля соответственно не подвинем...

Не знаю где Вы это заметили, но и в AS3 остался Number и можно выставлять на дробные части пикселя.

Xpb7 03.12.2008 22:20

Цитата:

Сообщение от ZlPredator (Сообщение 781390)
Лучше избегать небольших скоростей и выравнивать итоговые координаты под целый пиксель.

Так в том-то и дело, что скорость не маленькая.
Я сдвигаю по 9 пикселей за кадр, и по целым числам:

Код AS3:

var vSSpeed: Number = 9;
..
this.addEventListener(Event.ENTER_FRAME, moveSurroundings);
...
private function drawSurroundings():void
{
        var sourceBMP:BitmapData = new perilaUp(0, 0);
 
        upBorder1.graphics.beginBitmapFill(sourceBMP);
        upBorder1.graphics.drawRect(0, 0, 1008, 168);
        upBorder1.graphics.endFill();
        addChild(upBorder1);
        upBorder1.y = 17;
        upBorder1.x = 0;
 
        upBorder2.graphics.beginBitmapFill(sourceBMP);
        upBorder2.graphics.drawRect(0, 0, 1008, 168);
        upBorder2.graphics.endFill();
        addChild(upBorder2);
        upBorder2.y = 17;
        upBorder2.x = 1008;
}
 
...
 
private function moveSurroundings(e: Event):void
{
        upBorder1.x -= vSSpeed;
        upBorder2.x -= vSSpeed;
        downBorder1.x -= vSSpeed;
        downBorder2.x -= vSSpeed;
        if (upBorder1.x < -1008) {upBorder1.x +=1008}
        if (upBorder2.x < 0) {upBorder2.x += 1008}
        if (downBorder1.x < -1008) {downBorder1.x +=1008}
        if (downBorder2.x < 0) {downBorder2.x += 1008}                       
}

aksios, это не подходит, скорость будет меняться.

UPD:
ZlPredator, я попробою ваш подход (признаюсь он несколько мне не ясен в силу отстутвия опыта работы с битмапой) и отпишусь, хоть там несколько ошибок, но выглядит очень лаконично!
В общем, подитоживая, должен вам сказать, что оба метода работают с одинакомыми дефектами, только вот возможно ZlPredator-а метод меньше кушает памяти.. Не проверял, но резултат не впечатлил.


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

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