Pygame制作一个对象追踪鼠标

3

我已经花了几个小时的时间制作一个小程序,让一张图片追逐鼠标指针。目前为止,我已经实现了使图片直接在鼠标指针上方并跟随其移动的功能。然而,我需要的是让图片实际上"追逐"鼠标指针,所以它需要最初离开鼠标指针并在追逐鼠标指针后最终到达鼠标指针上方。

基本上,在找出问题和需要修复的地方上遇到了障碍,以下是我目前的成果:

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)

也许代码并不是最好的状态,我已经折腾了五个小时以上。非常感谢任何帮助!谢谢 :)


遗憾的是,可运行的代码片段仅适用于JS / HTML代码,而不适用于Python。因此,请将Python格式化为代码,而不是可运行的代码片段。(我已为您编辑过了。) - abarnert
谢谢!第一次发布,不太确定,但我很感激 :) - Kscar
我不理解那些代码行的作用是什么。为什么你要两次执行 self.x += 2,甚至一次也不需要吗?为什么你要将 mosxmosy 存储为实例属性,当它们只在 draw 中本地使用?最重要的是,.9 * x + mosx 应该是做什么用的? - abarnert
另外,您希望猫以固定速度移动,还是随着光标越远移动得更快? - abarnert
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Kscar
我修改了上面的代码,现在的代码就是我一直在努力工作的。 - Kscar
1个回答

2
假设您希望猫以固定速度移动,例如每个tick X像素,您需要选择一个新位置,该位置离鼠标光标向前X像素。(如果您希望猫在靠近时移动得更慢,则应选择当前位置和鼠标光标之间某个百分比的位置。如果您希望它越靠近时移动得更快,则需要除法而非乘法。等等。但让我们先从简单的开始。)
现在,如何将X像素向鼠标光标移动?通常描述的方法是:找到从当前位置到光标的方向向量,然后将其乘以X,这将给出要添加的步骤。而您可以将其简化为不需要更高级的平方根操作:
# Vector from me to cursor
dx = cursor_x - me_x
dy = cursor_y - me_y

# Unit vector in the same direction
distance = math.sqrt(dx*dx + dy*dy)
dx /= distance
dy /= distance

# speed-pixel vector in the same direction
dx *= speed
dy *= speed

# And now we move:
me_x += dx
me_y += dy

请注意,me_xme_y将是浮点数,而不是整数。这是一件好事;当你每步向东北移动2个像素时,实际上是向北1.414个像素和向东1.414个像素。如果你将其四舍五入为每步1个像素,那么当你斜着走时速度会比竖直方向慢41%,看起来有些傻。

谢谢!现在图像确实会追踪光标,唯一遇到的问题是图像移动得非常缓慢,我尝试了从5到200的速度值。我遇到的第二个问题是当光标在图像上方时,特别是在较高的速度下,图像会出现异常并在光标的两侧显示两次。有什么想法吗? - Kscar
速度为200时,每1/40秒走200像素。因此,在1920x1680的屏幕上,它应该在四分之一秒内跨过整个屏幕。它跳来跳去意味着问题可能是您在某个地方使用了错误的变量。显然要做的事情是记录每一步的所有值。第一步后,dxdy应该为几百像素,在第二步后应该在-1到1之间,在第三步后应该在-speed和speed之间;第一个不正确的值将缩小问题的范围。 - abarnert
哈哈,问题解决了。原来速度部分两次都用了dx,只需将其中一个改为dy,就可以完美地运行了!非常感谢 :) - Kscar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接