Отскок объекта от стен при изменении цвета - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь закодировать счастливое лицо, чтобы отскакивать от стен и случайным образом менять цвет, когда оно падает на стену. В настоящее время я установил цвета и код, чтобы он отражался от стены и менял цвет. Но мой код не работает, так как он говорит: «NameError: имя 'xPos' не определено", даже если я его определил.

color = GREEN 
color2 = BLUE
color3 = RED

# funtion to draw a the "happy face"
# it has 4 parameters passed to it xPos, yPos, radius, and colour
# notice all the shapes are drawn "relative" to the xPos and yPos and the radius
def drawHappy(xPos,yPos,r,colour):
    pygame.draw.circle(screen,colour,(xPos,yPos),r,1)
    eyeRadius = int(1/6*r)
    eyeX = int(xPos-1/3*r)
    eyeY = int(yPos- 1/3*r)
    pygame.draw.circle(screen,colour,(eyeX,eyeY),eyeRadius,1)
    eyeX = int(xPos + 1/3*r)
    pygame.draw.circle(screen,colour,(eyeX,eyeY),eyeRadius,1)
    wMouth = 1.5*r
    xMouth = xPos - 3/4*r
    yMouth = yPos - 3/4*r
    pygame.draw.arc(screen,colour,(xMouth,yMouth,wMouth,wMouth),math.pi,2*math.pi,1)

def random_color():
    random_number = random.randint(1,3)
    if random_number == 1:
            return GREEN
    elif random_number ==2:
            return BLUE
    else:
            return RED

# set up clock to control frames per second
clock = pygame.time.Clock()
FPS = 120

# set main loop to True so it will run
main = True
# main loop
while main:
    for event in pygame.event.get():  # check for any events (i.e key press, mouse click etc.)
        if event.type == pygame.QUIT:  # check to see if it was "x" at top right of screen
            main = False # set the "main" variable to False to exit while loop

        xPos = xPos + dxPos
        yPos = yPos + dyPos

        if x >= 750:
                dx = -abs(dx)
                color = random_color()
        elif x <=50:
                dx = abs(dx)
                color = random_color()

        if y <= 50:
                dy = abs(dy)
                color = random_color()
        elif y >=550:
                dy = -abs(dy)
                color = random_color()

        if x2 >= 775:
                dx2 = -abs(dx2)
                color2 = random_color()
        elif x2 <= 25:
                dx2 = abs(dx2)

        if   y2 <= 25:
                dy2 = abs(dy2)
                color2 = random_color()
        elif y2 >= 575:
                dy2 = -abs(dy2)
                color2 = random_color()

        if   x3 >=700:
                dx3 = -abs(dx3)
                color3 = random_color()
        elif x3 <= 100:
                dx3 = abs(dx3)
                color3 = random_color()

        if   y3 <= 100:
                dy3 = abs(dy3)
                color3 = random_color()
        elif y3 >= 500:
                dy3 = -abs(dy3)
                color3 = random_color()

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Вероятно, это связано с тем, что на первой итерации основного, в то время как l oop первая ссылка на xPos равна xPos = xPos + dxPos, где xPos еще не определено!

0 голосов
/ 09 апреля 2020

Когда операторы xPos = xPos + dxPos, yPos = yPos + dyPos, затем сначала читаются переменные xPos и yPos, затем добавляются dxPos и dyPos и, наконец, результат присваивается xPos и yPos.
1-й шаг, чтение не удается, потому что переменные не определены до того, как они будут прочитаны. Определите переменные перед основным приложением l oop. Например:

xPos, yPos = 100, 100 

main = True
# main loop
while main:
    # [...]

Кроме того, в вашем приложении есть проблема Отступ . Вы должны выполнить логи c в приложении l oop, а не в событии l oop.
Далее вы должны добавить dx и dy вместо dxPos и dyPos.

# set main loop to True so it will run
main = True
# main loop
while main:
    for event in pygame.event.get():  # check for any events (i.e key press, mouse click etc.)
        if event.type == pygame.QUIT:  # check to see if it was "x" at top right of screen
            main = False # set the "main" variable to False to exit while loop

    # INDENTATION 
    #<--| 
    xPos = xPos + dx
    yPos = yPos + dy

    if x >= 750:
            dx = -abs(dx)
            color = random_color()
    elif x <=50:
            dx = abs(dx)
            color = random_color()

    if y <= 50:
            dy = abs(dy)
            color = random_color()
    elif y >=550:
            dy = -abs(dy)
            color = random_color()

    if x2 >= 775:
            dx2 = -abs(dx2)
            color2 = random_color()
    elif x2 <= 25:
            dx2 = abs(dx2)

    if   y2 <= 25:
            dy2 = abs(dy2)
            color2 = random_color()
    elif y2 >= 575:
            dy2 = -abs(dy2)
            color2 = random_color()

    if   x3 >=700:
            dx3 = -abs(dx3)
            color3 = random_color()
    elif x3 <= 100:
            dx3 = abs(dx3)
            color3 = random_color()

    if   y3 <= 100:
            dy3 = abs(dy3)
            color3 = random_color()
    elif y3 >= 500:
            dy3 = -abs(dy3)
            color3 = random_color()
0 голосов
/ 09 апреля 2020

Когда дело доходит до xPos = xPos + dxPos. Вы никогда не ставили xPos = 0. Поэтому все, что вам нужно сделать, это поставить xPos = 0 или все, что вы хотите, чтобы оно равнялось перед l oop. Это то же самое для yPos.

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