微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的游戏代码在 pygame 上显示为黑屏?

如何解决为什么我的游戏代码在 pygame 上显示为黑屏?

我是编码和堆栈交换方面的新手。我一直在尝试让此代码运行基于教程的游戏,但它一直显示为黑屏。我认为这可能与间距有关?谁能帮我?我相信这段代码也可以被简化,所以任何关于这方面的建议也将不胜感激。

import pygame
import random
    from pygame.locals import (
        RLEACCEL,K_UP,K_DOWN,K_LEFT,K_RIGHT,K_ESCAPE,KEYDOWN,QUIT,)
    
    pygame.init()
    
    SCREEN_WIDTH = 800
    SCREEN_HEIGHT = 600
    
    screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
    
    running = True
    
    while running:
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    running = False
    
            elif event.type == QUIT:
                running = False
    
    screen.fill((255,255,255))
    
    surf = pygame.Surface((50,50))
    
    surf.fill((0,0))
    rect = surf.get_rect()
    
    screen.blit(surf,(SCREEN_WIDTH/2,SCREEN_HEIGHT/2))
    pygame.display.flip()
    
    surf_center = (
        (SCREEN_WIDTH-surf.get_width())/2,(SCREEN_HEIGHT-surf.get_height())/2
    )
    
    screen.blit(surf,surf_center)
    pygame.display.flip()
    
    class Player(pygame.sprite.Sprite):
        def __init__(self):
            super(Player,self).__init__()
            self.surf = pygame.image.load("Jake.anime.png").convert()
            self.surf.set_colorkey((255,255),RLEACCEL)
            self.rect = self.surf.get_rect()
    
    player = Player()
    
    screen.fill((0,0))
    screen.blit(player.surf,player.rect)
    
    pygame.display.flip()
    
    pressed_keys = pygame.key.get_pressed()
    
    def update(self,pressed_keys):
        if presed_keys[K_UP]:
            self.rect.move_ip(0,-5)
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0,5)
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-5,0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(5,0)
    
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        if self.rect.top <= 0:
            self.rect.top = 0
        if self.rect.bottom >= SCREEN_HEIGHT:
            self.rect.bottom = SCREEN_HEIGHT
    
    while running:
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                running = False
            elif event.type == QUIT:
                running = False
    
        pressed_keys = pygame.key.get_pressed()
        player.update(pressed_keys)
        screen.fill((0,0))
    
    class Enemy(pygame.sprite.Sprite):
        def __init__(self):
            super(Enemy,self).__init__()
            self.surf = pygame.image.load("graham.enemy.png").convert()
            self.surf.set_colorkey((255,RLEACCEL)
            self.rect = self.surf.get_rect(
                center=(
                    random.randint(SCREEN_WIDTH + 20,SCREEN_WIDTH + 100),random.randint(0,SCREEN_HEIGHT),)
            )
            self.speed = random.randint(5,20)
    
        def update(self):
            self.rect.move_ip(-self.speed,0)
            if self.rect.right < 0:
                self.kill()
    
    class Cloud(pygame.sprite.Sprite):
        def __init__(self):
            super(Cloud,self).__init__()
            self.surf = pygame.image.load("cloud for game.png").convert()
            self.surf.set_colorkey((0,0),)
            )
    
        def update(self):
            self.rect.move_ip(-5,0)
            if self.rect.right < 0:
                self.kill()
                
    
    player = Player()
    enemies = pygame.sprite.Group()
    clouds = pygame.sprite.Group()
    all_sprites = pygame.sprite.Group()
    all_sprites.add(player)
    
    running = True
    
    screen.fill((0,0))
    
    for entity in all_sprites:
        screen.blit(entity.surf,entity.rect)
    
    pygame.display.flip()
    
    screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
    
    ADDENEMY = pygame.USEREVENT + 1
    pygame.time.set_timer(ADDENEMY,250)
    ADDCLOUD = pygame.USEREVENT +2
    pygame.time.set_timer(ADDCLOUD,1000)
    
    player = Player()
    
    while running:
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    running = False
                elif event.type == QUIT:
                    running = False
                elif event.type == ADDENEMY:
                    new_enemy = Enemy()
                    enemies.add(new_enemy)
                    all_sprites.add(new_enemy)
                elif event.type ==ADDCLOUD:
                    new_cloud = Cloud()
                    clouds.add(new_cloud)
                    all_sprites.add(new_cloud)
    
        pressed_keys = pygame.key.get_pressed()
        player.update(pressed_keys)
        enemies.update()
        clouds.update()
    
    screen.fill((135,206,250))
    
    for entity in all_sprites:
        screen.blit(entity.surf,entity.rect)
    if pygame.sprite.spritecollideany(player,enemies):
        player.kill()
        running = False
    

