Из pygame.Rect do c
Все координаты объектов Rect являются целыми числами
Я исследовал это и обнаружил, что когда вы пытаетесь установить координату прямоугольника (в данном случае centery) в число с плавающей точкой, оно берет ближайшее целое число ниже числа с плавающей точкой и использует его.
Я поднял этот маленький тест, чтобы увидеть его в действии:
import pygame
pygame.init()
window = pygame.display.set_mode((500,500), pygame.SCALED)
rect = pygame.Rect(250,250,50,50)
dy = 0.1
vy = 0
intended_centery = 275
while True:
pygame.time.delay(1000)
vy+= dy
if vy > 1 or vy < -1:
dy *= -1
rect.centery+= vy
intended_centery += vy
print("\nWhat you want:{}\nWhat you get: {}".format(intended_centery,rect.centery))
И выходные данные показывают, что yes_incenter_centery работает так, как вы хотите, но rect.centery продолжает только уменьшаться (поэтому движется вверх)
Причина, по которой это происходит, заключается в том, Так как Rect принимает целое число ниже числа с плавающей точкой, когда вы проходите мимо него, когда вы пытаетесь увеличить центрирование (двигаться вниз), оно постоянно принимает int ниже vy. До тех пор, пока vy> = 1, rect.centery + = vy будет добавлять 0, поскольку значение int ниже 0,1 - 0,9 равно 0. Так что ничего полезного не произойдет.
НО, когда вы поднимаете его обратно, как только vy <0 (от -0,1 до -0,9), он будет принимать int ниже числа с плавающей точкой ... которое будет равно -1! </p>
Таким образом, в результате вы фактически продолжаете двигаться только вверх и не двигайтесь вниз, чтобы получить нужное вам движение при наведении
Причина, по которой округления Rect.centery плавают так, как это, заключается в том, что они используют "_ int _" для преобразования чисел в Интс. И когда вы запускаете тест, я сделал это даже печатает предупреждение об устаревании для этого. Это именно то, что вызывает вашу проблему
Насколько я могу судить, нет никакого способа получить точный желаемый эффект.
Однако вы можете использовать встроенную функцию Python. Метод round (), чтобы приблизиться к тому, что вы хотите, однако центрирование будет только увеличиваться и уменьшаться на 1, что может не сработать для вас, так как я предполагаю, что вы хотите, чтобы точность использовалась с плавающей точкой по причине. Но он будет «работать», так как он будет двигаться вверх и вниз одинаково
В любом случае, надеюсь, это помогло (кстати, я провел тестирование и все в python 3)