Я читал здесь учебник - 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)
что именно он сделал? и почему он это сделал?
Координаты, которые вы передаете 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)
Он использует его как средство для вычисления движения кролика, которое происходит от поворота, путем получения прямоугольника для изображения кролика и разделения его пополам, чтобы получить (x, y) положение в положении для кролика:
------ ---------
|X | ----> Rotate 90 degrees ----> | X|
| | | |
------ ---------
Я думаю, get_rect() - это метод для получения объекта rectangle, а затем он получает свойство width для вычисления позиции на следующем игроке. Я предполагаю, что этот метод определен где-то в коде. Возможно, посмотрите и остальную часть кода.
Surface.get_rect
: получить прямоугольную область Surface (см. Здесь ).