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

Anabel 27.06.2014 18:30

Отрисовка картинки при движении
 
В программе есть мувик. Внутри мувика картинка (большущая и тяжелая). Картинкой можно двигать с помощью стрелочек. Когда картинка движется, то сильно трясётся, а так не должно быть. Можно её как-то стабилизировать?

samana 27.06.2014 18:47

Причин может быть несколько, либо в коде (скорее всего), либо в сглаживании у картинки (вряд ли).
Хоть код покажите или исходник с наброском этой проблемы.

Anabel 27.06.2014 18:59

Активируется при событии "нажатая клавиша"
Код AS3:

mapa.x += 1;
mapa.y += 1;

Добавлено через 1 минуту
Сама картинка отображается адекватно и вполне нормально, если не перемещать её. Но она очень большая (4.6 Мб, размер 2000*1600), так что я подозреваю, что
Цитата:

Причин может быть несколько, либо в коде (скорее всего), либо в сглаживании у картинки (вряд ли).

samana 27.06.2014 19:29

Тогда попробуйте со сглаживанием. Его можно "включить" - установив флаг Allow smoothing в настойках вашей картинки в библиотеке (если вы работаете во Flash). Либо с помощью кода, если эту картинку вы создавали динамически
Код AS3:

битмапВашейКартинки.smoothing= true;

Но я почему-то уверен, что проблема в коде движения. Возможно вы двигаете её не по enterFrame, а просто от зажатой клавиши.

Anabel 27.06.2014 19:46

Вроде не так ужасно, но всё равно немного мерехтит изображение. А можно как-то усилить свойство?

samana 27.06.2014 19:53

Пожалуйста, покажите весь код, который относится к движению картинки. Если у вас примерно так
Код AS3:

stage.addEventListener(KeyboardEvent.KEY_DOWN,stage_kd);
function stage_kd(e:KeyboardEvent):void
{
        mc.x+=1;
}

то проблема в коде, а не в сглаживании.

Anabel 27.06.2014 20:22

Код AS3:

// Неизменная величина ускорения.
var _accValue:Number = shvidkist;
 
// Сопротивление окружающей среды, чтобы персонаж остановился.
var _envResistance:Number = 0.9;
 
// Тут будем хранить вектор скорости.
var _velocity:Point = new Point();
 
// Направление, задаваемое игроком.
var _direction:Point = new Point();
 
// А тут у нас вспомогательные переменные, для работы с клавой.
var _keyL:Boolean = false;
var _keyR:Boolean = false;
var _keyU:Boolean = false;
var _keyD:Boolean = false;
 
var _keyLL:Boolean = false;
var _keyRR:Boolean = false;
var _keyUU:Boolean = false;
var _keyDD:Boolean = false;
 
// Слушаем необходимые события.
stage.addEventListener(Event.ENTER_FRAME, onEnterFrameУ);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownУ);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpУ);
 
/** Весь движняк, как обычно. */
function onEnterFrameУ(event:Event):void
{
        // Вычисляем теперь уже ускорение на основании
        // вектора направления.
        var acceleration:Point = _direction.clone();
            acceleration.normalize(_accValue);
 
        // Ускоряемся.
        _velocity = _velocity.add(acceleration);
 
        // Испытываем сопротивление среды
        _velocity.x *= _envResistance;
        _velocity.y *= _envResistance;
 
        // И наконец движемся
            карта.чоловічок.x += _velocityР.x;
              карта.чоловічок.y += _velocityР.y;
        карта.fire.x += _velocityР.x;
              карта.fire.y += _velocityР.y;
            карта.x -= _velocityР.x;
            карта.y -= _velocityР.y;
}
 
/** Коли нажали кнопку на клавіатурі. */
function onKeyDownУ(event:KeyboardEvent):void{
        switch (event.keyCode)
        {
                case Keyboard.LEFT:
                case Keyboard.A:
                        _keyL = true;
                        _direction.x = -1;
                                                if (!карта.чоловічок.грав.play()) карта.чоловічок.грав.play();
                        break;
                case Keyboard.RIGHT:
                case Keyboard.D:
                        _keyR = true;
                        _direction.x = 1;
                                                if (!карта.чоловічок.грав.play()) карта.чоловічок.грав.play();
                        break;
                case Keyboard.UP:
                case Keyboard.W:
                        _keyU = true;
                        _direction.y = -1;
                                                if (!карта.чоловічок.грав.play()) карта.чоловічок.грав.play();
                        break;
                case Keyboard.DOWN:
                case Keyboard.S:
                        _keyD = true;
                        _direction.y = 1;
                                                if (!карта.чоловічок.грав.play()) карта.чоловічок.грав.play();
                        break;
        }
}
 
/** Когда кнопочку отпустили, соответственно. */
function onKeyUpУ(event:KeyboardEvent):void
{
        switch (event.keyCode)
        {
                case Keyboard.LEFT:
                case Keyboard.A:
                        _keyL = false;
                        _direction.x = _keyR ? 1 : 0;
                                                карта.чоловічок.грав.stop();
                                                _keyLL = true;
                        break;
                case Keyboard.RIGHT:
                case Keyboard.D:
                        _keyR = false;
                        _direction.x = _keyL ? -1 : 0;
                                                карта.чоловічок.грав.stop();
                                                _keyRR = true;
                        break;
                case Keyboard.UP:
                case Keyboard.W:
                        _keyU = false;
                        _direction.y = _keyD ? 1 : 0;
                                                карта.чоловічок.грав.stop();
                                                _keyUU = true;
                        break;
                case Keyboard.DOWN:
                case Keyboard.S:
                        _keyD = false;
                        _direction.y = _keyU ? -1 : 0;
                                                карта.чоловічок.грав.stop();
                                                _keyDD = true;
                        break;
        }
}


samana 27.06.2014 20:44

Если вы о дёрганье карты, после отжатия всех клавиш, то вам нужно добавить дополнительное условие, чтобы обнулять скорость, если она слишком мала. Попробуйте в самый конец метода onEnterFrameУ добавить
Код AS3:

var vel:Number=_velocity.x+_velocity.y
if( vel < 0.1 && vel > -0.1) _velocity.setTo(0,0);

Но если вы не об этой проблеме, тогда не знаю. У меня движения идут плавно.

Может ваш fps меньше 30?

Anabel 27.06.2014 21:21

Да, было 20, при изменении на 30 качество значительно лучше стало. Спасибо


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

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