所以,我正在pygame中制作一个小行星游戏(这是我第一次使用pygame),并且正在尝试制作此介绍屏幕("启动启动")以及用户输入他们输入游戏的空间,但它行不通。图像文件只是黑色背景上的白色三角形(如果目录与程序相同的位置,我需要指定该目录吗?)
这是代码:
import pygame
import sys
class Player:
def __init__(self):
self.colour = (255, 255, 255)
self.x = 390
self.y = 290
self.shape = pygame.image.load('C:/Users/John Birch/Desktop/Python/playerimg.jpg')
def Input(self):
key = pygame.key.get_pressed()
dist = 3
if key[pygame.K_DOWN]:
self.y += dist
elif key[pygame.K_UP]:
self.y -= dist
elif key[pygame.K_LEFT]:
self.x -= dist
elif key[pygame.K_RIGHT]:
self.x += dist
class Menu:
def __init__(self):
self.score = 0
self.level = 0
self.font = pygame.font.SysFont('freesansbold', 60)
def Start(self):
start = menu.font.render("Press space to begin!", 1, (255, 255, 255))
return start
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
player = Player()
menu = Menu()
pygame.display.set_caption('Asteroidz')
if __name__ == '__main__':
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit(); sys.exit()
elif event.type == pygame.K_SPACE:
while True:
player.Input()
screen.blit(player.shape, (player.x, player.y))
clock.tick(40)
pygame.display.update()
start = menu.Start()
screen.blit(start, (190, 280))
pygame.display.update()
首先,在行 elif event.type == pygame.K_SPACE:
中,如果代替elif。然后,在下一行,为什么再次使用while True
?您已经循环了。另外,将clock.tick
移至主循环。为什么要两次打电话给pygame.display.update
?删除第一个通话。您在if event.type == pygame.K_SPACE:
接下来,创建一个函数来绘制文本:
def RenderText(Text, Font, Target, X, Y, R, G, B):
""""Text , font, target surface, X, Y,
and color (RGB)."""
RenderedText = Font.render(Text, True, (R, G, B))
Target.blit(RenderedText, (X, Y))
然后,从Menu
类中删除Start
方法,然后从循环中删除start = menu.Start()
和screen.blit(start, (190, 280))
。相反,要绘制文本,请使用刚刚定义的函数:
fontFreesandBold = pygame.font.SysFont('freesandbold', 35) # Size
在您的循环中:
RenderText('Press space to begin!', fontFreesandBold, screen, 190, 280, 255, 255, 255)
我理解为什么您将大量代码放在if event.type == pygame.K_SPACE:
中。您认为仅在按下空间后才能运行该代码。但是,不,它只会在按下 空间时运行,因此,在这里,我已经为您重新制作了整个代码;并评论了我所做的一切。通读它,我确定您会收到您的错误:(目前,我删除了播放器映像加载/绘图。先测试代码,然后添加它们来添加它们)
import pygame
import sys
from pygame.locals import *
# The above line imports all the local pygame variables
def RenderText(Text, Font, Target, X, Y, R, G, B):
"""Text , font, target surface, X, Y,
and color (RGB)."""
RenderedText = Font.render(Text, True, (R, G, B))
Target.blit(RenderedText, (X, Y))
class Player:
def __init__(self):
self.colour = (255, 255, 255)
self.x = 390
self.y = 290
# self.surface = pygame.image.load('C:/Users/John Birch/Desktop/Python/playerimg.jpg')
# Surface is more concise than shape, which could mean other stuff
def Input(self):
key = pygame.key.get_pressed()
dist = 3
if key[K_DOWN]:
self.y += dist
if key[K_UP]:
self.y -= dist
if key[K_LEFT]:
self.x -= dist
if key[K_RIGHT]:
self.x += dist
print('Player X/Y ', self.x, self.y) # To show that it's working
class Menu:
def __init__(self):
self.score = 0
self.level = 0
pygame.init()
screen = pygame.display.set_mode((800, 600))
screen.fill((255, 255, 255)) # Make the screen white
pygame.display.set_caption('Asteroidz')
clock = pygame.time.Clock()
player = Player()
# menu = Menu() # I commented this out because it's currently useless
fontFreesandBold = pygame.font.SysFont('freesandbold', 35) # Size
isGameStarted = False
# You don't need if name == main
# because your code is a single file
while True:
clock.tick(40)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit(); sys.exit()
if event.type == KEYDOWN:
if event.key == K_SPACE:
isGameStarted = True # Now the game has begun!
print('Game started : ', isGameStarted)
if not isGameStarted: # Will the game has not begun
RenderText('Press space to begin!', fontFreesandBold, screen, 190, 280,
255, 255, 255)
screen.fill((255, 255, 255)) # As an example, the screen will turn green when the game starts
if isGameStarted: # Now this code will run forever, once space has been pressed once
# Place all game code here
# PS try the arrow keys !
screen.fill((15, 200, 20))
player.Input()
# screen.blit(player.surface, (player.x, player.y))
pygame.display.update()