在游戏循环,Python2和Pygame中实现主菜单

时间:2016-03-20 16:51:18

标签: python pygame game-loop

此刻我的游戏存在问题,游戏运行正常。然而,当我添加我的主菜单时,它不起作用,它会加载它但是当你按下播放时没有任何事情发生(它不会在游戏中停留在那里)。我附上了简单主菜单的图像([1]:http://i.stack.imgur.com/YKY9q.jpg)。我的代码如下,谢谢:

import pygame, sys, Funk
from tileC import Tile
from object_classes import *
from interaction import interaction
from A_Star import A_Star
import time


pygame.init()
pygame.font.init()
pygame.mixer.init()

pygame.mixer.music.load('audio/zombie_theme.ogg')
pygame.mixer.music.play(-1)

screen = pygame.display.set_mode((704, 448)) # 32, 32

Tile.pre_init(screen)

clock = pygame.time.Clock()
FPS = 30
total_frames = 0
dungeon = pygame.image.load('images/dungeon.jpg')
survivor = Survivor(32 * 2, 32 * 4)
intro = True

# colours

black = (0,0,0)
white = (255,255,255)
red = (200,0,0)
green = (0,200,0)
orange = (255,127,0)
grey = (50,50,50)
bright_red = (255,0,0)
bright_green = (0,255,0)
bright_orange = (255,215,0)


def text_objects(text, font):
    textSurface = font.render(text, True, (white))
    return textSurface, textSurface.get_rect()

def message_display(text):
    largeText = pygame.font.Font('Creepster-Regular.ttf',115)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((704/2),(448/2))
    gameDisplay.blit(TextSurf, TextRect,)

def button(msg,x,y,w,h,ic,ac,action=None):

    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(screen, (ac), (x, y, w, h))
        if click[0] == 1 and action != None:
            if action == "start":
                return
            if action == "end":
                pygame.quit()
                sys.exit()

    else:
        pygame.draw.rect(screen, (ic), (x, y, w, h))



    smallText = pygame.font.SysFont("monospace.ttf",20)
    textSurf, textRect = text_objects(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    screen.blit(textSurf, textRect)





def game_intro():

   intro = True

   while intro:
       for event in pygame.event.get():

           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()

       screen.fill(grey)
       largeText = pygame.font.SysFont('Creepster-Regular.ttf',45)
       TextSurf, TextRect = text_objects("2D Tile Based Zombie Game",   largeText)
       TextRect.center = ((704/2),(448/2))
       screen.blit(TextSurf, TextRect)

       button("Play",100,300,100,50,green,bright_green,"start")
       button("Controls",300,300,100,50,orange,bright_orange, "how to play")
       button("Quit",500,300,100,50,red,bright_red, "end")


       pygame.display.update()
       clock.tick(15)
       #break





game_intro()

while True:

    screen.blit(dungeon, (0,0) )

    Zombie.spawn(total_frames, FPS)
    Zombie.update(screen, survivor)

    survivor.movement()

    Bullet.super_massive_jumbo_loop(screen)

    A_Star(screen, survivor, total_frames, FPS)
    interaction(screen, survivor)

    survivor.draw(screen)

    Funk.text_to_screen(screen, 'Health: {0}'.format(survivor.health), 0,0)
    Funk.text_to_screen(screen, 'Score: {0}'.format(survivor.score), 0,15)
    Funk.text_to_screen(screen, 'FPS {0}'.format(FPS), 0,30)
    pygame.display.flip()
    clock.tick(FPS)
    total_frames += 1

    if survivor.health <= 0:
        time.sleep(1)
        screen.blit(pygame.image.load('images/dead.jpg'), (0,0))
        pygame.display.update()
        screen.fill(black)
        Funk.text_to_screen(screen, "You scored {0} points!".format(survivor.score),704/2, 448/2, size = 50)
        break


    time.sleep(4)

1 个答案:

答案 0 :(得分:0)

看起来您正在关注this tutorial ....

单击“播放”时,您的按钮没有执行任何操作,它只会返回。

def button(msg,x,y,w,h,ic,ac,action=None):

    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(screen, (ac), (x, y, w, h))
        if click[0] == 1 and action != None:
            if action == "start":
                return               ### Fix here
            if action == "end":
                pygame.quit()
                sys.exit()

但是,你真的应该为你的行动定义一种方法。

def start_game():
    # TODO: Implement
    print("Starting game")

def how_to_play():
    # TODO: Implement
    print("How to")

def quit_game():
     pygame.quit()
     sys.exit()

button方法(来自教程)中,您只需要调用该操作。

if x+w > mouse[0] > x and y+h > mouse[1] > y:
    pygame.draw.rect(gameDisplay, ac,(x,y,w,h))

    if click[0] == 1 and action != None:
        action()    

然后您可以将方法附加到按钮而不是字符串。

 button("Play",100,300,100,50,green,bright_green,start_game)
 button("Controls",300,300,100,50,orange,bright_orange, how_to_play)
 button("Quit",500,300,100,50,red,bright_red, quit_game)