问题描述
我是编码和堆栈交换方面的新手。我一直在尝试让此代码运行基于教程的游戏,但它一直显示为黑屏。我认为这可能与间距有关?谁能帮我?我相信这段代码也可以被简化,所以任何关于这方面的建议也将不胜感激。
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 应用程序循环必须:
- 通过
pygame.event.pump()
或pygame.event.get()
处理事件。 - 根据输入事件和时间(分别为帧)更新游戏状态和对象位置
- 清除整个显示或绘制背景
- 绘制整个场景(
blit
所有对象) - 通过
pygame.display.update()
或pygame.display.flip()
更新显示 - 限制每秒帧数以限制 CPU 使用率
另请参见 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
完成申请:
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()