Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Pygame中创建暂停按钮?_Python_Python 2.7_Pygame - Fatal编程技术网

Python 如何在Pygame中创建暂停按钮?

Python 如何在Pygame中创建暂停按钮?,python,python-2.7,pygame,Python,Python 2.7,Pygame,我一直在尝试制作一个游戏,到目前为止,除了暂停按钮,按下按钮p应该暂停,按下S应该继续。我有点理解这个问题,一旦进入主代码的while循环,它就不会出来。我试着把暂停功能放在while循环中。如果可能的话,请提供帮助或提示进行修复,谢谢 import pygame # Colors BLACK = (0, 0, 0) WHITE = (255, 255, 255) Blue = (2,55,55) def recursive_draw(x, y, width, height):

我一直在尝试制作一个游戏,到目前为止,除了暂停按钮,按下按钮p应该暂停,按下S应该继续。我有点理解这个问题,一旦进入主代码的while循环,它就不会出来。我试着把暂停功能放在while循环中。如果可能的话,请提供帮助或提示进行修复,谢谢

import pygame

# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
Blue = (2,55,55)



def recursive_draw(x, y, width, height):
    """ Recursive rectangle function. """
    pygame.draw.rect(screen, WHITE,
                     [x, y, width, height],
                     1)
    speed = [10,0]
    rect_change_x = 10
    rect_change_y = 10




    # Is the rectangle wide enough to draw again?
    if (width > 25):
        # Scale down
        x += width * .1
        y += height * .1
        width *= .8
        height *= .8


               # Recursively draw again
        recursive_draw(x, y, width, height)

def recursive_draw2(x, y, width, height):
    """ Recursive rectangle function. """
    pygame.draw.rect(screen, Blue,
                     [x, y, width, height],
                     1)
    speed = [10,0]
    rect_change_x = 10
    rect_change_y = 10




    # Is the rectangle wide enough to draw again?
    if (width > 25):
        x += width * .1
        y += height * .1
        width *= .8
        height *= .8



               # Recursively draw again
        recursive_draw2(x, y, width, height)
def paused():
    screen.fill(black)

    largeText = pygame.font.SysFont("comicsansms",115)
    TextSurf, TextRect = text_objects("Paused", largeText)
    TextRect.center = ((display_width/2),(display_height/2))
    gameDisplay.blit(TextSurf, TextRect)


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

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

        #gameDisplay.fill(white)


        button("Continue",150,450,100,50,green,bright_green,unpause)
        button("Quit",550,450,100,50,red,bright_red,quitgame)

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


pygame.init()
#rectanglelist = [big()] 
# Set the height and width of the screen
size = [700, 500]
screen = pygame.display.set_mode(size)

pygame.display.set_caption("My Game")

# Loop until the user clicks the close button.
done = False

# Used to manage how fast the screen updates
clock = pygame.time.Clock()
black=(0,0,0)

end_it=False
time = 100

USEREVENT = 0

pygame.time.set_timer(USEREVENT+1, 10)
milliseconds = 0
seconds = 0
start_it = False
while (end_it==False):
    screen.fill(black)
    myfont=pygame.font.SysFont("Britannic Bold", 40)
    nlabel=myfont.render("Welcome to "+ " Jet shooter ", 1, (255, 0, 0))
    label=myfont.render("Click on the mouse to start ", 1, (255, 0, 0))
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            end_it=True

    screen.blit(nlabel,(200, 100))
    screen.blit(label, (170,300))
    pygame.display.flip()

while (start_it==False):

    screen.fill(black)
    myfont2=pygame.font.SysFont("Britannic Bold", 40)
    label2=myfont2.render("Ready?", 1, (255, 0, 0))
    screen.blit(label2, (300,250))
    pygame.display.flip()
    pygame.time.wait(3000)
    start_it = True
fall = False   
while (fall==False):
    nlist = [3,2,1]
    for i in (nlist):


        screen.fill(black)
        n = str(i)
        myfont3=pygame.font.SysFont("Britannic Bold", 40)
        score = myfont3.render(n,1,(255,0,0))
        screen.blit((score), (350,250))
        pygame.display.flip()
        pygame.time.wait(1000)
    screen.fill(black)
    myfont4=pygame.font.SysFont("Britannic Bold", 40)
    label4=myfont3.render("GOOO!!!", 1, (255, 0, 0))
    screen.blit(label4, (300,250))
    pygame.display.flip()
    pygame.time.wait (1000)

    fall = True
pause = 0             
b = 0

# -------- Main Program Loop -----------
while not done:
        for event in pygame.event.get():

             if event.type == pygame.KEYUP:
                 if event.key==K_p:
                     pause=True
                 if pause == True:
                     screen.fill(black)
                     font=pygame.font.SysFont("Britannic Bold", 40)
                     nlabelBB=myfont.render("Pause", 1, (255, 0, 0))
                     screen.blit(nlabelBB,(200, 100))
                     pygame.display.flip()



        # Set the screen background
        screen.fill(BLACK)
        flip = 1
        a = 0

    # ALL CODE TO DRAW SHOULD GO BELOW THIS COMMENT


        recursive_draw(0, 0, 700, 500)


        recursive_draw2(35,25, 625, 450)
