Итак, моя проблема заключается в следующем: я делаю игру в понг, и скорость мяча рассчитывается по размеру экрана, и на моем ПК она работает нормально. Когда я посылаю игру другу, мяч, кажется, движется очень быстро. Я думаю, что проблема в цикле while, потому что я поставил счетчик, чтобы задержать начало игры. Однако на других ПК кажется, что цикл while вращается так быстро, что игнорирует счетчик все вместе и запускает игру мгновенно. Мой компьютер ни в коем случае не бюджетный, поэтому я не могу понять, в чем проблема.
Это общеизвестная и хорошо решаемая проблема. Простые игры 80-х годов страдают от этой проблемы. Они были созданы для того, чтобы перерисовать экран настолько быстро, насколько это позволяет ваш компьютер, и теперь (при условии, что вы можете заставить их работать) они работают не поиграть быстро. Скорость вашей игры не должна зависеть от того, как быстро ваш компьютер может выполнить while
петля, иначе ваша игра никогда не будет играть одинаково на двух компьютерах.
Игры решали эту проблему десятилетиями, масштабируя продвижение игрового состояния по частоте кадров компьютера, на котором в данный момент запущена игра.
Первое, что вам нужно сделать в вашем while
цикл рассчитать прошедшее время с момента прошлой итерация вашего цикла, это будет крошечная доля секунды. Ваше игровое состояние должно продвинуться на столько времени, и только столько времени
Проще говоря, если вы перемещаете свой мяч, используя что-то вроде этого …
ball_x += ball_horizontal_momentum
ball_y += ball_vertical_momentum
Вам нужно будет изменить каждый импульс с помощью масштабного коэффициента, определяемого тем, сколько прошло времени:
ball_x += ball_horizontal_momentum * elapsed_time
ball_x += ball_vertial_momentum * elapsed_time
Таким образом, на очень медленном компьютере ваш мяч может прыгать на 100 пикселей каждый кадр. На компьютере, который работает в 10 раз быстрее, ваш мяч будет перемещаться на 10 пикселей каждый кадр. В результате на обоих компьютерах мяч будет двигаться с одинаковой скоростью.
Все ваши анимации должны быть масштабированы таким образом.