问题描述
我正在尝试确保单击鼠标时出现的颗粒跟随鼠标移动。由于某种原因,这些粒子正好跟随我到左上方。谁能告诉我我在做什么错?
这是我的代码:
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
问题是,您尝试一次将粒子移动不到一个像素,这会导致粒子完全不移动并且移动丢失。