Python Pygame 图层不显示或显示不可调用错误

Python Pygame Layers not displaying or showing not callabel error

我正在尝试使用 Pygame.Surface() 创建一个包含 2 层的游戏 但是,当我尝试这样做时,它要么只显示根层,要么 returns 一个对象不可调用错误。

下面的代码显示了根层,但没有别的

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()  

下面的代码显示了根层而不是第二层,returns 一个错误

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()

上面的代码returns下面的错误

>>> 
 RESTART: C:\Users\Alex\OneDrive\A- Levels COMPUTER SCIENCE\Python\test debug.py 
Traceback (most recent call last):
  File "C:\Users\Alex\OneDrive\A- Levels COMPUTER SCIENCE\Python\test debug.py", line 43, in <module>
    BaseLayer()
  File "C:\Users\Alex\OneDrive\A- Levels COMPUTER SCIENCE\Python\test debug.py", line 39, in BaseLayer
    GameLayer()
  File "C:\Users\Alex\OneDrive\A- Levels 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()

之前

我认为这不起作用的唯一原因是我尝试将层设置为显示图形的方式有问题,而单层显示工作正常

我在写了很长一段之后才注意到,您想要实现完全不同的目标。

这是您的第一段代码的简短解决方案。 按如下方式更改 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. 

出现对象不可调用错误是因为您在设置 pygame 显示之前尝试调用 "Game()" 函数(以及 "pygame.display.flip()" 函数)。

PS:尝试在函数外启动 window - 否则您将无法在 "Main()" 函数外访问它。

PPS: Per Python naming convention 函数应该是小写字母,下划线分隔单个单词。

停下你所做的一切,从头开始。

开始时,游戏的 "skeleton" 应如下所示:

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()(否则,请做好痛苦的准备)。

请注意,我们已经有一个名为 screenSurface。这是一个特殊的 Surface,因为它代表屏幕:一旦您用 pygame.display.update().

更新它,您在此 Surface 上绘制的所有内容都会显示在屏幕上

现在,拥有不同的图层并不困难,因为每个 Surface 的工作原理都相同。如果您希望屏幕的一部分是实际的游戏内容,另一部分是 GUI 或其他东西,只需创建更多表面,在上面绘制东西,然后将它们绘制到 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_partgui_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. If you do, note that pygame has a build in layer system for Sprites in the form of LayeredUpdates,但这超出了本 question/answer.

的范围

P.S.: 你的第一个代码不起作用,因为你没有在屏幕上画任何东西(在你的例子中,MainDisplay)。您的第二个示例不起作用,因为 pygame.surface 是一个模块。您正在寻找 pygame.surface.Surface(这是错误消息告诉您的内容)。