Как я могу повернуть свой спрайт к игроку, даже если игрок меняет позицию - PullRequest
1 голос
/ 17 июня 2020

Итак, у меня есть спрайт, который стреляет снарядами, снарядами стреляют в игрока. Мне было интересно, как я могу заставить спрайт вращаться к игроку? ВИДЕО пули игрока атакуют игрока в какой бы позиции он ни находился, но как я могу заставить спрайт пушки делать то же самое ?

my класс пушки

    shotsright = pygame.image.load("canss.png")
    class enemyshoot:
        def __init__(self,x,y,height,width,color):
            self.x = x
            self.y =y
            self.height = height
            self.width = width
            self.color = color
            self.shootsright = pygame.image.load("canss.png")
            self.shootsright = pygame.transform.scale(self.shootsright,(self.shootsright.get_width()-150,self.shootsright.get_height()-150))            
            self.rect = pygame.Rect(x,y,height,width)
            self.health = 10
            self.hitbox = (self.x + -20, self.y + 30, 31, 57)
        def draw(self):
            self.rect.topleft = (self.x,self.y)
            window.blit(self.shootsright,self.rect)
            self.hits = (self.x + 20, self.y, 28,60)
            pygame.draw.rect(window, (255,0,0), (self.hitbox[0], self.hitbox[1] - 60, 50, 10)) # NEW
            pygame.draw.rect(window, (0,255,0), (self.hitbox[0], self.hitbox[1] - 60, 50 - (5 * (10 - self.health)), 10))
            self.hitbox = (self.x + 100, self.y + 200, 81, 87)


    black = (0,0,0)
    enemyshoots1 = enemyshoot(1100,10,100,100,black)        
    enemyshooting = [enemyshoots1]


мой полный код: скрипт

1 Ответ

3 голосов
/ 18 июня 2020

В принципе, вы можете просто повернуть изображение, чтобы указать на какую-то координату. Вы создаете вектор расстояния между вашей пушкой и игроком. Затем он преобразуется в угол с помощью функции Vector.as_polar(). Угол используется для поворота оригинальной копии растрового изображения на желаемый угол. Поворот изображения может быть довольно затратным для ЦП.

class enemyshoot:
    def __init__(self, x, y, height, width, color):
        [...]
        # Make a Reference Copy of the bitmap for later rotation
        self.original = pygame.image.load("canss.png")
        self.image    = self.original
        self.rect     = self.image.get_rect()
        self.position = pygame.math.Vector2( ( x, y ) )

    def lookAt( self, coordinate ):
        # Rotate image to point in the new direction
        delta_vector  = coordinate - self.position
        radius, angle = delta_vector.as_polar()
        self.image    = pygame.transform.rotozoom( self.original, -angle, 1 )
        # Re-set the bounding rectangle and position since 
        # the dimensions and centroid will have (probably) changed.
        current_pos      = self.rect.center
        self.rect        = self.image.get_rect()
        self.rect.center = current_pos

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

*

Еще одно примечание: мы вращаемся вокруг центральной точки растрового изображения. Но поворот изменяет размеры растрового изображения, а также меняет центральную точку. Так что это нужно пересчитать и сохранить.

Возможно, вам будет полезно кэшировать повернутые изображения после того, как они были повернуты, чтобы сэкономить CPU. Может быть, округлите угол до ближайших 10 градусов, а затем посмотрите, повернут ли он уже. Это также позволит вам предварительно повернуть все изображения и сохранить их в справочной таблице.

Изменить: вызов lookAt() положение мыши:

rotating cannon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...