автоматическое перемещение нескольких объектов для того, сколько объектов было указано в pygame

#python #pygame

#python #pygame

Вопрос:

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

 import pygame, random, math

screen = pygame.display.set_mode((800,600)) 

NPCP = {'Bob' : (2,6), 'John' : (4,4)} # 25, 19 max width and height
pygame.time.set_timer(pygame.USEREVENT, (100))
sMove = True

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.USEREVENT:
            sMove = True
    screen.fill((0,0,255))
    for name in NPCP:
        x,y = NPCP.get(name)
        pygame.draw.rect(screen, (255,0,0), (x*32,y*32,50,50))
        if sMove == True:
            move = random.randint(1,4)
            sMove = False
        if move == 1:
            if math.floor(y) > 2:
                y -= 2
        if move == 2:
            if math.floor(y) < 17:
                y  = 2
        if move == 3:
            if math.floor(x) < 23:
                x  = 2
        if move == 4:
            if math.floor(x) > 2:
                x -= 2
        print(x,y)
        NPCP[name] = (x,y)

    pygame.display.flip()
 

В этом случае я использую словарь для создания этих NPC или прямоугольников. Я перемещаю их с помощью таймера и случайного числа в диапазоне от 1 до 4, чтобы выбрать, какое движение выполнить. Я использую цикл for для запуска для каждого NPC. Я хотел бы знать, как разрешить этим прямоугольникам не перемещаться одинаково и чтобы положение в конечном итоге не менялось на одно и то же положение и не отличалось друг от друга. Я также хочу, чтобы для этого использовался словарь.

Комментарии:

1. Они получают одинаковое положение, потому что движение ограничено границами экрана.

2. @Rabbid76 Я не думаю, что это происходит как «если math.floor (x) <23: » проверяется только, не исчезают ли прямоугольники с экрана. сам этот код вообще не изменяет x или y, но то, что он выполняет, перемещает объект

3. Конечно, это так. Если достигнута граница экрана, перемещение не выполняется, но другой объект все равно перемещается!

4. Пропустите sMove = False , и объекты будут перемещаться по отдельности.

5. @Rabbid76 Я использовал sMove с таймером для определения времени, чтобы он не распространялся по экрану. Но если возникает эта проблема, есть ли другой способ замедлить прямоугольники

Ответ №1:

Если вы хотите перемещать объекты по отдельности, вам нужно сгенерировать случайное направление для каждого объекта.

В вашем коде для всех объектов генерируется только направление on, поскольку sMove оно устанавливается False сразу после того, как было сгенерировано направление для первого объекта. Это направление используется для всех объектов.
Далее направление перемещения ( move ) никогда не сбрасывается на 0. Это приводит к тому, что последнее случайное направление применяется во всех последующих кадрах, пока направление не изменится снова.

 if sMove == True:
    move = random.randint(1,4)
    sMove = False
 

Сбросить sMove сброс move после цикла и, чтобы решить проблему:

 for name in NPCP:
    x,y = NPCP.get(name)
    pygame.draw.rect(screen, (255,0,0), (x*32,y*32,50,50))
    if sMove == True:
        move = random.randint(1,4)
    if move == 1:
        if math.floor(y) > 2:
            y -= 2
    if move == 2:
        if math.floor(y) < 16:
            y  = 2
    if move == 3:
        if math.floor(x) < 22:
            x  = 2
    if move == 4:
        if math.floor(x) > 2:
            x -= 2
    print(x,y)
    NPCP[name] = (x,y)

sMove = False # wait for next timer
move = 0      # stop moving