Как заставить мой плеер вращаться в направлении мыши? - PullRequest
1 голос
/ 17 июня 2019

В основном мне нужно заставить игрока стоять перед указателем мыши, и хотя я вижу, что что-то происходит, это совсем не то, что мне нужно.

Я знаю, что об этом уже спрашивали, но пытаюсь реализоватьэти ответы, похоже, не работают.Так что, если кто-то сможет просмотреть мой код и, возможно, сказать мне, где я запутался, это будет очень ценно!

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 Ответ

2 голосов
/ 17 июня 2019

То, что вы хотите сделать, зависит от того, какая часть плеера (сверху или справа и т. Д.) Должна быть ориентирована на мышь.

Не вычисляйте и не суммируйте относительные углы.Вычислите векторную форму от игрока до мыши:

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

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