Python 如何使我的播放器朝着鼠标位置旋转?

Python 如何使我的播放器朝着鼠标位置旋转?,python,pygame,Python,Pygame,基本上我需要让玩家面对鼠标指针,虽然我可以看到一些事情正在发生,但这根本不是我需要的 我知道以前有人问过这个问题,但试图实现这些答案似乎不起作用。所以,如果有人能看一下我的代码,也许能告诉我哪里出了问题,那将不胜感激 class Player(pygame.sprite.Sprite): def __init__(self, game, x, y): self._layer = PLAYER_LAYER self.groups = game.all_spr

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

我知道以前有人问过这个问题,但试图实现这些答案似乎不起作用。所以,如果有人能看一下我的代码,也许能告诉我哪里出了问题,那将不胜感激

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)

将我的播放机放在左上角,没有相机偏移,这样可以进行旋转,但如果放在其他位置,则会将其拧紧。

您想做什么取决于播放机的哪个部分(顶部或右侧等)应朝向鼠标

不要计算和求和相对角度。计算从播放器到鼠标的矢量:

player_x,player_y=#玩家的位置
鼠标x,鼠标y=pygame.mouse.get\u pos()
dir_x,dir_y=鼠标_x-player_x,鼠标_y-player_y
矢量的角度可以通过以下公式计算。角度必须相对于球员的基本方向进行计算

e、 g

播放器的右侧朝向鼠标:

angle=(180/math.pi)*math.atan2(-dir\u y,dir\u x)
播放器的顶部朝向鼠标:

angle=(180/math.pi)*math.atan2(-dir\ux,-dir\uy)
可以使用校正角度设置基本对齐。例如,45对于右上角的玩家:

angle=(180/math.pi)*math.atan2(-dir\u y,dir\u x)-45
方法
update
可能如下所示:

def更新(自):
self.pos+=self.vel*self.game.dt
鼠标x,鼠标y=pygame.mouse.get\u pos()
player_x,player_y=self.pos
dir_x,dir_y=鼠标_x-player_x,鼠标_y-player_y
#self.rot=(180/math.pi)*math.atan2(-dir\u y,dir\u x)
#self.rot=(180/math.pi)*math.atan2(-dir_y,dir_x)-45
self.rot=(180/math.pi)*math.atan2(-dir\ux,-dir\uy)
self.image=pygame.transform.rotate(self.game.player\u img,self.rot)
self.rect=self.image.get_rect()
self.rect.center=self.pos
最简单的例子:


这似乎更限制了我的旋转,降低到45度以下。我将检查我的代码,看看是否有其他东西干扰了旋转,因为我以前使用箭头键来旋转。有趣的是,我让僵尸面对玩家没有问题。谢谢你的快速回复@Thoft“这似乎更限制了我的旋转,降低到45度以下”,然后你做了一些完全错误的事情。当然,我已经测试了他们的代码。确保
player_x
player_y
是正确的。我已经用我的实现更新了我的问题(很抱歉使用了太多的代码,只是想确保你能看到足够的内容)“那么你做了一些完全错误的事情”毫无疑问。我从来没有说过你的代码有什么问题,只是它似乎不适合我:)我对编码和堆栈溢出都是新手,希望你能忍受me@Thoft代码应该有用,对我有用。当您
打印(dir\u x,dir\u y)
时,方向是否正常?在旋转图像之前更新
self.pos
,但这可能只会导致一个小的修正。dir_x和dir_y似乎在工作,尽管在我移动角色(不移动鼠标)时由于相机滚动而发生了更改…不确定这是否是一个问题?