Pygame Asteroidz计划问题



所以,我正在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()

最新更新