Задать вопрос
@Span4ev

Почему объекты при move_ip в Pygame начинают движение с задержкой?

Приветствую. Я расположил объекты в пайгейм (это спрайты в группе) в случайных местах, получив рандомные координаты. Затем я хочу менять эти координаты, чтобы создать хаотичное движение в случайные направления Когда я менял их так: 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
  • Вопрос задан
  • 164 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@YariKartoshe4ka
У вас 60 FPS, а значит 60 вызовов update в секунду, что значит x каждую секунду увеличивается на - 0.6px (0.01 * 60). Так же стоит учитывать то, что в вычислених pygame.Rect используется целочисленная арифметика, т.е. move_ip не сдвинет вашего персонажа, если текущий x < 1. Таким образом, пока x набирает единицу, у вас получается задержка в ~2 секунды. Если взять инкремент как 0.001, то увеличение будет 0.06px, и x наберет единицу за ~16 секунд (1 / 0.06) и только через 16 секунд персонаж начнет двигаться. Чтобы избежать задержки, как вы уже могли догадаться, нужно первоночально задать x единицой
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы