Что делает get_rect () в следующей программе? Почему это было использовано?

1

Я читал здесь учебник - www.raywenderlich.com/24252/beginning-game-programming-for-teens-with-python. На шаге 4 он использовал следующее утверждение:

# 6.1 - Set player position and rotation
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
playerrot = pygame.transform.rotate(player, 360-angle*57.29)
playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
screen.blit(playerrot, playerpos1) 

что именно он сделал? и почему он это сделал?

  • 0
    В документации по pygame вы можете прочитать описание Surface.get_rect : получить прямоугольную область Surface (см. Здесь ).
  • 0
    Пожалуйста, опубликуйте минимальный, полный пример, который мы можем скопировать, запустить и протестировать.
Теги:
pygame

3 ответа

0
Лучший ответ

Координаты, которые вы передаете pygame.Surface.blit являются коордами верхнего левого угла. Я думаю, что playerpos на шаге 4 должны быть центральным положением изображения/поверхности, поэтому вам нужно вычесть половину ширины и половину высоты поверхности, чтобы получить верхние левые координаты (где вы хотите разбить ее). Автор использует метод pygame.Surface.get_rect для получения прямоугольника с шириной и высотой повернутой поверхности, но он также может использовать методы pygame.Surface.get_width и .get_height.

После каждого поворота поверхность playerrot будет иметь разный размер, поэтому вам нужно снова вызвать метод get_rect чтобы получить новый прямоугольник с обновленной шириной и высотой, которые вам необходимо скорректировать координаты.


Кстати, похоже, что добавление 32 и 26 в этой строке вызывает проблемы с вращением.

angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))

Это должно работать правильно:

angle = math.atan2(position[1]-playerpos[1], position[0]-playerpos[0])

Также возможно использовать pygame.Rect как pygame.Rect position, так что вы можете сделать это, чтобы создать прямоугольник с размером повернутой поверхности и playerpos в качестве координаты center:

playerpos1 = playerrot.get_rect(center=playerpos)
  • 0
    Спасибо! Кстати, я также не добавил 32 и 26 в свой код, так как никогда не понимал, почему автор сделал это.
0

Он использует его как средство для вычисления движения кролика, которое происходит от поворота, путем получения прямоугольника для изображения кролика и разделения его пополам, чтобы получить (x, y) положение в положении для кролика:

------                                        ---------
|X   |    ---->  Rotate 90 degrees   ---->    |      X|
|    |                                        |       |
------                                        ---------
0

Я думаю, get_rect() - это метод для получения объекта rectangle, а затем он получает свойство width для вычисления позиции на следующем игроке. Я предполагаю, что этот метод определен где-то в коде. Возможно, посмотрите и остальную часть кода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню