Как мне переместить несколько идентичных прямоугольников в списке отдельно? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь породить бесконечное количество врагов с заданной скоростью и заставить их двигаться к игроку. Тем не менее, я могу только заставить двух появиться, по одному на каждый исходный прямоугольник, где они появляются. Это потому, что движение перезаписывает прямоугольник, с которым они появляются, поэтому любые другие враги просто появляются поверх одного из первых двух. Это использует функцию move_ip (), которая, я думаю, может быть проблемой, но попытка просто использовать move () не приводит к движению вообще.

def main():
global DISPLAYSURF, FPSCLOCK

pygame.init()
FPSCLOCK = pygame.time.Clock()
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))
pygame.display.set_caption ('Ronin')
checkForQuit()

enemies = []
playerX = 730



enemyImage = pygame.image.load('enemyidle.png')
enemySurf = pygame.transform.scale(enemyImage, (PLAYERWIDTH, PLAYERHEIGHT))
leftRect = pygame.Rect(0, 735, PLAYERWIDTH, PLAYERHEIGHT)
rightRect = pygame.Rect(1500, 735, PLAYERWIDTH, PLAYERHEIGHT)
moveLeft = moveRight = moveUp = moveDown = False
enemycounter = 0

while True:

    checkForQuit()




    #Draw the background
    DISPLAYSURF.blit(backgroundSurf, backgroundRect)

    #draw the player
    DISPLAYSURF.blit(playerSurf, playerRect)


    #time the enemy spawn and draw the enemies


    enemy = random.choice([leftRect, rightRect])

    if enemycounter < ENEMYSPAWNRATE:
            enemycounter += 1
    if enemycounter == ENEMYSPAWNRATE:
            enemycounter = 0
            enemies.append(enemy)

    enemyAI(enemies, playerRect)

    for e in enemies:
        DISPLAYSURF.blit(enemySurf, e)



    pygame.display.update()
    FPSCLOCK.tick(FPS)






def enemyAI(enemies, playerRect):
    for e in enemies:
        if e.left > playerRect.right:
            e.move_ip(-1 * PLAYERSPEED +5, 0)
        if e.right < playerRect.left:
            e.move_ip(PLAYERSPEED -5, 0)



main()    

Я вижу в отладчике, что каждый новый враг, добавленный в список врагов, имеет те же координаты, что и один из первых двух существующих врагов. Но я хочу, чтобы они появлялись в исходных координатах, указанных в leftRect или rightRect.

1 Ответ

0 голосов
/ 07 января 2019

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

Поскольку enemy = random.choice(...) создает псевдоним для leftRect или rightRect, а поскольку у вас enemies.append(enemy), у вас есть список, состоящий из псевдонимов для тех же двух прямоугольников.

Попробуйте сделать .copy() прямоугольника после случайного выбора:

startLocations = (leftRect, rightRect)

def new_enemy():
    """Return a new enemy rect randomly in one of the start locations"""
    return random.choice(startLocations).copy()

while True:

    # ... as before ...

    #time the enemy spawn and draw the enemies
    if enemycounter < ENEMYSPAWNRATE:
        enemycounter += 1
    else:
        enemycounter = 0
        enemies.append(new_enemy())

    enemyAI(enemies, playerRect)

    # ... as before ...
...