Я перемещаю 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, но он все еще там. Я уверен, что это не проблема производительности, а скорее ошибка метода движения.
Действительно, если я использую блок движения 4px и 120 FPS для своего SWF, все перемещается более гладко, но оно все еще видно. – manabk
К сожалению, вы заперты на устройстве. Может быть, вы слишком много продолжаете? Или нужно «очистить» ваш код, чтобы он был менее интенсивным? – Jacksonkr
Нет, я не думаю, что это проблема. Я видел, как движение более интенсивных игр выглядит более гладко. Кроме того, то же самое происходит в примере ссылки, которую я опубликовал, и почти нет кода; Во всяком случае, моя игра действительно базовая, просто перемещение спрайтов, прокручивание фона, музыка и мини-карта. Я почти уверен, что это имеет какое-то отношение к механике движения. – manabk