Плавающая анимация медленно перемещает объект вверх Pygame - PullRequest
2 голосов
/ 04 марта 2020

Я пишу скрипт для объекта, который должен зависать на месте, но вместо этого он медленно перемещается вверх. Вот код:

(функция инициализации)

self.vy = 0
self.dy = 0.1

(функция обновления)

 self.vy += self.dy
 if self.vy > 1 or self.vy < -1:
     self.dy *= -1
 self.imgRect.centery += self.vy

1 Ответ

3 голосов
/ 04 марта 2020

Из 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...