#python #pygame
Вопрос:
я начал новый проект на python с использованием pygame, и для фона я хочу, чтобы нижняя половина была заполнена серым цветом, а верхняя-черным. я уже использовал прямой рисунок в проектах раньше, но по какой-то причине он кажется сломанным? я не знаю, что я делаю не так. самое странное, что результат меняется каждый раз, когда я запускаю программу. иногда есть только черный экран, а иногда серый прямоугольник покрывает часть экрана, но никогда половину экрана.
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
Комментарии:
1. Где вы обновляете дисплей? (
pygame.display.update()
илиpygame.display.flip()
)2. Используйте это : pygame.display.update()
Ответ №1:
Вам нужно обновить дисплей. Вы на самом деле рисуете на Surface
объекте. Если вы рисуете на поверхности, связанной с дисплеем PyGame, это не сразу видно на дисплее. Изменения становятся заметными, когда на дисплее отображается либо pygame.display.update()
или pygame.display.flip()
.
Видеть pygame.display.flip()
:
Это приведет к обновлению содержимого всего дисплея.
В то время pygame.display.flip()
как будет обновляться содержимое всего дисплея, pygame.display.update()
позволяет обновлять только часть экрана до обновленного, а не всю область. pygame.display.update()
является оптимизированной версией pygame.display.flip()
для программных дисплеев, но не работает для дисплеев с аппаратным ускорением.
Типичный цикл приложений PyGame должен:
- обрабатывайте события, вызывая либо
pygame.event.pump()
илиpygame.event.get()
. - обновляйте игровые состояния и положения объектов в зависимости от входных событий и времени (соответственно кадров).
- очистите весь дисплей или нарисуйте фон
- нарисуйте всю сцену (нарисуйте все объекты)
- обновите дисплей, позвонив
pygame.display.update()
по одному илиpygame.display.flip()
- ограничьте количество кадров в секунду, чтобы ограничить загрузку процессора с помощью
pygame.time.Clock.tick
import pygame
from pygame.locals import *
pygame.init()
DISPLAY = pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
clock = pygame.time.Clock()
run = True
while run:
# handle events
for event in pygame.event.get():
if event.type == QUIT:
run = False
# clear display
DISPLAY.fill(0)
# draw scene
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))
# update display
pygame.display.flip()
# limit frames per second
clock.tick(60)
pygame.quit()
exit()
repl.it/@Rabbid76/PyGame-MinimalApplicationLoop Смотрите также Цикл событий и приложений
Комментарии:
1. @MinerBat, Похоже, это побочный эффект, связанный с тем, что вашей системе не хватает очистки и обновления дисплея. Для этого нет никакой логической причины. Внутреннее взаимодействие с системой также связано с обработкой событий. Видеть
pygame.event.pump()
.
Ответ №2:
просто измените свой код на:
import pygame, sys
from pygame.locals import *
pygame.init()
DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))
pygame.display.flip() #Refreshing screen
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
это должно помочь