Заставить мяч двигаться с одинаковой скоростью независимо от разрешения (PONG)

Я создал простую игру в понг и перемещаю мяч, добавляя переменную ballSpeed к его позиции в моей update игровой логике, например:

void Update()
{
    ballPosition += ballSpeed;
}

Проблема в том, что ballSpeed это D3DXVECTOR3 с компонентами: x = 10; y = 10; z = 0;

Дело в том, что когда я увеличиваю разрешение окна с 640:480 до 1280:1024, шарик движется медленнее, потому что для его перемещения требуется больше пикселей.

И у меня вопрос: Как сделать так, чтобы мяч двигался с одинаковой скоростью независимо от разрешения монитора?


person Thanatos    schedule 11.01.2013    source источник
comment
Значит, вы имеете в виду скорость с точки зрения физического расстояния? Умножить/разделить на разрешение — разве это не элементарная математика?   -  person Lightness Races in Orbit    schedule 11.01.2013
comment
Это зависит не только от разрешения монитора. Это также зависит от его размера. Рассмотрим монитор 640x480 с диагональю 50 дюймов против 10 дюймов. Если вы не имеете в виду ту же скорость, что и % от общего размера монитора, а не физическую скорость в реальном мире.   -  person Almo    schedule 11.01.2013
comment
Разве этот вопрос не принадлежит gamedev.stackexchange.com?   -  person undu    schedule 11.01.2013
comment
@LightnessRacesinOrbit Вы можете умножать / делить на разрешение, потому что 640: 480 = 4/3 и 1280: 1024 = 4/3, так что это не сработает.   -  person Thanatos    schedule 11.01.2013
comment
@ Танатос это не то, что он имеет в виду. Он имеет в виду масштабирование скорости, которую вы даете по разрешению.   -  person im so confused    schedule 11.01.2013
comment
@Thanatos: я не имел в виду разделить одну часть разрешения на другую часть. Я имею в виду использовать его как коэффициент масштабирования. Например, рассмотрим dpi.   -  person Lightness Races in Orbit    schedule 11.01.2013


Ответы (3)


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

ballSpeed = int(ballSpeed * width / 640.0);

Вы, вероятно, захотите сделать то же самое и с размером всех элементов экрана, таких как мяч.

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

person Mark Ransom    schedule 11.01.2013
comment
В итоге я использую это решение, немного измененное, например, ballSpeed ​​= ballSpeed ​​* width / 640.0f * height / 480.0f. Спс за идею :) - person Thanatos; 11.01.2013
comment
Кроме того, вам нужно 3 измерения для мяча? Сокращение до 2 измерений может ускорить процесс. - person Thomas Matthews; 11.01.2013

Возможно, вы могли бы ввести новую систему координат; скажем, от (0,0) до (1,1). Переместите мяч в этой системе координат, а затем сопоставьте позиции в этих координатах с пикселями на экране, чтобы нарисовать мяч. Вы хотите, чтобы ваша система координат имела то же соотношение сторон, что и окно.

person Thomas    schedule 11.01.2013
comment
Да. Используйте фиксированную систему координат для своих расчетов, а затем масштабируйте ее до вашего разрешения для отображения. - person John; 11.01.2013

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

person Felice Pollano    schedule 11.01.2013