Python Pygame Layers не отображает или не отображает ошибку callabel - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь создать игру с двумя слоями, используя Pygame.Surface() Однако, когда я пытаюсь сделать это, он либо показывает только корневой слой, либо возвращает объект, который не может быть вызван ошибкой.

Приведенный ниже код показывает корневой слой, но не более

def Pygame():
    #MainDisplay for background
    #GameDisplay for Game

    clock=pygame.time.Clock()

def Main(): #MAIN DISPLAY SETUP
    main_display_width=1280  #display width 1280
    main_display_height=600  #display height 600
    MainDisplay=pygame.display.set_mode((main_display_width,main_display_height)) #desplay setup
    pygame.display.set_caption("Dragon King: Legacy")
    black=(0,0,0)               #colour set
    MainDisplay.fill(black)     #colour set


def Game():
    game_display_height=600     #game layer display width
    game_display_width=600      #game layer display height

    gameDisplay=pygame.Surface((game_display_height,game_display_width))    
    white=(255,255,255)
    gameDisplay.fill(white)
    pygame.display.flip()

Game()
pygame.display.flip()
Main()

Pygame()  

Приведенный ниже код показывает корневой слой, но не второй, и возвращает ошибку

def BaseLayer():        #the layer the score will be located
    white=(255,255,255)
    size=(600,600)
    BaseLayer=pygame.display.set_mode(size)
    pygame.display.set_caption("Pygame")
    BaseLayer.fill(white)


def GameLayer():    #The layer the game will take place.
    size=(500,500)
    GameLayer=pygame.surface((500,500))
    screen.fill(0,0,0)

GameLayer()        

pygame.display.flip()

BaseLayer()

Приведенный выше код возвращает ошибку ниже

>>> 
 RESTART: C:\Users\Alex\OneDrive\A- Levels\1 COMPUTER SCIENCE\Python\test debug.py 
Traceback (most recent call last):
  File "C:\Users\Alex\OneDrive\A- Levels\1 COMPUTER SCIENCE\Python\test debug.py", line 43, in <module>
    BaseLayer()
  File "C:\Users\Alex\OneDrive\A- Levels\1 COMPUTER SCIENCE\Python\test debug.py", line 39, in BaseLayer
    GameLayer()
  File "C:\Users\Alex\OneDrive\A- Levels\1 COMPUTER SCIENCE\Python\test debug.py", line 36, in GameLayer
    GameLayer=pygame.surface((500,500))
TypeError: 'module' object is not callable
>>> 

приведенный ниже код работает и отображает изображение, но не имеет функции слоя

def Pygame():    # one layer working vertion
    white=(255,255,255)
    size=(600,600)
    screen=pygame.display.set_mode(size)
    pygame.display.set_caption("Testing")
    screen.fill(white)

    #dragon       #graphic I am using
def Dragon():
    #print("cows") #test to see if definition is being called properly 
    x=(100)
    y=(100)
    DragonIMG=pygame.image.load("Green Dragon.gif")
    screen.blit(DragonIMG,(x,y))
    pygame.Surface.blit

Dragon()
pygame.display.flip()
Pygame()

весь код имеет

import pygame

pygame.init()

до этого

единственная причина, по которой я могу думать, что это не работает, заключается в том, что что-то не так с тем, как я пытаюсь настроить слои, так как отображение графики и однослойного отображения работает нормально

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Остановите все, что вы делаете, и начните все заново.

При запуске «скелет» вашей игры должен выглядеть следующим образом:

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 (это то, что сообщается в сообщении об ошибке).

0 голосов
/ 27 сентября 2018

Я только что заметил после написания длинного абзаца, что вы хотели достичь чего-то совершенно другого.

Итак, вот краткое решение для вашего первого куска кода.Измените порядок вызовов функций Game () и Main () следующим образом:

Main() # creates the pygame window
pygame.display.flip() # displays the contents of the first layer
Game() # does something - but does NOT yet display your surface to the screen!
pygame.display.flip() # overwrites the contents of the first layer with the contents of the second layer. 

Появилась ошибка, не вызываемая объектом, потому что вы пытались вызвать функцию «Game ()» (а вместе с ней и «pygame.display.flip () "function) перед настройкой отображения pygame.

PS: попытайтесь инициировать окно вне функции - иначе вы не сможете получить к нему доступ вне функции «Main ()».

PPS: для Соглашение об именах Python функции должны состоять из строчных букв с подчеркиванием для разделения отдельных слов.

...