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成為真正的精靈并使用精靈組而不是列表來存儲它們,但我試圖不完全重寫您的代碼。
添加回答
舉報
