сделать несколько объектов автоматически перемещаться на сколько объектов было указано в Pygame - PullRequest
2 голосов
/ 17 апреля 2019

Я создаю мозаичную игру, в которой есть 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, чтобы выбрать, какое движение делать. Я использую цикл для запуска каждого NPC. Я хотел бы знать, как разрешить этим прямоугольникам не перемещаться одинаково и чтобы позиция не могла в конечном итоге перейти в одну и ту же позицию и двигаться по-разному друг от друга. Я также хочу, чтобы он использовал словарь для этого.

1 Ответ

3 голосов
/ 17 апреля 2019

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

В вашем коде только направление генерируется для всех объектов, потому что 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

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