только последняя итерация списка в цикле for вступает в силу, когда в цикле while [Python, Pygame] для pacman game, как мне это исправить? - PullRequest
0 голосов
/ 04 октября 2019

Попытка заставить импортированный csv из rects в Pygame перебрать список кортежей в цикле for в основном игровом цикле, чтобы добавить коллизию с rects в списке. Только последний прямоугольник в списке имеет коллизию, что означает, что в цикле игры учитываются только параметры последнего кортежа.

    while gameExit == False:
    for event in pygame.event.get():
        if event.type == QUIT:
            gameExit = True
        #Gets keypresses and moves the player accordingly
        if event.type == pygame.KEYDOWN:
            #print(str(event.key))
            if event.key == pygame.K_LEFT:
                xChange = -playersize/2
                yChange = 0
                #print(str(x)+", "+str(y))
            elif event.key == pygame.K_RIGHT:
                xChange = playersize/2
                yChange = 0
                #print(str(x)+", "+str(y))
            elif event.key == pygame.K_UP:
                yChange = -playersize/2
                xChange = 0
                #print(str(x)+", "+str(y))
            elif event.key == pygame.K_DOWN:
                yChange = playersize/2
                xChange = 0
        """
        #Make player stop moving after keyup
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or pygame.K_RIGHT:
                xChange = 0
            if event.key == pygame.K_UP or pygame.K_DOWN:
                yChange = 0
        """
    #if player goes out of bounds then move them to the other side of the screen
    if pacX > width or pacX < 0 or pacY > height or pacY < 0: 
        if pacX > width: pacX = 0
        if pacX < 0: pacX = width - playersize
        if pacY > height: pacY = 0
        if pacY < 0: pacY = height - playersize

    #is the movement selected going to intersect with a boundary?
    #THIS IS THE FOR LOOP REFERENCED ABOVE

        for coord in xy:
            x = float(coord[0])
            y = float(coord[1])
            rectwidth = float(coord[2])
            rectheight = float(coord[3])

            if pacX+xChange > round(x-playersize) and pacX+xChange < round(x+rectwidth) and pacY+yChange > round(y-playersize) and pacY+yChange < round(y+rectheight):
                touching = True
            else:
                touching = False


    #if not touching a boundary then allow move

    if not touching:
        pacX += xChange
        pacY += yChange
    elif touching == True:
        pass
        #print("Sorry, that's out of bounds...")



    #draw everything on the display
    DISPLAY.fill(grey)
    pygame.draw.rect(DISPLAY,yellow,[pacX,pacY,playersize,playersize])
    buildlevel(xy,DISPLAY,darkBlue)
    pygame.display.update()
    clock.tick(fps)

pygame.quit()
sys.exit()

CSV FILE: (Каждый из них является параметрами координат и размеров для пигмеяМетод .draw.rect () в pygame. Каждая строка хранится как один кортеж в списке xy.)


100 100 100 100
200 200 100 100
300 300 100 100
300 300 100 100
400 400 100 100

1 Ответ

1 голос
/ 04 октября 2019

Если мы приведем ваш пример к псевдо (python) -коду, он будет выглядеть примерно так:

for block in blocks:
    if collide(player, block):
        touching = True
    else:
        touching = False

Если вы сейчас сделаете это, либо в уме, либо с помощью отладчика, вы поймете,касание устанавливается каждый раз при выполнении тела цикла, перезаписывая предыдущее значение. Чтобы исправить это, установите только touching = True в теле цикла.

for block in blocks:
    if collide(player, block):
        touching = True

Но теперь touching, возможно, не было инициализировано. Это можно исправить, установив touching = False перед циклом:

touching = False
for block in blocks:
    if collide(player, block):
        touching = True
...