Объектно-ориентированное программирование - ваш друг в этом случае.Вы создали класс 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()
Вот результат:
![enter image description here](https://i.stack.imgur.com/MEnF6.gif)
В принципе, дляMaterial
настоящий Sprite и использование группы спрайтов вместо списка для их хранения, но я попытался не полностью переписать ваш код.