Приветствую. Я расположил объекты в пайгейм (это спрайты в группе) в случайных местах, получив рандомные координаты. Затем я хочу менять эти координаты, чтобы создать хаотичное движение в случайные направления Когда я менял их так: rect.x += 1, то я сбрасывал ранее назначенные рандомные координаты на 0 по иксу и изменения происходили от x = 0 для всех объектов. Я вспомнил про move_ip. Но не понимаю, почему это работает именно так:
В зависимости от установленного значения, происходит задержка перед началом движения, затем объекты начинают двигаться и ускоряться через равный интервал времени (замеры производились с помощью подсчёта вслух и загиба пальцев).
class Object(Sprite):
def __init__(self, screen, settings):
super().__init__()
self.screen = screen
self.screen_rect = self.screen.get_rect()
self.settings = settings
self.objects_amount = settings.objects_amount
self.image = pg.image.load('img/image.png').convert_alpha()
self.rect = self.image.get_rect()
self.x = float(self.rect.x)
self.y = float(self.rect.y)
self.width = self.rect.width
self.height = self.rect.height
def get_random_position(self):
""" Получаю список рандомных координат x и y """
start_position = self.width
x_end_position = self.settings.screen_width - self.width
y_end_position = self.settings.screen_height - self.height
pos_x = random.randint(start_position, x_end_position)
pos_y = random.randint(start_position, y_end_position)
return pos_x, pos_y
def set_random_position(self, humans_amount):
""" установить рандомные координаты """
positions_list = []
width = self.rect.width
height = self.rect.height
for i in range(objects_amount):
if not positions_list: # если пустой, то добавить первое значение
rand_x, rand_y = self.get_random_position()
positions_list.append((rand_x, rand_y))
elif positions_list:
rand_x, rand_y = self.get_random_position()
positions_list.append((rand_x, rand_y))
return positions_list
(Группу я создаю вне основного цикла в главном файле. Размещение спрайтов тоже происходит вне основного цикла, то есть единожды.) В основном цикле указано fpsClock.tick(60)
Важно:
def update(self):
self.x += 0.01
self.rect.move_ip(self.x,self.x) # одинаковые значения просто пока разбираюсь
При значении 0.01 примерно через 2 секунды объекты начинают движение, затем ещё через пару секунд, скорость возрастает в 2 раза. При значении 0.1 задержки практически нет (какие-то доли секунды), ну и каждую секунду происходит ускорение
Почему это так работает? Это нормально или я что-то набаламутил? move_ip сдвигает объект на указанные координаты, функция update вызывается в главном цикле, и я понимаю, почему происходит ускорение. Но откуда берётся задержка? Как определяется, что 0.01 это интервал примерно в 2 секунды, а 0.1 - в секунду? Если выставить 0.001, то задержка будет порядка 14 секунд.
Объясните, пожалуйста, как это всё считается и как убрать задержку при выставлении низких значений, таких как 0.01 и 0.001