Pygame: Изображение преследует курсор мыши с определенной длины

Изначально изображение начинает двигаться в направлении (0,0). Во время каждого кадра объект смотрит на текущее положение курсора с помощью pygame.mouse.get_pos() и обновляет его направление до direction = .9*direction + v, где v - вектор длиной 10, который указывает от центра вашего изображения до положения мыши.

вот что у меня есть:

    from __future__ import division
import pygame
import sys
import math
from pygame.locals import *


class Cat(object):
    def __init__(self):
        self.image = pygame.image.load('ball.png')
        self.x = 1
        self.y = 1

    def draw(self, surface):
        mosx = 0
        mosy = 0
        x,y = pygame.mouse.get_pos()
        mosx = (x - self.x)
        mosy = (y - self.y)
        self.x = 0.9*self.x + mosx
        self.y = 0.9*self.y + mosy
        surface.blit(self.image, (self.x, self.y))
        pygame.display.update()


pygame.init()
screen = pygame.display.set_mode((800,600))
cat = Cat()
Clock = pygame.time.Clock()

running = True
while running:
    screen.fill((255,255,255))
    cat.draw(screen)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    pygame.display.update()
    Clock.tick(40)

Проблема в том, что когда я запускаю код, изображение перемещается вместе с курсором мыши, а не после него. Как я могу это улучшить?


person A01066656    schedule 14.03.2019    source источник


Ответы (1)


Если вы хотите, чтобы изображение немного двигалось в направлении мыши, вам нужно добавить вектор к текущей позиции изображения, который указывает в направлении мыши. Длина должна быть меньше расстояния до мыши:

dx, dy = (x - self.x), (y - self.y)
self.x, self.y = self.x + dx * 0.1, self.y + dy * 0.1 

это приводит к тому, что мяч делает небольшой шаг к мыши в каждом кадре.

class Cat(object):
    def __init__(self):
        self.image = pygame.image.load('ball.png')
        self.x = 1
        self.y = 1
        self.t = 0.1

    def draw(self, surface):
        mosx = 0
        mosy = 0
        x,y = pygame.mouse.get_pos()
        dx, dy = (x - self.x), (y - self.y)
        self.x, self.y = self.x + dx * self.t, self.y + dy * self.t
        w, h = self.image.get_size()
        surface.blit(self.image, (self.x - w/2, self.y - h/2))
        pygame.display.update()

Минимальный пример:  repl.it/@Rabbid76/PyGame-FollowMouse

2

См. Также Двигаться к цели

person Rabbid76    schedule 14.03.2019