#python #pygame #rectangles
#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()
это должно помочь