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

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

问题描述:

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

I'm trying to make sure that the particles that arise when I click my mouse follow my mouse. For some reason, the particles just follow me to the top left. Can anyone tell me what I am doing wrong?

这是我的代码:

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,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)

之所以引起该问题,是因为 round 所得到的坐标来解决问题:

The issue is caused, because pygame.Rect stores integral values. If you add an floating point value, then the fraction part gets lost and the result is truncated. round the resulting coordinates to solve the issue:

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


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


Note, it is sufficient to append a pygame.Rect object to the list, rather than a list of a list of pygame.Rect:

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

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


示例:


Example:

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

    mx, my = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == MOUSEBUTTONDOWN:
            particles.append(pygame.Rect(mx, my, 10, 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))


有关更复杂的方法,请参见如何在pygame中流畅移动