Android-студия Скорость игры на разных устройствах

Я делаю игру в Android Studio. Теперь моя игра завершена, но скорость игры на больших экранах другая...

Я запускаю свою игру с этим таймером:

if (timer == null){
  timer = new Timer();
  timer.schedule(new TimerTask() {
    @Override
    public void run() {
      if (start_flg) {
        handler.post(new Runnable() {
          @Override
          public void run() {
            changePos();
          }
        });
      }
    }
  }, 0, 20);
}

changePos() выглядит так:

    public void changePos() {
SPEED_BOX =(screenHeight/280);
        
          long time = System.nanoTime();
          double delta_time = (double) ((time - last_time) / 1000000)/10;
          last_time = time;
        
          // Move Box
          if (action_flg) {
            // Touching
            boxY += SPEED_BOX*delta_time;
            box.setImageDrawable(imageBox1);
          } else {
            // Releasing
            boxY -= SPEED_BOX*delta_time;
            box.setImageDrawable(imageBox2);
          }
        
          // Check box position.
          if (boxY < 0) {
            boxY = 0;
            box.setImageDrawable(imageBox1);
          }
          if (frameWidth - boxSize < boxY) {
            boxY = frameWidth - boxSize;
            box.setImageDrawable(imageBox2);
          }
          
          box.setY(boxY);
    }

правильно ли я понимаю, что мой deltaTime всегда находится в диапазоне от 1,5 до 2,9?

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

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

MaLa 12.12.2020 23:41

На мой взгляд, логика кажется правильной, если screenHeight в пикселях. Имейте в виду, что Таймер может не запуститься через 20 мс. Это самое раннее возможное время, когда changePos() можно было вызвать.

MaLa 12.12.2020 23:57

Да есть ящик и этот ящик движется вниз, но на каждом устройстве эта скорость разная

mask 13.12.2020 12:18

Что такое screenHeight? Это пиксели?

MaLa 13.12.2020 13:53

да, это пиксели WindowManager windowManager = getWindowManager(); ` Display display = windowManager.getDefaultDisplay();` Point size = new Point();display.getSize(size);screenWidth = size.x;screenHeight = size.y;

mask 13.12.2020 13:57

Насколько велика разница в скорости? Может ли это быть вызвано ошибкой округления? Например, SPEED_BOX =(screenHeight/280); вернет int, которого может быть недостаточно.

MaLa 13.12.2020 14:17

Разница в скорости составляет около полсекунды между большим 10-дюймовым планшетом и маленьким 5,5-дюймовым мобильным телефоном, SPEEDBOX вдвое; в логе у него есть значение например: speed: 6.4071428571428575

mask 13.12.2020 14:31

действительно правильно, как я вычисляю deltaTime и как я его использую?

mask 13.12.2020 14:41

Давайте продолжим обсуждение в чате.

MaLa 13.12.2020 14:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
9
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что screenHeight была высотой экрана в пикселях, но игра не использует весь экран. Это привело к тому, что скорость была разной на разных устройствах. Поэтому screenHeight следует изменить на gamesLayout.getHeight().

Другие вопросы по теме