Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Разная скорость отрисовки в зависимости от разрешения #2

Open
unclecrow opened this issue Aug 19, 2016 · 1 comment

Comments

@unclecrow
Copy link

В Asteroids vs You скорость отрисовки разная в зависимости от размера окна (на полный экран и играть легче). Как организовать перемещение объектов по времени? (с пропуском кадров или задержкой)

@dimsa
Copy link
Owner

dimsa commented Aug 20, 2016

Конкретно в Asteroids vs You, не очень удачно сделано перемещение объектов. Там есть два модификатора у юнитов:

  FShip.SetSpeedModScale(ASpeedModScale);
  FShip.SetMonitorScale(AMonitorScale);

Значение параметров, которые попадают в юниты у меня рассчитываются так:

function MonitorScale: Single;
begin
  Result := ((uEasyDevice.getDisplaySizeInPx.X + uEasyDevice.getDisplaySizeInPx.Y) * 0.5) 
    * 0.001;
end;

function SpeedModScale: Single;
begin
  Result := (((uEasyDevice.getDisplaySizeInPx.X + uEasyDevice.getDisplaySizeInPx.Y) * 0.5)
    * 0.001) / getScreenScale;
end;

Т.е. действительно от разрешения экрана зависит скорость. Можно поменять формулу, например, чтобы модификаторы рассчитывались как отношение какого-то разрешения к текущему, плюс думать о FPS: в TEngine2DStatus есть property EngineSpeed: Single, которое позволяет рассчитать свои коэффициенты. У меня тоже используется это.

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

А если хочется сделать изменение положения по времени, не думая о пикселях, то для этого есть анимации. TAnimation в юните uEngine2DAnimation. От них наследуется своя анимация, у которой переписывается метод Animate таким образом, чтобы он менял нужный параметр. Анимации перемещения есть уже реализованные в юните uStandardAnimation2d и в нём TMigrationAnimation, TMouseDownMigrationAnimation, TSpriteAnimation. Например, задаётся конечное положение в пикселях, требуемый масштаб и время, за которое объект должен прийти в это положение в миллисекундах, пример есть в uDemoGameLoader и там есть подобные методы TLoader.ScaleAnimation и т.д.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants