Actionscript 3 плавное движение Sprite - PullRequest
1 голос
/ 04 марта 2012

Я перемещаю Sprite по экрану с помощью клавиатуры со скоростью 10 пикселей / событие события ENTER_FRAME. Проблема в том, что когда он движется, вы можете видеть, как он «перерисовывается» каждые 10 пикселей, что затрудняет просмотр. Я не видел этого в других флеш играх.

Если вы посмотрите внимательно, вы также можете увидеть это здесь (хотя и в гораздо меньшем масштабе): http://kirill -poletaev.blogspot.com / 2010/07 / smooth-Character-Move-using-as-as3. HTML

Хочу избавиться от этого эффекта, есть идеи?


Если игрок находится на расстоянии ... от края экрана, он прекращает движение (двигаясь в противоположном направлении), и BG начинает прокручиваться (виден тот же визуальный эффект). Музыка играет в фоновом режиме, миникарта обновляется с учетом позиции игрока.


    private function updater(e:Event):void
        {
            if(up && GlobalVars.vars.upPossible)
            {
                cont.y-=unit;
                setu(); // Player graphics state
            }
            else if(down && GlobalVars.vars.downPossible)
                 {
                     cont.y+=unit;
                     setd(); // Player graphics state
                 }
            else if(left && GlobalVars.vars.leftPossible)
                 {
                    cont.x-=unit;
                    setl(); // Player graphics state
                 }
            else if(right && GlobalVars.vars.rightPossible)
                 {
                     cont.x+=unit;
                     setr(); // Player graphics state
                 }
            else
                 {
                     ups.visible=false; downs.visible=false; rights.visible=false;
                     lefts.visible=false; normals.visible=true; // Player graphics state
                     GlobalVars.vars.scXr=0; GlobalVars.vars.scYu=0; GlobalVars.vars.scXl=0;
                     GlobalVars.vars.scYd=0; cont.x=int(cont.x); cont.y=int(cont.y); //Someone from the Kongregate.com forums suggested this, no visible effect 
                 }
            if((cont.x=GlobalVars.vars.maxX))
            {
                if(cont.x=GlobalVars.vars.maxX && right && GlobalVars.vars.canScrollR) GlobalVars.vars.scXr=1, cont.x-=unit, setr();
            }
            else GlobalVars.vars.scXl=0, GlobalVars.vars.scXr=0; //BG Scrolling
            if((cont.y=stage.stageHeight*7.3/10))
            {
                if(cont.y=stage.stageHeight*7.3/10 && down && GlobalVars.vars.canScrollD) GlobalVars.vars.scYd=1, cont.y-=unit, setd();
            }
            else GlobalVars.vars.scYu=0, GlobalVars.vars.scYd=0; //BG Scrolling
            if(cont.y>=stage.stageHeight*7.3/10 && cont.x>=GlobalVars.vars.maxX)  GlobalVars.vars.minimapTr=1;
            else  GlobalVars.vars.minimapTr=0;
            if(cont.y-unitGlobalVars.vars.sH-cont.height-3.1) GlobalVars.vars.downPossible=false;
            else GlobalVars.vars.downPossible=true;
            if(cont.x-unitGlobalVars.vars.sW-cont.width-3.5) GlobalVars.vars.rightPossible=false;
            else GlobalVars.vars.rightPossible=true;
            GlobalVars.vars.plX=cont.x; //for minimap
            GlobalVars.vars.plY=cont.y;

Кроме того, ключевые функции прослушивателя:



stage.addEventListener(KeyboardEvent.KEY_DOWN, keyD, false, 0, true);
stage.addEventListener(KeyboardEvent.KEY_UP, keyU, false, 0, true);

private function keyD(e:KeyboardEvent):void
    {
        if(e.keyCode==37 || e.keyCode==65) left=true;
        if(e.keyCode==38 || e.keyCode==87) up=true;
        if(e.keyCode==39 || e.keyCode==68) right=true;
        if(e.keyCode==40 || e.keyCode==83) down=true;
    }
private function keyU(e:KeyboardEvent):void
    {
        if(e.keyCode==37 || e.keyCode==65) left=false;
        if(e.keyCode==38 || e.keyCode==87) up=false;
        if(e.keyCode==39 || e.keyCode==68) right=false;
        if(e.keyCode==40 || e.keyCode==83) down=false;
    }

Я столкнулся с некоторым улучшением, увеличив FPS до 120 и уменьшив шаг до 4, но он все еще здесь. Я уверен, что это не проблема производительности, а скорее ошибка метода движения.

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Пара предложений:

  1. Увеличение частоты кадров
  2. Используйте библиотеку анимации (например, GTween) с некоторым эффектом замедления.

По сути, если вы хотите, чтобы объект прыгнул на 10 пикселей вправо, не просто перемещайте его сразу, дайте ему анимироваться в новую позицию с некоторым эффектом ослабления. Кроме того, если объект все еще движется и клавиша снова нажата, вы, вероятно, захотите немного ускорить движение (но только до определенной точки!).

0 голосов
/ 08 марта 2012

Я люблю Tweenlite, он отлично подходит для заданных эффектов. Это не для ядра вашей игры, поэтому я бы использовал Tweenlite для эффектов пользовательского интерфейса, но только для игровых движений, реагирующих на пользовательские элементы управления.

Я думаю, что 24-30 fps для игр - это здорово, вот как я настроил все свои игры. Я думаю, что если вы придирчивы, но, возможно, вы упускаете немного остроты: плавное начало и конец движения. В большинстве платформеров у меня похожая механика:

Вы хотите, чтобы начало движения начиналось медленно, достигать нормальной (максимальной) скорости, которую вы определяете, и когда игрок отпускает кнопку, он замедляется до 0. Это означает, что вам нужно проверить скорость при входе кадр независимо от триггеров кнопки (они увеличивают скорость, но не являются единственным условием для изменения скорости и перемещения объекта)

enterframe loop:
  //check for each direction:
  if up, y_speed++
  else if down, y_speed--
  else if right, x_speed++
  else if left, x_speed--
  else // perform a decrease:
    y_speed *= .8
    x_speed *= .8
  // make sure we aren't past the max speed
  if x_speed>max_x_speed
    x_speed = max_x_speed
  etc. else other direction and y_speed
  // now apply the movement
  object.x += x_speed
  object.y += y_speed
  // remove the enterframe for better performance
  if math.abs(x_speed)<.1 && math.abs(y_speed)<.1
    // remove enterframe for movement here, add it again next time we know we have movement (button downs related to the movement, etc.)

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

0 голосов
/ 04 марта 2012

Я думаю, вы спрашиваете, как сделать его более плавным.Хорошо:

Если вы измените движение 2px за frame, тогда у вас будет намного более более плавный опыт.Тем не менее, движение будет видеть очень медленно .Чтобы бороться с этим, вы просто увеличиваете частоту кадров вашего swf.Я считаю, что максимум равен 120 кадрам, но этого должно быть больше , чем достаточно.

...