Я программировал боковую прокрутку на основе учебника, найденного в книге. Мой друг сделал то же самое, и его работает отлично.
Я действительно изменил только несколько имен переменных (я также сделал анимацию по-другому), но по какой-то причине, когда мой персонаж движется, происходит большое отставание.
Однако отставание присутствует только тогда, когда на сцене есть «стены». Когда прокручиваю мимо них, лаг уходит, потом возвращается.
Стены и полы используют один и тот же код (они оба назначаются как переменные «floorObjects») и используют один и тот же код столкновения, однако я не могу понять, почему возникает задержка.
С того места, где персонаж начинается (примерно в 60 раз), если персонаж идет влево, возникает ОГРОМНОЕ количество задержек. Если я пойду вправо, задержка не будет слишком большой, пока экран не начнет прокручиваться.
Я полагаю, что задержка при движении влево может быть связана с тем, что программа не позволяет прокручивать карту и т. Д. Но я не могу понять, почему возникает задержка при попытке двигаться вправо.
Я перечислил код прокрутки и основной цикл, если нужно, я могу загрузить код коллизий, и любая помощь будет принята с благодарностью.
Код прокрутки;
public function scrollGame()
{
var stagePosition:Number = gameLevel.x + player.mc.x;
var rightEdge:Number = stage.stageWidth - edgeDistance;
var leftEdge:Number = edgeDistance;
//Scroll the GameLevel to the Left if player moves right
if(stagePosition > rightEdge)
{
gameLevel.x -= (stagePosition - rightEdge);
//Prevent the game scrolling off the stage
if (gameLevel.x < -(gameLevel.width-stage.stageWidth))
gameLevel.x = -(gameLevel.width-stage.stageWidth);
}
//Scroll the GameLevel to the right if player moves left
if(stagePosition < leftEdge)
{
gameLevel.x += (leftEdge - stagePosition);
//Prevent the game scrolling off the stage
if(gameLevel.x > 0)
gameLevel.x = 0;
}
}
Основной цикл:
public function gameLoop(e:Event)
{
//Get Time Difference
if(lastTime == 0) lastTime = getTimer();
var timeDiff:int = getTimer() - lastTime;
lastTime += timeDiff;
//Game Cycle tasks
//Only perform if in play mode
if(gameMode == "play")
{
moveCharacter(player, timeDiff);
moveEnemies(timeDiff);
checkCollisions();
scrollGame();
}
}
ОБНОВИТЬ:
Так что я его "профилировал", большая часть времени тратится либо на функцию MoveCharacter(), либо на команду gotoAndStop(). Поэтому я удалил это, и это не имело значения, все еще отставало. Затем я также удалил врагов, которые все еще отстают. Но снижение качества до низкого каким-то образом исправило это (хотя сейчас качество плохое). Есть идеи относительно того, что вызывает отставание и как его исправить?
scrollGame
не выглядит особенно интенсивной. Ваша функцияgameLoop
вызывает некоторые другие методы, которые могут быть медленными, а могут и нет - мы не можем сказать. Он может даже просто медленно рисовать мир. Я бы использовал профилировщик, чтобы выяснить, на что тратится время, и тогда мы сможем посоветовать, как улучшить эту конкретную часть. - person AndySavage   schedule 28.04.2014