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()