У вас есть несколько отдельных вопросов здесь. Ваш первый вопрос: выполнять игровой цикл в кадре или в таймере? Ответ прост - вы должны сделать это в рамочном событии. Причина в том, что независимо от того, как вы перемещаете своих персонажей, экран обновляется ровно один раз за кадр. Таким образом, каждый раз, когда вы вызываете свой игровой цикл более одного раза за кадр, вы тратите процессор, а каждый раз, когда вы вызываете его менее одного раза за кадр, вы жертвуете визуальным качеством. Так что это легко, не беспокойтесь о событиях таймера.
Следующий вопрос заключается в том, должно ли движение вашей игры быть привязано к кадрам или миллисекундам, и ответ заключается в том, что это зависит от игры. Задайте себе вопрос: предположим, что какой-то пользователь играет в вашу игру, и его космический корабль (или что-то еще) летит с заданной скоростью. Внезапно антивирусный пакет пользователя делает что-то тяжелое, и скачок процессора заставляет Flash перестать обновляться на одну секунду. После того, как всплеск закончился, хотите ли вы, чтобы космический корабль продолжал двигаться от того места, где он был, когда начался всплеск? Или вы хотите, чтобы он прыгнул вперёд туда, где он был бы, если бы продолжал двигаться во время шипа? Если вы хотите первое, вы должны привязать свое движение к кадрам; если вы хотите последнее, вы должны привязать его к миллисекундам. Но какой из них лучше, зависит от того, как вы хотите, чтобы ваша игра работала.
Последний вопрос: как именно вы должны перемещать персонажей в своей игре? Исходя из того, что вы написали, я бы сделал это следующим образом. Для основанного на кадре движения (то есть первый подход, описанный ранее):
// the ship moves 25 pixels per second
var shipSpeed:Number = 25;
// the number of seconds per frame, based on the published framerate
var frameTime:Number = 1 / stage.frameRate;
// game loop called each frame:
function gameLoop() {
// ...
playerShip.x += shipSpeed * frameTime;
// ....
}
Таким образом, движение корабля на экране постоянно, независимо от того, на какой частоте вы публикуете свой SWF. Использование более высокой частоты кадров просто делает движение более плавным. Аналогично, чтобы связать ваше движение со временем, а не с кадрами, просто измените «frameTime» в приведенном выше коде, чтобы оно указывало на время, прошедшее с предыдущего кадра, как описано в ответе Аллана.