Остановите все, что вы делаете, и начните все заново.
При запуске «скелет» вашей игры должен выглядеть следующим образом:
import pygame
pygame.init()
WHITE = pygame.color.Color('white')
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
screen.fill(WHITE)
pygame.display.update()
clock.tick(60)
(Вы также должны использоватьmain
функция, но давайте будем простыми)
Теперь есть хороший, маленький игровой цикл.Обычно он содержит три вещи: обработку событий, обновление игровой логики и рисование на экране.Вы должны всегда вызывать pygame.display.update()
на каждую итерацию этого цикла (в противном случае подготовьтесь к боли).
Обратите внимание, что у нас уже есть один Surface
, называемый screen
.Это специальный Surface
, потому что он представляет экран: все, что вы рисуете на этом Surface
, будет отображаться на экране, как только вы обновите его с помощью pygame.display.update()
.
Теперь, наличие разных слоев несложно, потому что каждый Surface
работает одинаково.Если вы хотите, чтобы одна часть экрана отображала фактический игровой контент, а другая часть - графический пользовательский интерфейс или что-то еще, просто создайте больше поверхностей, нарисуйте на них материал, а затем перетяните их на поверхность screen
.
Посмотрите на это:
import pygame
pygame.init()
WHITE = pygame.color.Color('white')
GREY = pygame.color.Color('grey')
BLUE = pygame.color.Color('blue')
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
game_part = pygame.surface.Surface((800, 400))
game_part.fill(GREY)
gui_part = pygame.surface.Surface((800, 200))
game_part.fill(BLUE)
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
screen.fill(WHITE)
screen.blit(game_part, (0, 0))
screen.blit(gui_part, (0, 400))
pygame.display.update()
clock.tick(60)
Теперь мы можем свободно рисовать вещи на game_part
и gui_part
:
import pygame
import pygame.freetype
pygame.init()
WHITE = pygame.color.Color('white')
GREY = pygame.color.Color('grey')
BLUE = pygame.color.Color('blue')
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
game_part = pygame.surface.Surface((800, 400))
gui_part = pygame.surface.Surface((800, 200))
ball = pygame.rect.Rect((50, 50, 50, 50))
font = pygame.freetype.Font(None, 30)
running = True
while running:
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
screen.fill(WHITE)
game_part.fill(GREY)
gui_part.fill(BLUE)
# draw something of the game
ball.move_ip(5, 0)
if not game_part.get_rect().contains(ball):
ball.x = 0
pygame.draw.rect(game_part, WHITE, ball)
# draw something of the GUI
font.render_to(gui_part, (100, 100), 'Hello there!', WHITE)
screen.blit(game_part, (0, 0))
screen.blit(gui_part, (0, 400))
pygame.display.update()
clock.tick(60)
Пока все хорошо.Обратите внимание, что при игре вы, вероятно, захотите использовать Sprites
.Если вы это сделаете, обратите внимание, что Pygame имеет встроенную систему слоев для Sprites
в форме LayeredUpdates
, но это выходит за рамки этого вопроса / ответа.
PS: ваш первый код не работает, потому что вы ничего не рисуете на экране (в вашем случае, MainDisplay
).Ваш второй пример не работает, потому что pygame.surface
является модулем.Вы ищете pygame.surface.Surface
(это то, что сообщается в сообщении об ошибке).