2012-03-04 3 views
1

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

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

Я хочу, чтобы избавиться от этого эффекта, любые идеи?


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


    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, но он все еще там. Я уверен, что это не проблема производительности, а скорее ошибка метода движения.

ответ

0

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

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

+0

Действительно, если я использую блок движения 4px и 120 FPS для своего SWF, все перемещается более гладко, но оно все еще видно. – manabk

+0

К сожалению, вы заперты на устройстве. Может быть, вы слишком много продолжаете? Или нужно «очистить» ваш код, чтобы он был менее интенсивным? – Jacksonkr

+0

Нет, я не думаю, что это проблема. Я видел, как движение более интенсивных игр выглядит более гладко. Кроме того, то же самое происходит в примере ссылки, которую я опубликовал, и почти нет кода; Во всяком случае, моя игра действительно базовая, просто перемещение спрайтов, прокручивание фона, музыка и мини-карта. Я почти уверен, что это имеет какое-то отношение к механике движения. – manabk

2

Несколько предложений:

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

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

+0

Да, я подумал об использовании некоторой анимации, я помню, что я использовал функцию грубой функции, которая будет перемещать пиксель спрайта 1 на каждую итерацию. Спасибо, спасибо. – manabk

0

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

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

Вы хотите, чтобы начало движения начиналось медленно, достигало нормальной (максимальной) скорости, которую вы определяете, и когда игрок позволяет перейти от кнопки, он замедляется до 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.) 

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