|
发表于 2020-3-7 20:13:47
|
显示全部楼层
import pygame,os,sys,math,time,random
from pygame.locals import *
#分析飞机大战:
#1.开始界面: 背景,标题,按钮 ,底部动画,背景音乐music
# 开始界面类:
# 属性: 图片 , 屏幕
# 方法: 显示
#开始界面 图片
startImgs=[
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk2.jpg"),(640,825)), #开始界面背景图
pygame.image.load(r"Game_Main\Img_File\title2.png"), #开始界面标题
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\icon2.png"), (220, 60)), #开始按钮图标
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\loading.png"),(640,640)), #背景衬托图 透明圆
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\music_stop.png"),(45,45)), #音乐暂停按钮
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\music_start.png"),(45,45)), #音乐开始按钮
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\mouse3.png"),(30,30)), #鼠标指针
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\icon2.png"),(284,82)), #开始按钮图标 变换图
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk1.png"),(640,850)), #850-825 #游戏内背景1
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk4.png"),(640,850)), #游戏内背景2
# pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bk6.jpeg"),(640,825)), #载入界面图
]
#加载界面底部四张图 组成动画效果
statBotImg=[
pygame.image.load(r"Game_Main\Img_File\1.png"),
pygame.image.load(r"Game_Main\Img_File\2.png"),
pygame.image.load(r"Game_Main\Img_File\3.png"),
pygame.image.load(r"Game_Main\Img_File\4.png"),
pygame.image.load(r"Game_Main\Img_File\5.png"),
pygame.image.load(r"Game_Main\Img_File\6.png"),
pygame.image.load(r"Game_Main\Img_File\7.png"),
pygame.image.load(r"Game_Main\Img_File\8.png"),
pygame.image.load(r"Game_Main\Img_File\9.png"),
pygame.image.load(r"Game_Main\Img_File\10.png"),
pygame.image.load(r"Game_Main\Img_File\11.png"),
]
#开始界面类
class StartPanel:
#判断鼠标是否在开始游戏按钮上
isIn_Start=False
#判断鼠标是否在BGM按钮上
isIn_BGM=False
#判断是否暂停BGM
isOn_BGM=True
def __init__(self,screen,imgs=startImgs):
self.screen=screen
self.imgs=imgs
# self.btmimgs=btmimgs
#控制标题浮动
self.sin_y=0
#显示开始界面
def Show(self):
self.screen.blit(self.imgs[0],(0,0))
#背景:
#开始界面 游戏标题 如果鼠标停留 标题回到初始位置
Place_title=self.screen.blit(self.imgs[1],(180+30*math.cos(self.sin_y),100+50*math.sin(self.sin_y)))
tempC=Place_title.collidepoint(pygame.mouse.get_pos())
self.sin_y += 0.05
if self.sin_y>=100: #约束变量累加过大 产生的系统卡顿
self.sin_y=0
elif tempC:
Place_title=tempC
#BGM开关
if StartPanel.isOn_BGM==True:
Place_BGM=self.screen.blit(self.imgs[4], (30, 740))
tempA = Place_BGM.collidepoint(pygame.mouse.get_pos())
StartPanel.isIn_BGM = tempA
else:
Place_BGM = self.screen.blit(self.imgs[5], (33, 743))
tempA = Place_BGM.collidepoint(pygame.mouse.get_pos())
StartPanel.isIn_BGM = tempA
#开始界面 开始按钮
Place_StartBtm=self.screen.blit(self.imgs[2],(210,350))
tempB=Place_StartBtm.collidepoint(pygame.mouse.get_pos())
StartPanel.isIn_Start=tempB
# self.isIn_Start=tempB
if StartPanel.isIn_Start:
# if self.isIn_Start:
self.screen.blit(self.imgs[7], (185, 340))
#开始界面 背景衬托图 透明圆
self.screen.blit(self.imgs[3],(0,66))
# 鼠标指针
temp=pygame.mouse.get_pos()
self.screen.blit(self.imgs[6], pygame.mouse.get_pos())
#游戏加载界面
loadImages=[
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/bk5.png"),(640,800)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/bk6.png"),(150,160)),
]
class LoadWindows():
#控制图片变换 时间
load_time=False
time_add=0
def __init__(self, screen, pos,imgs=loadImages,btmimgs=statBotImg):
self.screen=screen
self.imgs=loadImages[0]
self.rect=self.imgs.get_rect()
self.rect.topleft=pos
self.image=imgs
self.btmimgs = btmimgs
# 控制加载界面底部图片动画
self.btmIndex = 0
self.btmAdd = 0 # 累加变量 控制动画速度
def Show(self):
#判断 加载界面是否完成
if self.load_time==False:
self.time_add += 1
#渲染图片
self.screen.blit(self.imgs, self.rect)
self.screen.blit(self.image[1], (10, 10))
if self.time_add == 260:
self.load_time = True
self.Move()
#渲染文字
self.screen.blit(font_tips.render("Tips:",True,pygame.Color("black")),(25,540))
self.screen.blit(font_tips.render("1.您可通过F1键更换键鼠操作模式。",True,pygame.Color("red")),(50,580))
self.screen.blit(font_tips.render("2.游戏主界面左下角可关闭背景音乐。ESC键可强制返回主界面",True,pygame.Color("red")),(50,610))
self.screen.blit(font_tips.render("3.空格键可暂停游戏,再次按下即可开启。",True,pygame.Color("red")),(50,640))
self.screen.blit(font_tips.render("4.更多精彩内容将会陆续更新。",True,pygame.Color("red")),(50,670))
# self.screen.blit(font.render("最终分数:%s"%heroObj.score, True, pygame.Color("green")), (self.rect.center[0]-230,self.rect.center[1]-75))
#底部四个图 形成动图
self.screen.blit(self.btmimgs[self.btmIndex],(245,700))
self.btmAdd+=1
if self.btmAdd==25: #控制图片转换速度
self.btmIndex+=1
self.btmAdd=0
if self.btmIndex>=11: #限制转换图片索引 使其循环
self.btmIndex=0
def Move(self):
if self.rect.x==0:
self.rect.move(0,0)
else:
self.rect = self.rect.move(-32, 40)
#2.游戏界面类
#游戏界面背景
class GameBG:
def __init__(self,image1,image2,screen1,screen2,speed1,speed2) -> None:
#背景1 背景2 背景2 在上层 speed小
self.image1=image1
self.image2=image1.copy()
self.rect1=self.image1.get_rect()
self.rect2=self.image2.get_rect()
self.rect2.topleft=(0,-850)
self.image3 = image2
self.image4 = image2.copy()
self.rect3 = self.image3.get_rect()
self.rect4 = self.image4.get_rect()
self.rect4.topleft = (0, -850)
self.screen1=screen1
self.speed1 = speed1
self.screen2 = screen2
self.speed2 = speed2
def Show(self):
#背景底板1
self.rect1 = self.rect1.move(0, self.speed1)
self.rect2 = self.rect2.move(0, self.speed1)
if self.rect1.y>=825:
self.rect1.y=self.rect2.y-850
if self.rect2.y>=825:
self.rect2.y=self.rect1.y-850
self.screen1.blit(self.image1, self.rect1)
self.screen1.blit(self.image2, self.rect2)
#背景 云2
self.rect3 = self.rect3.move(0, self.speed2)
self.rect4 = self.rect4.move(0, self.speed2)
if self.rect3.y>=825:
self.rect3.y = self.rect4.y - 850
if self.rect4.y >= 825:
self.rect4.y = self.rect3.y - 850
self.screen2.blit(self.image3, self.rect3)
self.screen2.blit(self.image4, self.rect4)
#主角图片
GameImg=[
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\hero3.png"), (68, 68)),
# pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\hero3.png"),(68,68)),
# pygame.image.load(r"Game_Main\Img_File\hero3.png"), #主角1
# pygame.image.load(r"Game_Main\Img_File\hero3.png"), #主角2
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\hero4.png"),(68,68)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\heroskill.png"),(120,120)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(20,20)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(40,40)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(60,80)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(80,80)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(100,100)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(80,80)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(60,60)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(40,40)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(20,20)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\planpigu4.png"),(0,0)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\safetao.png"),(200,200)),
]
#主角类
class Hero:
#人物移动
up = False
down = False
left = False
right = False
#判断人物是否死亡
isHeroDead=False
#isIn判断鼠标在主角的上方
isIn=False
#判断切换键鼠操作
isCMK=False
#子弹类 约束速度 类型
buttleAdd=0
#子弹类 控制弹道
buttleCurve=0
#BUG_1模式 BUG1持续时间
On_Off_BUG1=False
BUG1_time=0
#主角动态屁股控制
herf_pigu=3
#主角动态屁股速度
herf_pigu_Add=0
#检测主角安全状态以及安全时间
isSafe=False
safeTime=0
#死亡画面
deadIndex=0
deadAdd=0
# 可释放大招次数
R_skill = 0
#image2 screen2 speed2 都是最上层云的属性 其余为主角
def __init__(self,image,pos,screen,speed,hp,score,bulletspeed,image2,screen2,speed2):
self.image = GameImg[0]
self.rect = self.image.get_rect() # 获得矩形对象
self.rect.topleft = pos # 初始化位置
self.screen = screen
self.speed = speed
self.hp = hp
self.score = score
self.bulletspeed=bulletspeed
#控制子弹速度 以及子弹图片
self.imgs=image
self.heroAdd=0
self.heroIndex=0
#云背景
self.image3 = image2
self.image4 = image2.copy()
self.rect3 = self.image3.get_rect()
self.rect4 = self.image4.get_rect()
self.rect4.topleft = (0, -850)
self.speed2=speed2
self.screen2=screen2
def Move(self): #移动
# 键盘移动
if Hero.up:
self.rect = self.rect.move(0, -self.speed)
elif Hero.down:
self.rect = self.rect.move(0, self.speed)
elif Hero.left:
self.rect = self.rect.move(-self.speed, 0)
elif Hero.right:
self.rect = self.rect.move(self.speed, 0)
#鼠标移动
if Hero.isCMK:
self.rect.center=pygame.mouse.get_pos()
#更换键盘操作 默认
else:
Hero.isIn=self.rect.collidepoint(pygame.mouse.get_pos())
#约束移动区间640 800 68 68
if self.rect.x>=572:
self.rect.x=572
if self.rect.x<=0:
self.rect.x=0
if self.rect.y>=732:
self.rect.y=732
if self.rect.y<=0:
self.rect.y=0
#显示主角
def Show(self):
if self.hp>0:
self.Move()
self.Collide()
self.screen.blit(self.imgs[self.herf_pigu], (self.rect.bottomleft[0]+10,self.rect.midbottom[1]))
#控制喷气速度
self.herf_pigu_Add += 1
if self.herf_pigu_Add==4:
self.herf_pigu += 1
self.herf_pigu_Add=0
if self.herf_pigu==13:
self.herf_pigu=3
#主角是否开启BUG1模式 切换不同人物特
if self.On_Off_BUG1 ==False:
self.screen.blit(self.imgs[0], self.rect)
else:
self.screen.blit(self.imgs[1], self.rect)
# self.screen.blit(self.imgs[2], (self.rect[0]-25,self.rect[1]-20))
#发射子弹
#开启BUG1模式
if self.On_Off_BUG1 == True:
heroObj.BUG1_time+=1
#控制子弹速度 和 子弹的变换样式
self.buttleAdd += 1
self.buttleCurve+=0.1
if self.buttleAdd>3:
# Bullet(BulletImages[2],self.screen,(self.rect.midtop[0]-7,self.rect.midtop[1]),speed=self.bulletspeed)
Bullet(BulletImages[1],self.screen,(self.rect.midtop[0]-25+(30*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)
Bullet(BulletImages[0],self.screen,(self.rect.midtop[0]+18+(-30*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)
Bullet1(BulletImages[3],self.screen,(self.rect.midtop[0]-20,self.rect.midtop[1]),speed=self.bulletspeed+15)
# Bullet1(BulletImages[3],self.screen,(self.rect.midtop[0]-20-(40*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)
Bullet2(BulletImages[3],self.screen,(self.rect.midtop[0]-20,self.rect.midtop[1]),speed=self.bulletspeed+15)
# Bullet2(BulletImages[3],self.screen,(self.rect.midtop[0]-20-(40*math.sin(self.buttleCurve)),self.rect.midtop[1]),speed=self.bulletspeed+15)
self.buttleAdd = 0
#啥都不开启 普通模式
elif self.On_Off_BUG1==False:
self.buttleAdd += 1
if self.buttleAdd == 10:
Bullet(BulletImages[2],self.screen,(self.rect.midtop[0]-7,self.rect.midtop[1]),speed=self.bulletspeed+50)
self.buttleAdd = 0
#约束弹道函数 优化运行
if self.buttleCurve>10:
self.buttleCurve=0
#遍历子弹列表 打印
for bullet1 in Bullettemp:
bullet1.Show()
#控制 BUG1的时间
if self.BUG1_time > 100:
self.BUG1_time = 0
self.On_Off_BUG1 = False
# for bullet in Bullettemp2:
# bullet.Show2()
#背景 云
# self.rect3 = self.rect3.move(0, self.speed2)
# self.rect4 = self.rect4.move(0, self.speed2)
# if self.rect3.y>=825:
# self.rect3.y = self.rect4.y - 850
# if self.rect4.y >= 825:
# self.rect4.y = self.rect3.y - 850
# self.screen2.blit(self.image3, self.rect3)
# self.screen2.blit(self.image4, self.rect4)
else:
self.Dead()
soundlist[4].play()
def Dead(self): #死亡
global isPlay
#播放死亡动画
self.screen.blit(deadImages[self.deadIndex],self.rect)
soundlist[0].play()
self.deadAdd+=1
if self.deadAdd==4:
self.deadIndex+=1
self.deadAdd=0
if self.deadIndex==len(deadImages):
self.deadIndex=0
# 判断分数更新
if self.score > history:
UpdateScore(self.score)
heroObj.isHeroDead=True
# isPlay = False
def Collide(self): #碰撞
#碰撞奖励
tempReward=pygame.sprite.spritecollideany(self,rewardlist,collided=pygame.sprite.collide_mask)
if tempReward!=None:
#判断! 当hero血量满时 血不增加 并且 补给血不会消失
if tempReward.tag==3 and self.hp>=10:
pass
else:
if tempReward.tag==1:
self.On_Off_BUG1=True
self.BUG1_time=0
elif tempReward.tag==2:
for i in enemylist:
i.hp=0
elif tempReward.tag==3 and self.hp<10:
self.hp+=1
if tempReward in rewardlist:
rewardlist.remove(tempReward)
#碰撞敌机
if self.isSafe==False:
tempEnemy=pygame.sprite.spritecollideany(self,enemylist,collided=pygame.sprite.collide_mask)
if tempEnemy!=None:
tempEnemy.hp=0
self.hp -= 1
self.isSafe=True
else:
self.safeTime+=1
self.screen.blit(GameImg[13],(self.rect[0]-68,self.rect[1]-68))
if self.safeTime==100:
self.safeTime=0
self.isSafe=False
#3.子弹类
#子弹图片
BulletImages=[
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet6.png"), (15, 30)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet5.png"), (15, 30)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet3.png"), (15, 30)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet4.png"), (50, 30)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet3.png"), (15, 30)),
pygame.transform.scale(pygame.image.load(r"Game_Main\Img_File\bullet3.png"), (15, 30)),
]
#临时存储子弹列表
Bullettemp=[]
class Bullet:
def __init__(self,image,screen,pos,speed):
self.image = image
self.screen=screen
self.rect=self.image.get_rect() #获得主角对象
self.rect.center=pos #初始化位置
self.speed=speed
Bullettemp.append(self)
soundlist[1].play()
def Show(self):
self.rect=self.rect.move(0,-self.speed) #移动
self.screen.blit(self.image,self.rect) #位置
#消失子弹
if self.rect.y < -50:
if self in Bullettemp:
Bullettemp.remove(self)
#碰撞检测
self.Collide()
def Collide(self):
temp=pygame.sprite.spritecollideany(self,enemylist,collided=pygame.sprite.collide_mask)
if temp!=None:
temp.hp-=1
if self in Bullettemp:
Bullettemp.remove(self)
#散弹子弹向右
class Bullet1(Bullet):
def __init__(self, image, screen, pos, speed):
super().__init__(image, screen, pos, speed)
def Show(self):
self.rect=self.rect.move(20,-self.speed) #移动
self.screen.blit(self.image, self.rect) # 位置
# 消失子弹
if self.rect.y < -50:
if self in Bullettemp:
Bullettemp.remove(self)
# 碰撞检测
self.Collide()
def Collide(self):
super().Collide()
#散弹子弹向左
class Bullet2(Bullet):
def __init__(self, image, screen, pos, speed):
super().__init__(image, screen, pos, speed)
def Show(self):
self.rect=self.rect.move(-20,-self.speed) #移动
self.screen.blit(self.image, self.rect) # 位置
# 消失子弹
if self.rect.y < -50:
if self in Bullettemp:
Bullettemp.remove(self)
# 碰撞检测
self.Collide()
def Collide(self):
super().Collide()
#4.敌机类
#敌机图片
enemyimage=[
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair1.png"),(60,60)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair2.png"),(60,60)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair3.png"),(60,60)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair4.png"), (120, 120)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair5.png"),(120,120)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair6.png"),(120,120)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair7.png"),(240,240)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair8.png"),(240,240)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair9.png"),(240,240)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/enemyair10.png"),(240,240)),
]
#存放敌机飞机
enemylist=[]
#敌机类
class Enemy:
def __init__(self,imgs,screen,speed,pos,hp,tag):
self.imgs=imgs
self.image=imgs
self.screen=screen
self.speed=speed
self.rect=self.image.get_rect()
self.rect.midbottom=pos
self.tag=tag
self.hp=hp
#死亡动画索引
self.deadIndex=0
self.deadAdd=0
#存放新产生飞机
enemylist.append(self)
def Show(self):
if self.hp>0:
self.Move()
self.screen.blit(self.image,self.rect)
else:
self.Dead()
def Move(self):
self.rect=self.rect.move(0,self.speed)
if self.rect.y>=801:
if self in enemylist:
enemylist.remove(self)
def Dead(self):
#播放死亡动画
self.screen.blit(deadImages[self.deadIndex],self.rect)
soundlist[0].play()
self.deadAdd+=1
if self.deadAdd==2:
self.deadIndex+=1
self.deadAdd=0
if self.deadIndex==len(deadImages):
if self.tag == 1:
heroObj.score += 1
elif self.tag == 2:
heroObj.score += 3
elif self.tag == 3:
heroObj.score += 5
enemylist.remove(self)
def Collide(self):
pass
#5.奖励类
rewardImage=[
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/reward1.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/reward2.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/reward3.png"),(80,80)),
]
rewardlist=[] #存放奖励
class Reward:
def __init__(self,image,screen,speed,pos,tag):
self.image=image
self.screen=screen
self.speed=speed
self.rect=self.image.get_rect()
self.rect.midbottom=pos
self.tag=tag
#存放新产生奖励
rewardlist.append(self)
def Show(self):
self.Move()
self.screen.blit(self.image,self.rect)
def Move(self):
self.rect=self.rect.move(0,self.speed)
if self.rect.y>=801:
if self in rewardlist:
rewardlist.remove(self)
#工厂 类 敌机 和奖励
class Factory:
createAdd=0
createrewardAdd=0
@staticmethod
def CreateEnemy():
#随机产生敌机
Factory.createAdd+=1
if Factory.createAdd==20:
ranNum=random.randint(1,100)
if ranNum<=70:
Enemy(enemyimage[random.randint(0,2)],screen=screen,speed=random.randint(4,6),pos=(random.randint(0,580),-60),hp=1,tag=1)
elif ranNum<=90:
Enemy(enemyimage[random.randint(3,5)],screen=screen,speed=random.randint(2,3),pos=(random.randint(0,520),-120),hp=3,tag=2)
elif ranNum<=100:
Enemy(enemyimage[random.randint(6,9)],screen=screen,speed=random.randint(1,2),pos=(random.randint(0,400),-240),hp=10,tag=3)
Factory.createAdd=0
soundlist[3].set_volume(0.05)
# soundlist[3].play()
for temp in enemylist:
temp.Show()
@staticmethod
def CreateReward():
Factory.createrewardAdd+=1
if Factory.createrewardAdd==100:
ranNum=random.randint(1,10)
if ranNum==1:
Reward(rewardImage[0],screen=screen,speed=random.randint(4,6),pos=(random.randint(0,560),-81),tag=1)
elif ranNum==2:
Reward(rewardImage[1],screen=screen,speed=random.randint(4,6),pos=(random.randint(0,560),-81),tag=2)
elif ranNum == 3:
Reward(rewardImage[2], screen=screen, speed=random.randint(4, 6), pos=(random.randint(0, 560), -81),tag=3)
Factory.createrewardAdd=0
for i in rewardlist:
i.Show()
#用户死亡结束画面类
#死亡动画动图
deadImages=[
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_0.png"),(80,40)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_1.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_2.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_3.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_4.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_5.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_6.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_7.png"),(80,80)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/da_8.png"),(80,80)),
]
#死亡界面
gameImgs=[
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover1.jpg"),(640,800)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover2.png"),(611,412)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover3.png"), (150, 100)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover4.png"), (180, 75)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover4.png"), (220, 90)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover5.png"), (64, 64)),
pygame.transform.scale(pygame.image.load("Game_Main/Img_File/gameover5.png"), (80, 80)),
]
class GameOver:
#判断鼠标在哪个位置上
isMouse_In_end=False
isMouse_In_again = False
def __init__(self,imgs,pos,screen) -> None:
self.imgs=gameImgs
self.image=gameImgs[0]
self.rect=self.image.get_rect()
self.rect.topleft=pos
self.screen=screen
def Show(self):
pygame.mouse.set_visible(True)
#显示背景板
self.screen.blit(gameImgs[0], self.rect)
#显示美女
self.screen.blit(gameImgs[1],(self.rect))
#GameOver图标
self.screen.blit(gameImgs[2], (self.rect.midtop[0],self.rect.midtop[1]+30))
#继续游戏图标
again_icon=self.screen.blit(gameImgs[3], (self.rect.center[0]-80,self.rect.center[1]+30))
self.isMouse_In_again=again_icon.collidepoint(pygame.mouse.get_pos())
if self.isMouse_In_again:
self.screen.blit(gameImgs[4], (self.rect.center[0] - 100, self.rect.center[1] + 20))
#结束游戏图标
end_icon=self.screen.blit(gameImgs[5], (self.rect.topright[0]-100, self.rect.topright[1]+10))
self.isMouse_In_end=end_icon.collidepoint(pygame.mouse.get_pos())
if self.isMouse_In_end:
self.screen.blit(gameImgs[6], (self.rect.topright[0] - 109, self.rect.topright[1] + 5))
#结束界面文字
self.screen.blit(font.render("最终分数:%s"%heroObj.score, True, pygame.Color("green")), (self.rect.center[0]-230,self.rect.center[1]-75))
self.screen.blit(font.render("历史最高分:%s"%history, True, pygame.Color("green")), (self.rect.center[0]+20,self.rect.center[1]-75))
self.Move()
def Move(self):
if self.rect.y<0:
self.rect=self.rect.move(0,12)
else:
self.rect=self.rect.move(0,0)
#****************************************************************
#判断游戏是否开始
isPlay=False
#创建整体帧率速度
clock=pygame.time.Clock()
#字体对象
pygame.font.init()
font=pygame.font.Font("Game_Main/Img_File/fount.otf",35)
font_end=pygame.font.Font("Game_Main/Img_File/fount.otf",80)
font_tips=pygame.font.Font("Game_Main/Img_File/fount.otf",20)
#1.引入
pygame.init()
#2.生产屏幕
screen2=pygame.display.set_mode((640,800))
screen=pygame.display.set_mode((640,800))
#3.BGM
pygame.mixer.music.load(r"Game_Main/Img_File/bgm2.wav")
pygame.mixer.music.play(-1)
#4.产生开始界面对象
startObj=StartPanel(screen)
#加载界面
loadObj=LoadWindows(screen=screen,pos=(640,-800))
#5.游戏背景对象
gameObj=GameBG(image1=startImgs[8],image2=startImgs[9],screen1=screen,screen2=screen2,speed1=4,speed2=2)
#6.游戏主角对象
heroObj=Hero(image=GameImg,pos=(310,600),screen=screen,speed=25,hp=1,score=0,bulletspeed=10,image2=startImgs[9],screen2=screen2,speed2=2)
#7.游戏结束画面
gameoverObj=GameOver(imgs=gameImgs,pos=(0,-800),screen=screen)
#历史分数
history=0
#8.音效
soundlist=[
pygame.mixer.Sound("Game_Main/Img_File/boom.wav"),
pygame.mixer.Sound("Game_Main/Img_File/fashe.wav"),
pygame.mixer.Sound("Game_Main/Img_File/kaishiyouxi.ogg"),
pygame.mixer.Sound("Game_Main/Img_File/planhuxiao.wav"),
pygame.mixer.Sound("Game_Main/Img_File/herodead.wav"),
]
#7.事件 监测 方法
def EventAll():
global isPlay
for event in pygame.event.get():
#退出事件
if event.type==pygame.QUIT:
pygame.quit()
sys.exit()
#鼠标事件
if event.type==pygame.MOUSEBUTTONDOWN:
#开始按钮事件 是否开始游戏
if event.button==1 and StartPanel.isIn_Start==1:
StartPanel.isIn_Start=False
# 读取历史分数 初始化信息
InitMethod()
gameObj.Show()
soundlist[2].play()
isPlay = True
if event.button==1 and gameoverObj.isMouse_In_again==1:
gameoverObj.isMouse_In_again=False
heroObj.isHeroDead=False
# 读取历史分数 初始化信息
InitMethod()
gameObj.Show()
soundlist[2].play()
isPlay = True
heroObj.isHeroDead = False
if event.button==1 and gameoverObj.isMouse_In_end==1:
exit()
sys.exit()
#右键开启BUG模式
# if event.button==3:
# Hero.On_Off_BUG1=not Hero.On_Off_BUG1
#BGM按钮事件 更替声音按钮图标
elif event.button==1 and StartPanel.isIn_BGM==1:
StartPanel.isOn_BGM=not StartPanel.isOn_BGM
if StartPanel.isOn_BGM:
pygame.mixer.music.unpause()
else:
pygame.mixer.music.pause()
# 键盘
if event.type == pygame.KEYDOWN: # 按下
#返回主菜单
if event.key==pygame.K_ESCAPE:
isPlay=False
#暂停 死循环 处理
if event.key==pygame.K_SPACE:
x=True
pygame.mixer_music.pause()
while x:
for stop in pygame.event.get():
if stop.type==pygame.KEYDOWN:
if stop.key==pygame.K_SPACE:
pygame.mixer_music.unpause()
x=False
break
#主角移动
if event.key == pygame.K_w:
Hero.up = True
elif event.key == pygame.K_s:
Hero.down = True
elif event.key == pygame.K_a:
Hero.left = True
elif event.key == pygame.K_d:
Hero.right = True
if event.type == pygame.KEYUP: # 抬起
if event.key == pygame.K_w:
Hero.up = False
elif event.key == pygame.K_s:
Hero.down = False
elif event.key == pygame.K_a:
Hero.left = False
elif event.key == pygame.K_d:
Hero.right = False
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_F1:
Hero.isCMK=not Hero.isCMK
#读取配置文件
def ReadScore(path="score.json"):
if os.path.exists(path):
with open(path,"r") as f_r:
return int(f_r.read())
else:
with open(path,"w") as f_w:
f_w.write("0")
return 0
#更新配置文件
def UpdateScore(newScore,path="score.json"):
with open(path,"w") as f_w:
f_w.write(str(newScore))
#初始化信息
def InitMethod():
global history
history=ReadScore()
heroObj.hp=1
heroObj.score=0
heroObj.rect.topleft=(310,600)
enemylist.clear()
Bullettemp.clear()
rewardlist.clear()
gameoverObj.rect.topleft=(0,-800)
def Main():
pygame.mouse.set_visible(False)
while True:
EventAll()
if isPlay and heroObj.isHeroDead==False:
#开始游戏主体
loadObj.Show()
if loadObj.load_time==True:
gameObj.Show()
Factory.CreateEnemy()
Factory.CreateReward()
heroObj.Show()
#显示信息
screen.blit(font.render("血量:%s"%heroObj.hp,True,pygame.Color("red")),(0,0))
screen.blit(font.render("分数:%s"%heroObj.score,True,pygame.Color("red")),(0,50))
screen.blit(font.render("历史最高分:%s"%history,True,pygame.Color("red")),(0,100))
screen.blit(font.render("终极技能:%s" %(heroObj.R_skill), True, pygame.Color("green")), (200, 0))
elif isPlay==False:
#开始界面
startObj.Show()
elif isPlay and heroObj.isHeroDead==True:
gameoverObj.Show()
#更新画面
pygame.display.update()
#设置帧率
clock.tick(120)
if __name__=="__main__":
Main()
————————————————
版权声明:本文为CSDN博主「fe1yu7」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011478668/article/details/86670058 |
|