解决方法

您有多个 while running 循环并且最后没有调用 pygame.display.update 来绘制所有内容。您应该有一个循环来检查事件、更新所有内容并绘制所有内容。

while running:
  get_events()
  update()
  draw()

将每个事物的所有代码移动到其自己的函数中。冲突检查将在 update() 结束时进行。此外,我不确定您为什么要缩进 from pygame.locals 导入,它应该左对齐,类定义也应该如此。

,

您需要重构您的程序。仅编写 1 个应用程序循环。典型的 PyGame 应用程序循环必须:

另请参见 Python Pygame Introduction 并查看以下示例以了解最小应用程序循环:

import pygame
pygame.init()

window = pygame.display.set_mode((500,500))
clock = pygame.time.Clock()

# main application loop
run = True
while run:

    # limit frames per second
    clock.tick(60)

    # event loop
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # clear the display
    window.fill(0)

    # draw the scene   
    pygame.draw.circle(window,(255,0),(250,250),100)

    # update the display
    pygame.display.flip()

pygame.quit()
exit()

repl.it/@Rabbid76/PyGame-MinimalApplicationLoop

另见Event and application loop


完成申请:

import pygame
import random

from pygame.locals import (
    RLEACCEL,K_UP,K_DOWN,K_LEFT,K_RIGHT,K_ESCAPE,KEYDOWN,QUIT,)

pygame.init()

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player,self).__init__()
        self.surf = pygame.image.load("Jake.anime.png").convert()
        self.surf.set_colorkey((255,255,255),RLEACCEL)
        self.rect = self.surf.get_rect()

    def update(self,pressed_keys):
        if pressed_keys[K_UP]:
            self.rect.move_ip(0,-5)
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0,5)
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-5,0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(5,0)

        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > SCREEN_WIDTH:
            self.rect.right = SCREEN_WIDTH
        if self.rect.top <= 0:
            self.rect.top = 0
        if self.rect.bottom >= SCREEN_HEIGHT:
            self.rect.bottom = SCREEN_HEIGHT

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy,self).__init__()
        self.surf = pygame.image.load("graham.enemy.png").convert()
        self.surf.set_colorkey((255,RLEACCEL)
        self.rect = self.surf.get_rect(
            center=(
                random.randint(SCREEN_WIDTH + 20,SCREEN_WIDTH + 100),random.randint(0,SCREEN_HEIGHT),)
        )
        self.speed = random.randint(5,20)

    def update(self):
        self.rect.move_ip(-self.speed,0)
        if self.rect.right < 0:
            self.kill()

class Cloud(pygame.sprite.Sprite):
    def __init__(self):
        super(Cloud,self).__init__()
        self.surf = pygame.image.load("cloud for game.png").convert()
        self.surf.set_colorkey((0,)
        )

    def update(self):
        self.rect.move_ip(-5,0)
        if self.rect.right < 0:
            self.kill()
            

player = Player()
enemies = pygame.sprite.Group()
clouds = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)

ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY,250)
ADDCLOUD = pygame.USEREVENT +2
pygame.time.set_timer(ADDCLOUD,1000)

clock = pygame.time.Clock()
running = True
while running:

    # limit frames per second
    clock.tick(60)

    # event loop
    for event in pygame.event.get():
        if event.type == QUIT:
                running = False
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False    
        if event.type == ADDENEMY:
            new_enemy = Enemy()
            enemies.add(new_enemy)
            all_sprites.add(new_enemy)
        elif event.type ==ADDCLOUD:
            new_cloud = Cloud()
            clouds.add(new_cloud)
            all_sprites.add(new_cloud)

    # update objects
    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)
    enemies.update()
    clouds.update()

    # clear the display
    screen.fill((135,206,250))

    # draw the scene   
    for entity in all_sprites:
        screen.blit(entity.surf,entity.rect)
    if pygame.sprite.spritecollideany(player,enemies):
        player.kill()
        running = False
    screen.blit(player.surf,player.rect)

    # update the display
    pygame.display.flip()

pygame.quit()
exit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。