Переместите игрока в положение мыши в пигме

1

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


Но теперь я хочу определить положение мыши и сместить игрока в направлении мыши (например, в игре 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

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


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

  • 0
    Пожалуйста, покажите нам минимальный, полный и проверяемый пример .
  • 0
    Я предлагаю узнать больше о тригонометрии и векторах, например, на khanacademy.org .
Показать ещё 1 комментарий
Теги:
pygame
mouse
move

1 ответ

2

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

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()
  • 2
    Примечание. В текущем выпуске Vector2 также pygame.Vector2 в pygame.Vector2 в дополнение к pygame.math.Vector2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню