在pygame中将播放器移动到鼠标的位置

时间:2018-10-10 11:51:04

标签: python pygame mouse move

我在屏幕中央有一个固定的播放器,现在我将背景和元素朝相反的方向移动,以产生用方向键向前移动的错觉。


但是现在,我想检测鼠标的位置并将玩家朝鼠标的方向移动(例如在游戏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 :(得分: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()