亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

pygame中的落沙,每次按下鼠標按鈕時都會創建和掉落粒子

pygame中的落沙,每次按下鼠標按鈕時都會創建和掉落粒子

炎炎設計 2022-06-02 16:20:26
我試圖制作一個代碼,每次點擊鼠標,都會繪制一個圓圈并將其放到底部。我對此有疑問,因為我想不出一個新粒子在下落時如何繪制。我不知道如何編碼,因此我至少需要知道如何做到這一點。這就是我所要做的,但我很困惑下一步該做什么。import pygame, timeclass Material(object):    def __init__(self, name, radius, gravity):        self.name = name        self.radius = radius        self.gravity = gravitysand = Material("Sand", 5, 2)def game():    pygame.init()    win = pygame.display.set_mode((1000, 650))    pygame.display.set_caption("***Sandbox***")    event = pygame.event.wait()    velocity = 0    while True:        for event in pygame.event.get():            if event.type == pygame.QUIT:                pygame.quit()             if pygame.mouse.get_pressed()[0]:                x, y = event.pos                print(event.pos)                pygame.draw.circle(win, (194, 178, 128), (x, y), sand.radius)                pygame.display.update()                while y >= 0 and y < 645:                    win.fill((0,0,0,))                    y += velocity                    velocity += sand.gravity                    print(x, y)                    if y > 645:                        y = 645                        velocity = 0                    pygame.draw.circle(win, (194, 178, 128), (x, y), sand.radius)                    pygame.display.update()game()
查看完整描述

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實例并將其添加到列表中。

  • 在主循環中移動繪圖邏輯。不要用循環將每個粒子一直移動到屏幕底部,而是在粒子列表上循環以將每個粒子向底部移動一步(即添加gravityy坐標)。

  • 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()

這是結果:

http://img1.sycdn.imooc.com//6298730700012df409980678.jpg

原則上可以進行進一步的編輯以使您Material成為真正的精靈并使用精靈組而不是列表來存儲它們,但我試圖不完全重寫您的代碼。



查看完整回答
反對 回復 2022-06-02
  • 1 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號