Понедельник, 19 Апреля 2021, 07:13

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » DurianOdour [5]
Результаты поиска
DurianOdourДата: Пятница, 15 Декабря 2017, 22:07 | Сообщение # 1 | Тема: Игровой цикл независимый от размер экрана и фреймрейта
был не раз
Сейчас нет на сайте
Спасибо за ответ, я делаю это под Андроид вообще, без использования движков каких либо, все сам делаю, игра сильно простенькая. Подскажите в чем может быть проблема или как правильно сделать, чтобы сильно не усложнять
DurianOdourДата: Четверг, 14 Декабря 2017, 23:20 | Сообщение # 2 | Тема: Игровой цикл независимый от размер экрана и фреймрейта
был не раз
Сейчас нет на сайте
Здравствуйте, нужно сделать очень простую игру для Android, ну очень простую.
Даже в этом случае не могу понять в чем проблема.
Собственно читал статьи на эту тему, сделал все как было описано, несколько раз проверял, но все равно что-то неправильно сделал.

Мой игровой цикл выглядит следующим образом

Код
  public static final int PAUSE_SLEEP_TIME = 10;
        long totalElapsed = 0;
        long previousTime = TimeUtils.getCurrentTimeMillis();
        long dt = 5;
        long accumulator = 0;

        @Override
        public void run() {
            while (mIsRunning) {
                // Pause game
                while (mIsPaused) {
                    try {
                        Thread.sleep(PAUSE_SLEEP_TIME);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                long currentTime = TimeUtils.getCurrentTimeMillis();
                long frameTime = currentTime - previousTime;
                previousTime = currentTime;
                totalElapsed += frameTime;
                accumulator += frameTime;
                while (accumulator >= dt) {
                    processGameInput();
                    updateGameState(totalElapsed, dt);
                    accumulator -= dt;
                }

                drawGame();
                checkIfGameShouldStop(totalElapsed);
            }
            shutdownGracefully();
        }

        private void shutdownGracefully() {
        }


В update game state я просто передвигаю шарик относительно текущих координат с какой-то константной скоростью без ускорения.

Также для того чтобы поддерживать несколько экранов сделал концепцию абстрактного экрана. Идея в том что есть определенный размер экрана, по которому ведутся расчеты, но при отрисовке непосредственно все координаты транслируются в настоящие.

Код
public class GameScreen implements AbstractCoordinatesConverter {
    private static final long DEFAULT_SCREEN_COEFFICIENT = 100;
    private static final long DEFAULT_ABSTRACT_SCREEN_WIDTH = 720;
    private static final long DEFAULT_ABSTRACT_SCREEN_HEIGHT = 1280;
    private static final ScreenSize DEFAULT_ABSTRACT_SCREEN_SIZE = new ScreenSize(DEFAULT_ABSTRACT_SCREEN_WIDTH, DEFAULT_ABSTRACT_SCREEN_HEIGHT);
    private Point2d mReusablePoint = new Point2d();
    private ScreenAspectRatio mScreenAspectRatio;
    private ScreenSize mAbstractScreenSize;
    private ScreenSize mRealScreenSize = new ScreenSize();
    private ScreenAspectCoefficient mScreenAspectCoefficient = new ScreenAspectCoefficient();
    private long mScreenCoefficient = DEFAULT_SCREEN_COEFFICIENT;
    

    public void updateFromCanvasSize(CanvasSize canvasSize) {
        mRealScreenSize.setHeight(canvasSize.getHeight());
        mRealScreenSize.setWidth(canvasSize.getWidth());
        onScreenSizeUpdated();
        Logger.error("ABSTRACT SCREEN SIZE WIDTH : " + mAbstractScreenSize.getWidth() + " HEIGHT " + mAbstractScreenSize.getHeight());
    }

    private void onScreenSizeUpdated() {
        mScreenAspectRatio = ScreenAspectRatio.fromScreenSize(mRealScreenSize);
        mAbstractScreenSize = calculateAbstractScreenSize(mScreenAspectRatio, mScreenCoefficient);
        mScreenAspectCoefficient = ScreenAspectCoefficient.fromScreenSizes(mAbstractScreenSize, mRealScreenSize);
    }

    @Override
    public Point2d convertPointToRealPosition(Point2d point2d) {
        mReusablePoint.x = convertXPointToRealPosition(point2d.x);
        mReusablePoint.y = convertYPointToRealPosition(point2d.y);
        return mReusablePoint;

    }

    @Override
    public float convertXPointToRealPosition(float xAbstract) {
        return xAbstract * mScreenAspectCoefficient.getWidthCoefficient();

    }

    @Override
    public float convertYPointToRealPosition(float yAbstract) {
        return yAbstract * mScreenAspectCoefficient.getHeightCoefficient();
    }

    @Override
    public float convertYRealToAbstract(float yReal) {
        return yReal / mScreenAspectCoefficient.getHeightCoefficient();
    }

    @Override
    public float convertXRealToAbstract(float xReal) {
        return xReal / mScreenAspectCoefficient.getHeightCoefficient();
    }

    public static ScreenSize calculateAbstractScreenSize(ScreenAspectRatio aspectRatio, long coefficient) {
        return DEFAULT_ABSTRACT_SCREEN_SIZE;
        // return new ScreenSize(aspectRatio.getWidthRatio() * coefficient, aspectRatio.getHeightRatio() * coefficient);
    }
}

Но все равно на разных устройствах по разному работает игра. На одних быстрее на одних медленнее. Вот пример видео Video Game Loop

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

Буду благодарен за любую помощь


Сообщение отредактировал DurianOdour - Четверг, 14 Декабря 2017, 23:22
DurianOdourДата: Суббота, 28 Октября 2017, 00:55 | Сообщение # 3 | Тема: Алгоритм для движения объекта по времени
был не раз
Сейчас нет на сайте
drcrack,

Спасибо огромное, попробовал сделать, но не получилось, идея примерно понятно, но что-то я затупил где-то.

Код
  distance = gameUpdateStateBundle.getGameScreen().getHeight();
        double timeElapsed = gameUpdateStateBundle.getTimeElapsed();
        double gameTime = gameUpdateStateBundle.getGameTime();
        double sin = (Math.sin((float) gameTime * Math.PI * 2f / (float) timeElapsed - Math.PI / 2f) + 1f) / 2f;
        Logger.error("SIN " + sin);
        mCenterX += (mVelocityVector.x * timeElapsed);
        mCenterY = (float) (distance * sin);


Подскажите в чем проблема может быть. Ваша идея с функцией для четкого определения позиции по текущему времени очень понравилась.

Спасибо
DurianOdourДата: Вторник, 24 Октября 2017, 20:13 | Сообщение # 4 | Тема: Алгоритм для движения объекта по времени
был не раз
Сейчас нет на сайте
Спасибо большое за ответ. Да действительно можно так. Только пожалуйста, если не трудно, объясните все эти числа что вы использовали 1f, 2f за что они отвечают в данном случае.
Спасибо
DurianOdourДата: Понедельник, 23 Октября 2017, 20:27 | Сообщение # 5 | Тема: Алгоритм для движения объекта по времени
был не раз
Сейчас нет на сайте
Здравствуйте, я только начинающий.

Возник такой вопрос. Задача стоит в том чтобы объект двигался по времени, в зависимости от того какое время поставили. К примеру.

Есть шарик. В настройках поставили, что игровое время 40 секунд и всего шарик должен сделать 10 полных проходов пути (туда и обратно).

То есть считаем. Шарик должен пройти 1 проход (от 1 стенки к другой и обратно) за 40/10=4 секунды.

Теперь собственно как это реализовать ?

Если нельзя быть уверенным, в том что какой-то определенный фреймрейт будет.

К примеру 1 цикл игры (отрисовка и вычисление) происходит за 30мс. Соответственно можно посчитать.

4000/30 = 133 это у нас количество циклов для прохождения. Теперь допустим полное расстояние от 1 стенки к другой 1000px. Чтобы шарик сделал полный проходу нужно 2000px.

Соответственно - 2000/133 = 15, то есть каждую итерацию шарик должен проходить + 15px.

Это все хорошо, но как сделать в случае если фрейм рейт не известен + если он меняется часто и нужно коррелировать.

Желательно точно чтобы выходило время заданное в настройках. Подскажите пожалуйста алгоритм или просто идеи как это реализовать можно ?

Спасибо
Форум игроделов » Записи участника » DurianOdour [5]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2021 Рейтинг