Переместите игрока в положение мыши в Pygame - PullRequest
0 голосов
/ 10 октября 2018

У меня есть фиксированный игрок в центре экрана, и на данный момент я перемещаю фон и элементы в противоположном направлении, чтобы создать иллюзию движения вперед с помощью клавиш со стрелками.


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

Моя программа работает следующим образом:

keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
    if y_max > -1000:
        y_max -= int(player_1.speed * dt)
        bg_y += int(player_1.speed * dt)
        if bg_y > 0:
            bg_y = -400
if keys[pygame.K_DOWN]:
    if y_max < 1000:
        y_max += int(player_1.speed * dt)
        bg_y -= int(player_1.speed * dt)
        if bg_y < -HEIGHT:
            bg_y = -400
if keys[pygame.K_LEFT]:
    if x_max > -1000:
        x_max -= int(player_1.speed * dt)
        bg_x += int(player_1.speed * dt)
        if bg_x > 0:
            bg_x = -400
if keys[pygame.K_RIGHT]:
    if x_max < 1000:
        x_max += int(player_1.speed * dt)
        bg_x -= int(player_1.speed * dt)
        if bg_x < -WIDTH:
            bg_x = -400

Я обнаружил, что это помогает, но яне понимаю, как это работает:

dX, dY = pygame.mouse.get_pos()
rotation = math.atan2(dY - (float(HEIGHT) / 2), dX - (float(WIDTH) / 2)) * 180 / math.pi

и, возможно, мне нужно использовать синус и косинус, но я не знаю, как?


Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 10 октября 2018

Заставить объект следовать за мышью довольно легко, если вы знаете, как использовать векторы.Вам просто нужно создать вектор, который указывает на цель (в данном случае на мышь), вычитая целевую позицию из позиции объекта:

heading = pg.mouse.get_pos() - self.pos  # self.pos is a pygame.math.Vector2

Затем переместите объект, добавив этот вектор к его объекту.вектор положения:

self.pos += heading * 0.1
self.rect.center = self.pos  # Update the rect of the sprite as well.

Я также масштабирую вектор heading, иначе он сразу же переместится к цели.Умножив его на 0,1, мы получим десятую часть расстояния до цели (длины вектора курса).

Вот минимальный полный пример:

import pygame as pg
from pygame.math import Vector2


class Entity(pg.sprite.Sprite):

    def __init__(self, pos, *groups):
        super().__init__(*groups)
        self.image = pg.Surface((30, 30))
        self.image.fill(pg.Color('dodgerblue1'))
        self.rect = self.image.get_rect(center=pos)
        self.pos = Vector2(pos)

    def update(self):
        # Get a vector that points from the position to the target.
        heading = pg.mouse.get_pos() - self.pos
        self.pos += heading * 0.1  # Scale the vector to the desired length.
        self.rect.center = self.pos


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    all_sprites = pg.sprite.Group()
    entity = Entity((100, 300), all_sprites)

    while True:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                return

        all_sprites.update()

        screen.fill((30, 30, 30))
        all_sprites.draw(screen)

        pg.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()

Вот версия без векторов и спрайтов, если вы не знакомы с ними.Он работает почти так же, как и код выше.

import pygame as pg
from pygame.math import Vector2


def main():
    pg.init()
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    image = pg.Surface((30, 30))
    image.fill(pg.Color('dodgerblue1'))
    x, y = 300, 200  # Actual position.
    rect = image.get_rect(center=(x, y))  # Blit position.

    while True:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                return

        mouse_pos = pg.mouse.get_pos()
        # x and y distances to the target.
        run = (mouse_pos[0] - x) * 0.1  # Scale it to the desired length.
        rise = (mouse_pos[1] - y) * 0.1
        # Update the position.
        x += run
        y += rise
        rect.center = x, y

        screen.fill((30, 30, 30))
        screen.blit(image, rect)

        pg.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    main()
    pg.quit()
...