基本上,我需要让玩家面对鼠标指针,尽管我可以看到正在发生的事情,但这根本不是我所需要的。
我知道之前已经有人问过这个问题,但是尝试实现这些答案似乎没有用。因此,如果有人可以查看我的代码,甚至告诉我我在哪里搞砸,那将不胜感激!
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)
将播放器放在没有摄像机偏移的左上角,可以进行旋转,但是当放置在其他位置时,它会拧紧。
答案 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