pygame多关卡小游戏命悬一线之勇闯太空隧道_作者:李兴球_mask碰撞实例


import pygame

from pygame.locals import *


gamename = "《命悬一线之勇闯太空隧道》"
pygame.init()
pygame.mixer.init()
screenWidth ,screenHeight=480,360


screen = pygame.display.set_mode((screenWidth,screenHeight))
pygame.display.set_caption(gamename + "_作者:李兴球_mask碰撞实例")


failSound = pygame.mixer.Sound("Fail.wav")
hurtSound = pygame.mixer.Sound("hurt.wav")
succSound = pygame.mixer.Sound("小号胜利.wav")


def playmusic():
    pygame.mixer.music.load("TheAvengers.wav")
    pygame.mixer.music.play(-1,0)
    
def 开始界面():
    封面图= pygame.image.load("封面设计《命悬一线》.png")
    running = True
    while running:
        for event in pygame.event.get():
            if event.type==QUIT:pygame.quit()
            if event.type==KEYDOWN or event.type==MOUSEBUTTONDOWN:running = False
        screen.blit(封面图,(0,0))
        pygame.display.update()
    


class Ball():

   这是定义球类的代码,需要代码请和本人联系Q406273900



def main():
    #以下字典用来描述每个关卡的出口,四元组分别表示上,下,左,右,值为0时,表时没有出口,值为1时,表示有出口.
    #由于关卡号刚好从0,开始,所以用列表也可以.
    ed = {0:(0,0,0,1),1:(1,0,1,0),2:(0,1,0,1),3:(0,1,1,0),4:(1,0,0,0)}      #表示每关出口标志,上下左右
    关卡号  = 0
    
    背景1 = pygame.image.load("背景1.png").convert_alpha()
    背景2 = pygame.image.load("背景2.png").convert_alpha()
    背景3 = pygame.image.load("背景3.png").convert_alpha()
    背景4 = pygame.image.load("背景4.png").convert_alpha()
    背景5 = pygame.image.load("背景5.png").convert_alpha()
    背景列表= [背景1,背景2,背景3,背景4,背景5]    
    背景mask = [pygame.mask.from_surface(背景) for 背景 in 背景列表]


    小飞猫 = pygame.image.load("飞猫.png").convert_alpha()
    小飞猫右 =pygame.transform.scale(小飞猫,(30,20))
    小飞猫左 =pygame.transform.flip(小飞猫右,True,False)
    
    ball = Ball(小飞猫右,小飞猫左,30,280)
    
    clock = pygame.time.Clock()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:pygame.quit()
        keys = pygame.key.get_pressed()
        if keys[K_RIGHT]:ball.xspeed = ball.xspeed + 0.1;ball.image = ball.imageRight
        if keys[K_LEFT]:ball.xspeed = ball.xspeed - 0.1;ball.image  = ball.imageLeft
        if keys[K_DOWN]:ball.yspeed = ball.yspeed + 0.1
        if keys[K_UP]:ball.yspeed = ball.yspeed - 0.1
        mx,my = pygame.mouse.get_pos()
        screen.fill((0,0,0))
        screen.blit(背景列表[关卡号],(0,0))
        oldrect = ball.rect
        ball.move(1)
        if 关卡号==4 and ball.rect.x>400  and ball.rect.y>250 :running=False                                                 #到了最后一关,x坐标大于某个值时,成功闯关.
        point = 背景mask[关卡号].overlap(ball.mask,(ball.rect.x - 0,ball.rect.y -0))                   #mask碰撞           
        if point:
            ball.lifes = ball.lifes - 1                                                                 #碰到了蓝色,生命减去一
            if ball.lifes==0:running = False
            pygame.display.set_caption("第" + str(关卡号+1) +  "关,碰撞点:"  + str(point))         #碰到了蓝色,不能前进.
            ball.move(-1)
            ball.xspeed=0
            ball.yspeed=0
            hurtSound.play()
                                                  
        else:
            pygame.display.set_caption("第" + str(关卡号+1) + "关, "  + gamename + "_作者:李兴球_mask碰撞实例" + str(mx) + "," + str(my))
        t = ed[关卡号]
        if t[0] ==1:                      #说明此关上面有出口,如果没有碰到墙,并且y坐标小于等于0,那么进入下一关.
            if not point and ball.rect.y<=0:
                ball.rect.y = screenHeight
                if 关卡号 ==1:
                   关卡号=关卡号+1
                if 关卡号 ==4:
                    关卡号=关卡号-1
        if t[1] ==1:                      #说明此关下面有出口,如果没有碰到墙壁,则座标小于等于screenHeight,那么进入下一关
            if not point and ball.rect.y>=screenHeight :
                ball.rect.y = 1
                if 关卡号==2:
                   关卡号=关卡号-1
                if 关卡号==3:
                   关卡号=关卡号+1
                
        if t[2] ==1:                      #说明此关左边有出口,如果没有碰
             if not point and ball.rect.x<=0 :
                   关卡号=关卡号-1
                   ball.rect.x = screenWidth


        if t[3]==1:
             if not point and ball.rect.x>=screenWidth:
                 关卡号=关卡号+1
                 ball.rect.x=1           
        
        ball.draw()
        pygame.display.update()
        clock.tick(60)


    #停止背景音乐
    pygame.mixer.music.stop()
    笑脸图=pygame.image.load("笑脸.png")
    哭脸图=pygame.image.load("哭脸.png")
    f = pygame.font.Font("C:/windows/fonts/msyh.ttf",20)
    if ball.lifes==0 :       
        fontimage = f.render("游戏结束,你失败了!",True,(255,0,0))
        failSound.play()                                         #播放失败音效
    else:
        fontimage = f.render("游戏结束,你成功了!",True,(255,255,125))
        succSound.play()                                         #播放胜利音效
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:running=False
            if event.type ==MOUSEBUTTONDOWN:running=False
        screen.fill((0,0,0))
        if ball.lifes==0:
            screen.blit(哭脸图,(screenWidth//2-100,50))
        else:
            screen.blit(笑脸图,(screenWidth//2-80,50))
        screen.blit(fontimage,(screenWidth//2-100,80+screenHeight/2))
        pygame.display.update()
        
    pygame.quit()
    


if __name__ == "__main__":
    
    playmusic()
    开始界面()
    main()
    

猜你喜欢

转载自blog.csdn.net/avskya/article/details/81063051