Как повернуть изображение в той же позиции? - PullRequest
1 голос
/ 29 марта 2019

Я сейчас пытаюсь написать игру, которая включает в себя маленького робота, приземляющегося на площадку. Пытаясь понять физику того, как он упадет, я столкнулся с проблемой вращения. Он вращается при нажатии левой или правой клавиши в соответствующем направлении.

Я пытался использовать blit с rect.center, но он все еще не работает. Любая помощь будет высоко ценится!

 def rotate_right(self):
    self.new_angle = self.angle + 30
    self.rotate_lander()   

 def rotate_lander(self):
    self.image = pygame.transform.rotozoom(self.image, self.new_angle, 1)
    self.rect = self.image.get_rect(center=self.image.get_rect().center)
    screen.blit(self.image, self.rect.center)

Мне удалось заставить его вращаться, но он двигается с каждым поворотом, и мне нужно, чтобы он оставался в той же позиции. Я думаю, что центр отключен, но я не уверен, где он мог пойти не так.

1 Ответ

0 голосов
/ 29 марта 2019

Во-первых, в rotate_lander () вы всегда должны поворачивать исходное изображение, в противном случае оно будет искажено (и в вашем случае убегайте). Итак, создайте еще одну копию self.image , которую вы не измените.

original = pygame.Surface(...)
...
def rotate_lander(self):
   self.image = pygame.transform.rotozoom(self.original, self.new_angle, 1)

Но теперь изображение по-прежнему не будет вращаться в том же положении. Проблема в том, что ограничивающая рамка image меняется. При этом положение каждой точки image меняется. Вы не должны устанавливать положение self.rect в центре, потому что оно движется. Вместо этого вы должны обновить позицию в соответствии с изменением ограничительной рамки. Вы должны сравнить ограничивающий прямоугольник до и после поворота. У вас есть полный учебник по этой теме уже ответил здесь:

Поворот изображения вокруг его центра

* Если вы просто хотите сохранить изображение на месте (не поворачивая его вокруг центра), вы можете просто избавиться от центра .

 def rotate_lander(self):
   self.image = pygame.transform.rotozoom(self.image, self.new_angle, 1)
   self.rect = self.image.get_rect()
   screen.blit(self.image, self.rect)
...