如何使播放器向鼠标位置旋转?

时间:2019-06-17 08:21:48

标签: python pygame

基本上,我需要让玩家面对鼠标指针,尽管我可以看到正在发生的事情,但这根本不是我所需要的。

我知道之前已经有人问过这个问题,但是尝试实现这些答案似乎没有用。因此,如果有人可以查看我的代码,甚至告诉我我在哪里搞砸,那将不胜感激!

class Player(pygame.sprite.Sprite):
    def __init__(self, game, x, y):
        self._layer = PLAYER_LAYER
        self.groups = game.all_sprites
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.image = game.player_img
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.hit_rect = PLAYER_HIT_RECT
        self.hit_rect.center = self.rect.center
        self.vel = vec(0, 0)
        self.pos = vec(x, y)
        self.rot = 0
    def update(self):
        rel_x, rel_y = pygame.mouse.get_pos() - self.pos
        self.rot = -math.degrees(math.atan2(rel_y, rel_x))
        self.image = pygame.transform.rotate(self.game.player_img, self.rot)
        self.rect = self.image.get_rect()
        self.rect.center = self.pos
        self.pos += self.vel * self.game.dt

class Camera:
    def __init__(self, width, height):
        self.camera = pygame.Rect(0, 0, width, height)
        self.width = width
        self.height = height

    def apply(self, entity):
        return entity.rect.move(self.camera.topleft)

    def apply_rect(self, rect):
        return rect.move(self.camera.topleft)

    def update(self, target):
        x = -target.rect.centerx + int(WIDTH / 2)
        y = -target.rect.centery + int(HEIGHT / 2)

        x = min(-TILESIZE, x)
        y = min(-TILESIZE, y)
        x = max(-(self.width - WIDTH - TILESIZE), x)
        y = max(-(self.height - HEIGHT - TILESIZE), y)
        self.camera = pygame.Rect(x, y, self.width, self.height)

将播放器放在没有摄像机偏移的左上角,可以进行旋转,但是当放置在其他位置时,它会拧紧。

1 个答案:

答案 0 :(得分:2)

您要执行的操作取决于将播放器的哪一部分(顶部或右侧等)对准鼠标。

不计算和求和相对角度。计算从玩家到鼠标的向量:

player_x, player_y = # position of the player
mouse_x, mouse_y   = pygame.mouse.get_pos()

dir_x, dir_y = mouse_x - player_x, mouse_y - player_y

向量的角度可以通过math.atan2计算。角度必须相对于玩家的基本方向进行计算。

例如

播放器的右侧对准鼠标:

angle = (180 / math.pi) * math.atan2(-dir_y, dir_x)

播放器的顶部对准鼠标:

angle = (180 / math.pi) * math.atan2(-dir_x, -dir_y)

也可以通过偏移角度来设置基本方向。例如播放器的右上角:

angle = (180 / math.pi) * math.atan2(-dir_y, dir_x) - 45

方法update可能看起来像这样:

def update(self):
    self.pos += self.vel * self.game.dt

    mouse_x, mouse_y = pygame.mouse.get_pos()
    player_x, player_y = self.pos

    dir_x, dir_y = mouse_x - player_x, mouse_y - player_y

    #self.rot = (180 / math.pi) * math.atan2(-dir_y, dir_x)
    #self.rot = (180 / math.pi) * math.atan2(-dir_y, dir_x) - 45
    self.rot = (180 / math.pi) * math.atan2(-dir_x, -dir_y)

    self.image = pygame.transform.rotate(self.game.player_img, self.rot)
    self.rect = self.image.get_rect()
    self.rect.center = self.pos