1 回答

TA贡献1155条经验 获得超0个赞
在这种情况下,面向对象编程是你的朋友。你已经创建了一个类Material
,但你并没有充分利用它,因为你从不创建多个类的实例。
首先,让你的类存储落下的沙子的坐标,我想说这是本例中最重要的属性,因为每个沙子都有自己的坐标。
class Material(object): def __init__(self, name, pos, radius, gravity): self.name = name self.x = pos[0] self.y = pos[1] self.radius = radius self.gravity = gravity
然后在您的代码中创建一个列表(开头为空),您将在其中存储Material
在程序执行期间创建的所有实例。
您的game
函数需要多次编辑:
首先,使用事件
pygame.MOUSEBUTTONUP
,而不是pygame.mouse.get_pressed()
。由于您处于事件循环中,因此最好使用 pygame 事件系统。绘制材料的逻辑应该在事件循环之外。事件循环应该只创建一个
Material
实例并将其添加到列表中。在主循环中移动绘图逻辑。不要用循环将每个粒子一直移动到屏幕底部,而是在粒子列表上循环以将每个粒子向底部移动一步(即添加
gravity
到y
坐标)。pygame.quit()
关闭 pygame,但不关闭程序。用于sys.exit()
无错误退出程序。添加pygame.time.Clock以减慢动画速度。
所以你的最终代码应该是这样的:
import sys
import pygame
class Material(object):
def __init__(self, name, pos, radius, gravity):
self.name = name
self.x = pos[0]
self.y = pos[1]
self.radius = radius
self.gravity = gravity
allsands = []
def game():
pygame.init()
win = pygame.display.set_mode((1000, 650))
pygame.display.set_caption("***Sandbox***")
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONUP:
print(event.pos)
allsands.append(Material("Sand", event.pos, 5, 2))
win.fill((0,0,0,))
for sand in allsands:
pygame.draw.circle(win, (194, 178, 128), (sand.x, sand.y), sand.radius)
if sand.y >=0 and sand.y < 645:
sand.y += sand.gravity
pygame.display.update()
clock.tick(50)
game()
这是结果:
原则上可以进行进一步的编辑以使您Material
成为真正的精灵并使用精灵组而不是列表来存储它们,但我试图不完全重写您的代码。
添加回答
举报