如何使粒子跟随我在pygame中的鼠标

问题描述

我正在尝试确保单击鼠标时出现的颗粒跟随鼠标移动。由于某种原因,这些粒子正好跟随我到左上方。谁能告诉我我在做什么错?

这是我的代码

import pygame
import sys
import random
import math

from pygame.locals import *
pygame.init()

clock = pygame.time.Clock()
screen = pygame.display.set_mode((500,500))
particles = []
while True:
    screen.fill((0,0))
    for event in pygame.event.get():
        if event.type == MOUSEBUTTONDOWN:
            mx,my = pygame.mouse.get_pos()
            particles.append([[pygame.Rect(mx,my,10,10)]])
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        
    for particle in particles:
        mx,my = pygame.mouse.get_pos()
        pygame.draw.rect(screen,(255,255,255),particle[0][0])
        radians = math.atan2((particle[0][0].y - my),(particle[0][0].x -mx))
        dy1 = math.sin(radians)
        dx1 = math.cos(radians)
        particle[0][0].x -= dx1
        particle[0][0].y -= dy1
    
    pygame.display.update()
    clock.tick(60)

解决方法

由于pygame.Rect存储整数值,导致了问题。如果添加浮点值,则小数部分将丢失,结果将被截断。 round解决问题的坐标:

particle[0][0].x = round(particle[0][0].x - dx1)
particle[0][0].y = round(particle[0][0].y - dy1)

请注意,将pygame.Rect对象添加到列表中,而不是将pygame.Rect列表中的列表添加到列表中即可:

particles.append([[pygame.Rect(mx,my,10,10)]])

particles.append(pygame.Rect(mx,10))

示例:

particles = []
while True:
    screen.fill((0,0))

    mx,my = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == MOUSEBUTTONDOWN:
            particles.append(pygame.Rect(mx,10))
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        
    for particle in particles:
        pygame.draw.rect(screen,(255,255,255),particle)
        radians = math.atan2(my - particle.y,mx - particle.x)
        particle.x = round(particle.x + math.cos(radians))
        particle.y = round(particle.y + math.sin(radians))

有关更复杂的方法,请参见How to make smooth movement in pygame

,

只需进行简单的调整即可

    dy1 = math.sin(radians) * 10
    dx1 = math.cos(radians) * 10

问题是,您尝试一次将粒子移动不到一个像素,这会导致粒子完全不移动并且移动丢失。