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