Как я могу создать случайные несколько экземпляров класса, используя Al oop? - PullRequest
1 голос
/ 07 февраля 2020

Я посмотрел во всем, но не могу найти, как наилучшим образом достичь своей цели программирования.

В настоящее время разрабатываю основы для физического движка для Pygame.

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

код класса:

class Ball:
    def __init__(self, radius, mass, colour):
        self.name = self
        self.radius = radius
        self.colour = colour
        self.mass = mass
        self.pos = [50, 50]
        self.vel = [0, 0]
        self.acc = [0, 0]
        self.forces = [0, 0]
        self.on_ground = False

    def get_pos(self):
        return self.pos[0], self.pos[1]

    def tick(self):
        self.forces = [0, GRAVITY]
        Ball.apply_force(self)
        Ball.update_attributes(self)
        pygame.draw.circle(screen, self.colour, (int(self.pos[0]), int(self.pos[1])), self.radius)

    def apply_force(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] == 1 and self.on_ground:
            self.forces[0] -= 0.2
        if keys[pygame.K_RIGHT] == 1 and self.on_ground:
            self.forces[0] += 0.2
        if keys[pygame.K_SPACE] == 1 and self.on_ground:
            self.on_ground = False
            self.forces[1] = -20
        if self.on_ground:
            self.forces[1] = 0
            if self.vel[0] > 0:
                self.forces[0] -= (abs(self.vel[0])) * 0.1
            else:
                self.forces[0] += (abs(self.vel[0])) * 0.1

    def update_attributes(self):
        self.acc = [self.forces[0] / self.mass, self.forces[1] / self.mass]
        self.vel = [self.vel[0] + self.acc[0], self.vel[1] + self.acc[1]]
        if (self.pos[1] + self.vel[1]) > (300-self.radius) and not self.on_ground:
            self.pos[1] = (300 - self.radius)
            self.vel[1] = 0
            self.on_ground = True
        else:
            self.pos[1] += self.vel[1]
        self.pos[0] += self.vel[0]

, в то время как l oop:

count = 0
name = ball_1
while running:
    pygame.time.delay(10)
    count += 1
    if count == 1000:
        #create instance here called name

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    blueBall.tick()
    redBall.tick()
    pygame.draw.rect(screen, (0, 200, 0), (0, 300, 1300, 200))
    pygame.display.update()
    screen.fill((100, 100, 255))

я хочу иметь возможность индексировать названия шаров, чтобы иметь к ним легкий доступ например, ball_1, ball_2, ball_3

Возможно ли это?

Ответы [ 3 ]

1 голос
/ 07 февраля 2020

я хочу иметь возможность создавать новый шар, используя класс Ball, который я создавал каждые 10 секунд

Создать пустой список шариков:

balls = []

Далее я рекомендую использовать таймер события. Используйте pygame.time.set_timer(), чтобы повторно создать USEREVENT. Например:

milliseconds_delay = 10000 # 10.0 seconds
ball_event = pygame.USEREVENT + 1
pygame.time.set_timer(ball_event, milliseconds_delay)

Обратите внимание, в Pygame могут быть определены события клиента. Каждому событию нужен уникальный идентификатор. Идентификаторы пользовательских событий должны начинаться с pygame.USEREVENT. В этом случае pygame.USEREVENT+1 - это идентификатор события таймера, который порождает шары.
Событие таймера можно остановить, передав 0 параметру времени.

Создать новый шар, когда событие происходит в случае l oop:

running = True
while running:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

         elif event.type == ball_event:

             radius = random.randint(minRad, maxRad)
             mass   = random.randint(minMass, maxMass)
             color  = random.choice([RED, BLUE, GREEN])
             balls.append(Ball(radius, mass, color))

    for ball in balls:
        ball.tick()
0 голосов
/ 07 февраля 2020

Используйте список для своих шаров.

balls = []
if count == 1000:
    balls.append(Ball(your_radius,your_mass,your_color))

И позже вы можете ссылаться на них в списке по их индексу:

balls[0].tick()
balls[1].apply_force()
etc.
0 голосов
/ 07 февраля 2020

Вы можете сделать что-то вроде следующего:

balls = [Ball(rand_radius, rand_mass, rand_color) for i in range(10)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...