Цикл внутри основного цикла в Pygame - PullRequest
0 голосов
/ 09 октября 2018

Я довольно новичок в Python и Pygame.Я пытаюсь сделать простую игру на практике.Моя проблема в том, как сделать цикл (или много циклов) внутри основного цикла игры, чтобы графика также обновлялась внутри дополнительных циклов?Например, у меня есть кнопка и прямоугольник, если я нажимаю на кнопку, я хочу, чтобы прямоугольник двигался по экрану.Вещи, которые я пробовал:

  • Еще один цикл while, он работает, но прямоугольник не «перемещается» и просто появляется везде, где завершается цикл
  • Пользовательское событие, однако оно либоработает один раз за кадр или непрерывно в случае функции set_timer ()

Вот мой код:

import pygame as pg
pg.init()
clock = pg.time.Clock()
running = True
window = pg.display.set_mode((640, 480))
window.fill((255, 255, 255))
btn = pg.Rect(0, 0, 100, 30)
rect1 = pg.Rect(0, 30, 100, 100)

while running:
    clock.tick(60)
    window.fill((255, 255, 255))
    for e in pg.event.get():
        if e.type == pg.MOUSEBUTTONDOWN:
            (mouseX, mouseY) = pg.mouse.get_pos()
            if(btn.collidepoint((mouseX, mouseY))):
                rect1.x = rect1.x + 1
        if e.type == pg.QUIT:
            running = False
    #end event handling

    pg.draw.rect(window, (255, 0, 255), rect1, 1)
    pg.draw.rect(window, (0, 255, 255), btn)

    pg.display.flip()

#end main loop
pg.quit()

Любая помощь очень ценится

1 Ответ

0 голосов
/ 09 октября 2018

Вы должны реализовать какое-то состояние.Обычно вы используете класс Sprite, но в вашем случае подойдет простая переменная.


Взгляните на этот пример:

import pygame as pg
pg.init()
clock = pg.time.Clock()
running = True
window = pg.display.set_mode((640, 480))
window.fill((255, 255, 255))
btn = pg.Rect(0, 0, 100, 30)
rect1 = pg.Rect(0, 30, 100, 100)

move_it = False
move_direction = 1

while running:
    clock.tick(60)
    window.fill((255, 255, 255))
    for e in pg.event.get():
        if e.type == pg.MOUSEBUTTONDOWN:
            (mouseX, mouseY) = pg.mouse.get_pos()
            if(btn.collidepoint((mouseX, mouseY))):
                move_it = not move_it

        if e.type == pg.QUIT:
            running = False
    #end event handling

    if move_it:
        rect1.move_ip(move_direction * 5, 0)
        if not window.get_rect().contains(rect1):
            move_direction = move_direction * -1
            rect1.move_ip(move_direction * 5, 0)

    pg.draw.rect(window, (255, 0, 255), rect1, 1)
    pg.draw.rect(window, (255, 0, 0) if move_it else (0, 255, 255), btn)

    pg.display.flip()

#end main loop
pg.quit()

Когда кнопканажата, мы просто установили флаг move_it.Затем в основном цикле мы проверяем, установлен ли этот флаг, и затем перемещаем Rect.


enter image description here


Вы должны избегать создания нескольких логических циклов (извините, у меня нет лучшего слова) в вашей игре;увидеть проблемы, которые вы упомянули.Стремитесь к одному главному циклу, который выполняет три вещи: обработку ввода, игровую логику и рисование.

...