**###I TRIED TO PUT THE PAUSE GAME HERE AND IF PRESSED P PAUSE AND S CONTINUE
        while  a == 0 :


            if flip == 1 :
                recursive_draw(35,25,625,450)
                recursive_draw2(0, 0, 700, 500)

                flip = flip + 1
                pygame.display.flip()
                if event.type == pygame.KEYUP:
                     if event.key==K_p:
                         a = 1
                         screen.fill(black)
                         font=pygame.font.SysFont("Britannic Bold", 40)
                         nlabelBB=myfont.render("Pause", 1, (255, 0, 0))
                         screen.blit(nlabelBB,(200, 100))
                         pygame.display.flip()
                     if event.key==K_s:
                         a = 0





            if flip == 2 :
                recursive_draw(0, 0, 700, 500)
                recursive_draw2(35, 25, 625, 450)

                flip = flip - 1
                pygame.display.flip()
                if event.type == pygame.KEYUP:
                     if event.key==K_p:
                         a = 1
                         screen.fill(black)
                         font=pygame.font.SysFont("Britannic Bold", 40)
                         nlabelBB=myfont.render("Pause", 1, (255, 0, 0))
                         screen.blit(nlabelBB,(200, 100))
                         pygame.display.flip()
                     if event.key==K_s:
                         a = 0**

        if event.type == pygame.QUIT:
            done = True





    # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT

    # Go ahead and update the screen with what we've drawn.
pygame.display.flip()

    # Limit to 60 frames per second
clock.tick(20)

# Be IDLE friendly. If you forget this line, the program will 'hang'
# on exit.
pygame.quit()

只需对所有内容使用单个游戏循环,并跟踪游戏的当前状态(例如主菜单、暂停屏幕、游戏场景)

下面是一个示例,我们通过一个名为
state
的简单变量跟踪状态,并在游戏循环中相应地执行操作:

import pygame, math, itertools

def magnitude(v): 
    return math.sqrt(sum(v[i]*v[i] for i in range(len(v))))

def sub(u, v):
    return [u[i]-v[i] for i in range(len(u))]

def normalize(v): 
    return [v[i]/magnitude(v)  for i in range(len(v))]

pygame.init()
screen = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()    

path = itertools.cycle([(26, 43), (105, 110), (45, 225), (145, 295), (266, 211), (178, 134), (250, 56), (147, 12)])
target = next(path)
ball, speed = pygame.rect.Rect(target[0], target[1], 10, 10), 3.6
pause_text = pygame.font.SysFont('Consolas', 32).render('Pause', True, pygame.color.Color('White'))

RUNNING, PAUSE = 0, 1
state = RUNNING

while True:
    for e in pygame.event.get():
        if e.type == pygame.QUIT: break
        if e.type == pygame.KEYDOWN:
            if e.key == pygame.K_p: state = PAUSE
            if e.key == pygame.K_s: state = RUNNING
    else:
        screen.fill((0, 0, 0))

        if state == RUNNING:
            target_vector = sub(target, ball.center) 

            if magnitude(target_vector) < 2: 
                target = next(path)
            else:
                ball.move_ip([c * speed for c in normalize(target_vector)])

            pygame.draw.rect(screen, pygame.color.Color('Yellow'), ball)

        elif state == PAUSE:
            screen.blit(pause_text, (100, 100))

        pygame.display.flip()
        clock.tick(60)
        continue
    break
导入pygame、数学、itertools
def量级(v):
返回math.sqrt(范围(len(v))中i的和(v[i]*v[i]))
def接头(u、v):
返回[u[i]-v[i]表示范围内的i(len(u))]
def正常化(v):
返回[v[i]/范围内i的幅值(v)(len(v))]
pygame.init()
screen=pygame.display.set_模式((300300))
clock=pygame.time.clock()
路径=itertools.循环([(26,43),(105,110),(45225),(145295),(266211),(178134),(250,56),(147,12)])
目标=下一个(路径)
球,速度=pygame.rect.rect(目标[0],目标[1],10,10),3.6
pause\u text=pygame.font.SysFont('Consolas',32).render('pause',True,pygame.color.color('White'))
正在运行,暂停=0,1
状态=运行
尽管如此:
对于pygame.event.get()中的e:
如果e.type==pygame.QUIT:break
如果e.type==pygame.KEYDOWN:
如果e.key==pygame.K\u p:state=PAUSE
如果e.key==pygame.K\s:state=RUNNING
其他:
屏幕填充((0,0,0))
如果状态==正在运行:
目标向量=子(目标、球、中心)
如果幅值(目标_矢量)<2:
目标=下一个(路径)
其他:
球移动ip([c*标准化中c的速度(目标向量)])
pygame.draw.rect(屏幕,pygame.color.color('Yellow'),球)
elif状态==暂停:
屏幕显示(暂停文本,(100100))
pygame.display.flip()
时钟滴答(60)
持续
打破
如您所见,矩形会一直移动,直到您按p键,这会将状态更改为“暂停”;现在将显示一条简单的消息,而不是进一步绘制/移动矩形

如果按S键,状态将切换回正常模式;所有这些都在一个游戏循环中完成

进一步阅读:

此链接可能有助于。。。