Падающий песок в пигме, частицы создаются и падают при каждом нажатии кнопки мыши - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь создать код, где при каждом щелчке мыши рисуется круг и опускается вниз.У меня есть проблемы с этим, потому что я не могу думать о том, как можно нарисовать новую частицу, когда она падает.Я понятия не имею, как это кодировать, поэтому мне, по крайней мере, нужно знать, как это можно сделать.Это то, что я сделал, но я очень смущен, что делать дальше.

import pygame, time

class Material(object):

    def __init__(self, name, radius, gravity):
        self.name = name
        self.radius = radius
        self.gravity = gravity


sand = 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 Ответ

0 голосов
/ 23 сентября 2019

Объектно-ориентированное программирование - ваш друг в этом случае.Вы создали класс 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

В принципе, дляMaterial настоящий Sprite и использование группы спрайтов вместо списка для их хранения, но я попытался не полностью переписать ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...