Переменная присваивается в Pygame Ball Bounce Simulation - PullRequest
1 голос
/ 20 апреля 2019

Я пытаюсь выполнить симуляцию отскока мяча с помощью модуля Pygame в Python 3.7.3.Класс, который у меня есть, отображает шары, но не работает с движением.Ошибка: «локальная переменная x указана перед присваиванием».Я думаю, это означает, что он локальный, но должен быть глобальным, однако, чтобы иметь количество переменных в качестве переменной (поэтому я могу сказать, сколько нужно генерировать), я не знаю, как это исправить.

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

class BallEntity():
    def __init__(self, radius):
        x = random.randint(radius, win_width - radius)
        y = random.randint(radius, win_height - radius)
        pos = x, y
        pygame.draw.circle(win, (248, 24, 148), pos, radius)
        dx = random.randint(-5, 5)
        dy = random.randint(-5, 5)
        BallEntity.movement(self)

    def movement(self):
        if x <= r1 or x >= win_width - r1:
            dx = -dx
        elif x > r1 and x < win_width -r1:
            x += dx

        if y <= r1 or y >= win_height - r1:
            dy = -dy
        elif self.y > r1 and self.y < win_height -r1:
            y += dy


numbBalls = 8
r1 = 8
for i in range(numbBalls):
    BallEntity.__init__(i, r1)

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

1 Ответ

0 голосов
/ 20 апреля 2019
  • global win,x,y давайте удалим x не определено`
  • Кроме того, x, y используется во внутреннем class вместо global variable для различных точек окружности.

import random

import pygame, sys
import time
from pygame.locals import *

pygame.init()

win_width = 500
win_height = 400
radius = 90

win = pygame.display.set_mode((win_width, win_height), 0, 32)

class BallEntity():
    win = None

    x = 0
    y = 0

    dx = 1
    dy = 1

    radius = 0
    # preious position(used for delete previous circle after movement)
    prePos = 0, 0
    pos = 0, 0
    def __init__(self, i, radius):
        self.radius = radius

        # random position (x, y)
        self.x = random.randint(radius, win_width - radius)
        self.y = random.randint(radius, win_height - radius)

        self.dx = random.randint(-5, 5)
        self.dy = random.randint(-5, 5)

    def movement(self):
        global win

        if self.x <= r1 or self.x >= win_width - r1:
            self.dx = -self.dx
        elif self.x > r1 and self.x < win_width -r1:
            self.x += self.dx

        if self.y <= r1 or self.y >= win_height - r1:
            self.dy = -self.dy
        elif self.y > r1 and self.y < win_height -r1:
            self.y += self.dy

        self.pos = self.x, self.y
        # draw background color to delete previous position
        pygame.draw.circle(win, (0, 0, 0), self.prePos, self.radius)
        # draw circle
        pygame.draw.circle(win, (248, 24, 148), self.pos, self.radius)

        self.prePos = self.pos

numbBalls = 5
r1 = 8


balls = []



# Create balls and store list
for i in range(numbBalls):
    e = BallEntity(i, r1)
    balls.append(e)

while True:
    # update circle position via movement()
    for i in range(numbBalls):
        balls[i].movement()

    pygame.display.update()
    # delay for animation
    time.sleep(0.1)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...