重力小猪--pygame项目
主函数
import pygame,sys
from pygame.locals import *
from src.role import *
from src.bullet import *
from src.moster import *
from src.porp import *
#窗体高度宽度
size_width=1000
size_height=420
bg_size=(size_width,size_height)
bg_speed = 0 #背景速度
pygame.init()
pygame.display.set_caption("重力小猪——GOP")
#载入音乐
bg_music=pygame.mixer.music.load("../music/bg_music.wav")
pygame.mixer.music.play(-1)
pygame.mixer.music.set_volume(0.7)
bg_music_1=pygame.mixer.Sound("../music/飞碟音效.wav")
bullet_sound = pygame.mixer.Sound("../music/子弹.wav")
porp_sound_1 = pygame.mixer.Sound("../music/吃到道具1.wav")
porp_sound_2 = pygame.mixer.Sound("../music/吃到道具2.wav")
porp_sound_3 =pygame.mixer.Sound("../music/获得子弹道具.wav")
role_die_sound =pygame.mixer.Sound("../music/死亡.wav")
moster_die_sound=pygame.mixer.Sound("../music/怪物死.wav")
role_re_sound=pygame.mixer.Sound("../music/复活.wav")
role_re_sound=pygame.mixer.Sound("../music/复活.wav")
say_game=pygame.image.load("../image/游戏说明.png")
backgroung_1= pygame.image.load('../image/background_1.jpg')
singal=pygame.image.load("../image/logo.png")
backgroung_2= pygame.image.load('../image/background_2.jpg')
distance_image=pygame.image.load('../image/距离.png')
score_image=pygame.image.load('../image/得分.png')
die_bg_image=pygame.image.load("../image/死亡背景.png")
start_bg_image=pygame.image.load("../image/开始背景背景.png")
fly_end=pygame.image.load("../image/飞碟光效.png")
screen=pygame.display.set_mode(bg_size)
width=backgroung_1.get_width() #获得背景宽度
mouse_x,mouse_y=pygame.mouse.get_pos()#获取鼠标位置
ourrole=Role(bg_size) #创建我方角色
ourrole_1=Role_1(bg_size)
def add_Moster_1(group1,group2,num):#上方怪物
for i in range(num):
sm=Moster_1(bg_size)
group1.add(sm)
group2.add(sm)
def add_Moster_2(group1,group2,num):#中间怪物
for i in range(num):
sm = Moster_2(bg_size)
group1.add(sm)
group2.add(sm)
def add_Moster_3(group1,group2,num):#下方怪物
for i in range(num):
sm = Moster_3(bg_size)
group1.add(sm)
group2.add(sm)
def add_Moster_4(group1,group2,num):#会跳的怪物
for i in range(num):
sm = Moster_4(bg_size)
group1.add(sm)
group2.add(sm)
def add_Moster_5(group1,group2,num):#斜飞的怪物
for i in range(num):
sm = Moster_5(bg_size)
group1.add(sm)
group2.add(sm)
def add_Moster_6(group1,group2,num):#会抖的怪物
for i in range(num):
sm = Moster_6(bg_size)
group1.add(sm)
group2.add(sm)
def add_Moster_7(group1,group2,num):#大怪物
for i in range(num):
sm = Moster_7(bg_size)
group1.add(sm)
group2.add(sm)
def add_porp(group1,group2,num):#随机出现的道具
for i in range(num):
por = Porp(bg_size)
group1.add(por)
group2.add(por)
def delay_moster(moster,bg_speed):#产生正常怪物
for each in moster:
if each.active:
each.move(bg_speed)
screen.blit(each.image_enemy_1, each.rect)
else:
each.reset()
def delay_moster_1(moster,bg_speed,score):#产生2,7怪物
for each in moster:
if each.active:
each.move(bg_speed)
if score%10:
screen.blit(each.image_enemy_1, each.rect)
else:
screen.blit(each.image_enemy_2, each.rect)
else:
each.reset()
def main():
runing=True#程序运行状态
index=0#得分
score=0#判断图片循环
score_1=0#暂停
score_2=0
score_3 = -1000 # 恢复暂停
score_4=0#道具存在时间
switch_suspend=True #按空格暂停关键
switch_trun=False#角色图片翻转关键
switch_pengzhung=True#无敌状态关键
switch_prop=0#吃道具选择
switch_speed=True#加速状态关键
x=0#图片循环坐标
max_speed=3#最大速度
delay = max_speed+15#加速状态值
speed=[0, 0]#角色移动速度
speed_1=[0,0]#角色暂停相关
speed_2=[0,0]#角色暂停相关
start=True#重新开始或结束
end=False#结束动画控制
prop_time=0#道具作用时间
deffict=1#难度---------------------调节
mosters=pygame.sprite.Group()#怪物组
moster_1 = pygame.sprite.Group()#上方怪物组(3个)
add_Moster_1(mosters,moster_1,3)
moster_2 = pygame.sprite.Group()#中间怪物组(难度)
add_Moster_2(mosters,moster_2, deffict)
moster_3 = pygame.sprite.Group()#下方怪物组
add_Moster_3(mosters,moster_3, 2)
moster_4 = pygame.sprite.Group()#跳动怪物组
add_Moster_4(mosters,moster_4, deffict+1)
moster_5 = pygame.sprite.Group()#斜飞鸟
add_Moster_5(mosters,moster_5, deffict+2)
moster_6 = pygame.sprite.Group()#抖动组
add_Moster_6(mosters, moster_6, deffict+1)
moster_7 = pygame.sprite.Group()#大怪兽
add_Moster_7(mosters, moster_7, deffict)
moster_8 = pygame.sprite.Group()#上方怪物组多
add_Moster_1(mosters, moster_8, deffict+3)
moster_9 = pygame.sprite.Group()#中间怪物组多
add_Moster_2(mosters, moster_9, deffict+1)
moster_10 = pygame.sprite.Group()#下方怪物组
add_Moster_3(mosters, moster_10, deffict+3)
porps=pygame.sprite.Group()#随机道具组
porp_1 = pygame.sprite.Group()#一个道具
add_porp(porps, porp_1, 1)
porp_2 = pygame.sprite.Group()#两个道具
add_porp(porps, porp_2, 2)
porp_3 = pygame.sprite.Group()#三个道具
add_porp(porps, porp_3, 3)
bullet1 = []#创建子弹
BULLET1_NUM = 4#子弹数量
for i in range(BULLET1_NUM):#添加子弹到组
bullet=Bullet((ourrole.rect.right, ourrole.rect.top + ourrole.high // 2),bg_size)
bullet1.append(bullet)
ourroles = []#产生我方角色组
ourroles.append(ourrole)
going=True#开始界面进入动画
max_distance=0.0#最远距离
max_index=0.0#最大积分
x_distance = 60
while runing:#开始
if start==False:#结束界面
if end==False:
if max_distance<score_1:
max_distance=score_1
if max_index < index:
max_index = index
screen.blit(backgroung_1, (0, 0))
screen.blit(die_bg_image,(0,0))
fontObj6 = pygame.font.SysFont('arial', 40)
textSurface = fontObj6.render('%.d'%(max_distance/10), True,(255,97, 0))
textRect = textSurface.get_rect()
textRect.center = (750,110)
screen.blit(textSurface, textRect)
fontObj6 = pygame.font.SysFont('arial', 40)
textSurface = fontObj6.render('%.d' % max_index , True, (255, 97, 0))
textRect = textSurface.get_rect()
textRect.center = (750, 40)
screen.blit(textSurface, textRect)
fontObj6 = pygame.font.SysFont('arial', 50)
textSurface = fontObj6.render('%.d' % index, True, (255, 97, 0))
textRect = textSurface.get_rect()
textRect.center = (560, 205)
screen.blit(textSurface, textRect)
for event in pygame.event.get(): # 检测是否是退出时间
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.locals.KEYDOWN:
if event.key==pygame.locals.K_r:#重新开始
start = True
role_re_sound.play()
score_1=0
score_2=0
index=0
x=0
speed=[0,0]
switch_prop=0
if switch_trun:
ourrole.image_one = pygame.transform.flip(ourrole.image_one, False, True)
ourrole.image_two = pygame.transform.flip(ourrole.image_two, False, True)
switch_trun=False
elif event.key==pygame.locals.K_c:#结束
end=True
bg_music_1.play(-1)
else:
pass
while end:#结束动画
screen.blit(backgroung_1, (0, 0))
screen.blit(fly_end, (0,0))
cont_im=x_distance%16
if ourrole_1.active:
if x_distance % 2: # 绘制角色
screen.blit(ourrole_1.image_one, ourrole_1.rect)
else:
screen.blit(ourrole_1.image_two, ourrole_1.rect)
if ourrole_1.rect.left< width // 2 :
ourrole_1.rect.left+= 1
else:
ourrole_1.rect.left=width//2+75
ourrole_1.rect.top -= 2
#ourrole_1.move_1(cont_im)
if ourrole_1.rect.top <=100:
# end=False
# runing=False
sys.exit()
pygame.display.flip()
x_distance -= 1
if x_distance<=0:
x_distance = 60
else:
if going==True:#开始界面
x -=2
screen.blit(backgroung_1, (x, 0))
screen.blit(backgroung_1, (x + width, 0))
screen.blit(start_bg_image, (0, 0))
if x_distance % 2: # 绘制角色
screen.blit(ourrole_1.image_one, (90,275))
else:
screen.blit(ourrole_1.image_two, (90,275))
x_distance-=1
screen.blit(say_game, (0, 0))
if x <= 10 - size_width:
x = 0
x_distance=60
for event in pygame.event.get(): # 检测是否是退出时间
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.locals.KEYDOWN:
going=False
if event.type == pygame.locals.MOUSEBUTTONDOWN:
role_die_sound.play()
going = False
else:
pass
else:#正式游戏
'''背景循环'''
if score_1 // 1000 <= max_speed:
bg_speed = score_1 // 1000 + 1
else:
bg_speed = max_speed
if score<=1000:
x-=bg_speed
screen.blit(backgroung_1, (x, 0))
screen.blit(backgroung_1, (x + width, 0))
elif 1000<score<=2000:
x -= bg_speed
screen.blit(backgroung_2, (x, 0))
screen.blit(backgroung_2, (x + width, 0))
elif score>2000:
score=0
'''积分绘制'''
screen.blit(distance_image,(840,10))
fontObj4 = pygame.font.SysFont('arial', 30)
textSurface_1 = fontObj4.render('%d' % (score_2/10), True, (255, 97, 0))
textRect_1 = textSurface_1.get_rect()
textRect_1.center = (930, 19)
screen.blit(textSurface_1, textRect_1)
'''距离绘制'''
#print("测试")
screen.blit(score_image, (850, 38))
fontObj5 = pygame.font.SysFont('arial', 30)
textSurface_2 = fontObj5.render('%d' % index, True, (255,97, 0))
textRect_2 = textSurface_2.get_rect()
textRect_2.center = (930, 47)
screen.blit(textSurface_2, textRect_2)
if ourrole.active:#角色存活
if score%2:#绘制角色
screen.blit(ourrole.image_one, ourrole.rect)
else:
screen.blit(ourrole.image_two, ourrole.rect)
if prop_time>5-deffict:#道具使用时间复位
#print("道具到期")
switch_prop=0
score_4=0
prop_time=0
switch_pengzhung = True
switch_speed = True
else:#简化道具时间方法
if (not score_4%250)and(score_4!=0):
prop_time+=1
'''发射子弹'''
if switch_prop==1:
switch_pengzhung = True
switch_speed=True
for b in bullet1:
if b.active:
screen.blit(b.image, b.rect)
bullet_sound.play()
b.move_bullet(bg_speed)
score_4 += 1
'''子弹碰撞检测'''
enemy_hit = pygame.sprite.spritecollide(b, mosters, False, pygame.sprite.collide_mask)
if enemy_hit:
b.active = False
for e in enemy_hit:
if e in moster_7 or e in moster_2:
index+=150
elif e in moster_5 or e in moster_6 or e in moster_4:
index+=500
else:
index+=31
e.active = False
moster_die_sound.play()
else:#子弹死亡复位
b.reset((ourrole.rect.right, ourrole.rect.top + ourrole.high // 2))
'''无敌光圈'''
elif switch_prop==2:
switch_speed = True
switch_pengzhung=False
screen.blit(ourrole.image_three,ourrole.rect)
score_4+=3
'''加速'''
elif switch_prop==3:
switch_pengzhung=False
screen.blit(ourrole.image_four, ourrole.rect)
switch_speed=False
score_4 += 3
'''加速效果实现'''
if switch_speed==False:
score_9 = max_speed
max_speed = delay
delay = score_9
else:#角色死亡
ourrole.reset()
for i in mosters:
i.active = False
for i in porps:
i.active = False
start=False
#怪物,道具出现
if score_1<2000:
delay_moster(moster_1, bg_speed)
delay_moster(moster_3, bg_speed)
delay_moster_1(moster_7, bg_speed, score)
elif score_1<4000:
delay_moster(moster_1, bg_speed)
delay_moster(porp_1, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster(moster_6, bg_speed)
delay_moster(moster_3, bg_speed)
elif score_1<6000:
delay_moster(moster_3, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster(moster_4, bg_speed)
delay_moster(porp_2, bg_speed)
delay_moster(moster_5, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster(moster_6, bg_speed)
delay_moster(moster_1, bg_speed)
elif score_1<10000:
delay_moster(moster_3, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster(moster_4, bg_speed)
delay_moster(moster_5, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster(moster_6, bg_speed)
delay_moster(porp_3, bg_speed)
delay_moster(moster_1, bg_speed)
delay_moster_1(moster_2, bg_speed,score)
delay_moster_1(moster_7,bg_speed,score)
else:
delay_moster(porp_3, bg_speed)
delay_moster(moster_1, bg_speed)
delay_moster(porp_2, bg_speed)
delay_moster(moster_3, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster(moster_4, bg_speed)
delay_moster(moster_5, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster(moster_6, bg_speed)
delay_moster(moster_1, bg_speed)
delay_moster_1(moster_2, bg_speed, score)
delay_moster_1(moster_7, bg_speed, score)
delay_moster(moster_8, bg_speed)
delay_moster(moster_9, bg_speed)
delay_moster(moster_10, bg_speed)
if switch_suspend:#暂停相关
score+=1
score_1+=1
score_2+=1
# 时间计时器:设置图片帧数
clock = pygame.time.Clock()
clock.tick(200) # 调速
# 图片自动滚动相关
if x<=10-size_width:
x=0
'''吃道具碰撞检测'''
for en in ourroles:
enemies_down = pygame.sprite.spritecollide(en,porps, False, pygame.sprite.collide_mask)
if enemies_down:
for i in enemies_down:
if i.flash==1:#子弹道具
porp_sound_3.play()
switch_prop=1
score_4 = 0
prop_time = 0
elif i.flash==2:#无敌道具
porp_sound_1.play()
switch_prop=2
score_4 = 0
prop_time = 0
elif i.flash==3:#加速道具
porp_sound_2.play()
switch_prop=3
score_4 = 0
prop_time = 0
i.active = False
index += 50#积分
'''角色碰撞怪物检测'''
for en in ourroles:
enemies_down = pygame.sprite.spritecollide(en, mosters, False, pygame.sprite.collide_mask)
if enemies_down:
if switch_pengzhung:
role_die_sound.play()
en.active = False
for i in enemies_down:
index += 150
moster_die_sound.play()
i.active = False
'''键盘控制'''
for event in pygame.event.get(): # 检测是否是退出时间
if event.type == pygame.QUIT:
sys.exit()
if event.type ==pygame.locals.KEYDOWN:
if switch_trun==False:
if event.key == pygame.locals.K_UP or event.key==pygame.locals.K_w:
speed = [0, -2]
switch_trun = True#图片反转
ourrole.image_one = pygame.transform.flip(ourrole.image_one, False, True)
ourrole.image_two = pygame.transform.flip(ourrole.image_two, False, True)
if switch_trun==True:
if event.key == pygame.locals.K_DOWN or event.key==pygame.locals.K_s:
speed = [0, 2]
switch_trun = False
ourrole.image_one = pygame.transform.flip(ourrole.image_one, False, True)
ourrole.image_two = pygame.transform.flip(ourrole.image_two, False, True)
if event.key==pygame.locals.K_SPACE:#暂停
switch_suspend=not switch_suspend
score_2=score_1
score_1 = score_3
score_3=score_2
speed_1=speed
speed=speed_2
speed_2=speed_1
'''演示代码'''
if event.key==pygame.locals.K_l:
switch_prop=2
if event.key==pygame.locals.K_o:
switch_prop=1
if event.key==pygame.locals.K_p:
switch_prop=3
# 移动图像
ourrole.rect = ourrole.rect.move(speed)
if ourrole.rect.top <=-20:
speed=[0,0]
ourrole.rect.top=-20
elif ourrole.rect.bottom>=370:
speed = [0, 0]
ourrole.rect.bottom=370
pygame.display.flip()
if __name__ == '__main__':
main()
主函数中主要定义的主要是各种精灵的移动,碰撞检测,角色移动等内容
怪物类:
import pygame
from random import randint,choice
#怪物1
class Moster_1(pygame.sprite.Sprite):#上
energy=1
def __init__(self,bg_size):
super(Moster_1,self).__init__()
i = randint(1, 3)#随机产生图片
if i == 1:
self.image_enemy_1 = pygame.image.load('../image/飞机.png')
elif i == 2:
self.image_enemy_1 = pygame.image.load('../image/鸟1.png')
else:
self.image_enemy_1 = pygame.image.load('../image/鸟3.png')
self.rect = self.image_enemy_1.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
#敌机初始位置
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width,100)), 20) # 上
#生存状态
self.active=True
self.energy=Moster_1.energy
'''死亡状态'''
#移动方法
def move(self,speed):
if self.rect.right > 0:
self.rect.right -= speed
else:
self.reset()
def reset(self):
i = randint(1, 3)
if i == 1:
self.image_enemy_1 = pygame.image.load('../image/飞机.png')
elif i == 2:
self.image_enemy_1 = pygame.image.load('../image/鸟1.png')
else:
self.image_enemy_1 = pygame.image.load('../image/鸟3.png')
self.rect = self.image_enemy_1.get_rect()
self.mask = pygame.mask.from_surface(self.image_enemy_1)
# 敌机初始位置
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width, 100)), 20) # 上
# 生存状态
self.active = True
self.energy = Moster_1.energy
class Moster_2(pygame.sprite.Sprite):#中
energy=2
def __init__(self,bg_size):
super(Moster_2,self).__init__()
self.image_enemy_1 = pygame.image.load('../image/火箭1.png')
self.image_enemy_2 = pygame.image.load('../image/火箭1_1.png')
self.rect=self.image_enemy_1.get_rect()
self.width,self.height = bg_size[0],bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
#敌机初始位置
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width,200)), self.height//2-self.rect.height) # 中
#生存状态
self.active=True
self.energy=Moster_1.energy
'''死亡状态'''
#移动方法
def move(self,speed):
if self.rect.right > 0:
self.rect.right -=((speed*2)/3)
else:
self.reset()
def reset(self):
self.active=True
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width,200)), self.height//2-self.rect.height) # 中
class Moster_3(pygame.sprite.Sprite): # xia
energy = 2
def __init__(self, bg_size):
super(Moster_3, self).__init__()
i=randint(1,4)
if i==1:
self.image_enemy_1 = pygame.image.load('../image/炸弹.png')
if i==2:
self.image_enemy_1 = pygame.image.load('../image/树桩.png')
if i==3:
self.image_enemy_1 = pygame.image.load('../image/仙人掌2.png')
if i==4:
self.image_enemy_1 = pygame.image.load('../image/狮子.png')
self.rect = self.image_enemy_1.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
# 敌机初始位置
self.rect.left, self.rect.top = (
choice(range(self.width, 2 * self.width,100)),350-self.rect.height) # 下
# 生存状态
self.active = True
self.energy = Moster_1.energy
'''死亡状态'''
# 移动方法
def move(self,speed):
if self.rect.right > 0:
self.rect.right -=speed
else:
self.reset()
def reset(self):
i = randint(1,4)
if i == 1:
self.image_enemy_1 = pygame.image.load('../image/炸弹.png')
if i == 2:
self.image_enemy_1 = pygame.image.load('../image/仙人掌2.png')
if i == 3:
self.image_enemy_1 = pygame.image.load('../image/树桩.png')
if i == 4:
self.image_enemy_1 = pygame.image.load('../image/狮子.png')
self.rect = self.image_enemy_1.get_rect()
self.mask = pygame.mask.from_surface(self.image_enemy_1)
# 敌机初始位置
self.rect.left, self.rect.top = (
choice(range(self.width, 2 * self.width, 100)), 350 - self.rect.height) # 下
# 生存状态
self.active = True
self.energy = Moster_1.energy
class Moster_4(pygame.sprite.Sprite): # 跳
energy = 5
def __init__(self, bg_size):
super(Moster_4, self).__init__()
self.image_enemy_1 = pygame.image.load('../image/小怪兽.png')
self.rect = self.image_enemy_1.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
# 敌机初始位置
self.rect.left, self.rect.top = (
choice(range(self.width, 2 * self.width,100)),350-self.rect.height) # 下
self.speed = 5
# 生存状态
self.active = True
self.energy = Moster_1.energy
'''死亡状态'''
# 移动方法
def move(self,speed):
if speed!=0:
if self.rect.right > 0:
self.rect.right -= 2*speed
if self.rect.top <= 0 or self.rect.bottom >= self.height:
self.speed = 0-self.speed
self.rect.top -= self.speed
else:
self.reset()
def reset(self):
self.active = True
self.rect.left, self.rect.top = (
choice(range(self.width, 2 * self.width, 100)), 350 - self.rect.height)
class Moster_5(pygame.sprite.Sprite):#斜飞
energy=1
def __init__(self,bg_size):
super(Moster_5,self).__init__()
self.image_enemy_1 = pygame.image.load('../image/鸟2.png')
self.rect = self.image_enemy_1.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
self.speed = 3.0
#敌机初始位置
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width,100)), 20) # 上
#生存状态
self.active=True
self.energy=Moster_1.energy
'''死亡状态'''
#移动方法
def move(self,speed):
if speed!=0:
if self.rect.right > 0:
self.rect.right -= 2*speed
if self.rect.left<self.width:
self.rect.top+=1
else:
self.reset()
def reset(self):
self.active=True
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width,100)), 20) # 上
class Moster_6(pygame.sprite.Sprite):#dou
energy=5
def __init__(self,bg_size):
super(Moster_6,self).__init__()
self.image_enemy_1 = pygame.image.load('../image/小汽车.png')
self.rect = self.image_enemy_1.get_rect()
self.bg_size=bg_size
self.width, self.height = bg_size[0], bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
#敌机初始位置
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width,100)),350-self.rect.height ) # 上
#生存状态
self.active=True
self.energy=Moster_1.energy
'''死亡状态'''
#移动方法
def move(self,speed):
if speed!=0:
if self.rect.right > 0:
self.rect.right -= 2*speed
if self.rect.top <= 310:
speed = -speed
self.rect.top -= speed
else:
self.reset()
def reset(self):
self.active=True
self.rect.left, self.rect.top = (choice(range(self.width, 2 * self.width, 100)), 350 - self.rect.height) # 上
class Moster_7(pygame.sprite.Sprite): # 大怪物
energy = 2
def __init__(self, bg_size):
super(Moster_7, self).__init__()
self.image_enemy_1 = pygame.image.load('../image/大怪兽1.png')
self.image_enemy_2 = pygame.image.load('../image/大怪物1_1.png')
self.rect = self.image_enemy_1.get_rect()
self.width, self.height = bg_size[0], bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
# 敌机初始位置
self.rect.left, self.rect.top = (self.width,350-self.rect.height) # 下
# 生存状态
self.active = True
self.energy = Moster_1.energy
'''死亡状态'''
# 移动方法
def move(self,speed):
if self.rect.right > 0:
self.rect.right -=speed*3
else:
self.reset()
def reset(self):
self.active = True
self.rect.left, self.rect.top = (self.width,350-self.rect.height) # 下
怪物类中定义了各种怪物的随机出现和怪物移动方法,死亡效果时间有限没有添加
import pygame
from random import randint
class Porp(pygame.sprite.Sprite):
def __init__(self, bg_size):
super(Porp, self).__init__()
i=randint(1,3)
if i==1:
self.image_enemy_1 = pygame.image.load('../image/道具1.png')
self.flash=1
if i==2:
self.image_enemy_1 = pygame.image.load('../image/道具2.png')
self.flash = 2
if i==3:
self.image_enemy_1 = pygame.image.load('../image/道具3.png')
self.flash = 3
self.rect = self.image_enemy_1.get_rect()
self.speed=2
self.width, self.height = bg_size[0], bg_size[1]
self.mask = pygame.mask.from_surface(self.image_enemy_1)
# 道具初始位置
self.rect.left, self.rect.top = (
randint(self.width, self.width + 500), randint(0, self.height - self.rect.height))
# 生存状态
self.active = True
def move(self,speed):
if speed != 0:
if self.rect.right > 0:
self.rect.right -= 2 * speed
if self.rect.top <= 0 or self.rect.bottom >= self.height:
self.speed = 0 - self.speed
self.rect.top -= self.speed
else:
self.reset()
def reset(self):
self.active=True
i = randint(1, 3)
if i == 1:
self.image_enemy_1 = pygame.image.load('../image/道具1.png')
self.flash = 1
if i == 2:
self.image_enemy_1 = pygame.image.load('../image/道具2.png')
self.flash = 2
if i == 3:
self.image_enemy_1 = pygame.image.load('../image/道具3.png')
self.flash = 3
self.rect = self.image_enemy_1.get_rect()
self.mask = pygame.mask.from_surface(self.image_enemy_1)
#道具初始位置
self.active = True
self.rect.left, self.rect.top = (
randint(self.width, self.width + 500), randint(0, self.height -self.rect.height))
主要定义了功能道具的出现和随机运动方法
子弹实体类
import pygame
class Bullet(pygame.sprite.Sprite):
def __init__(self,position,bg_size):
super(Bullet,self).__init__()
self.image=pygame.image.load('../image/子弹.png')
self.rect=self.image.get_rect()
self.width,self.height=bg_size[0],bg_size[1]
#获得人物位置(右,上)
self.rect.right,self.rect.top=position
self.rect.right += 20
self.active=True
self.mask = pygame.mask.from_surface(self.image)
def move_bullet(self,speed):
if self.rect.right>=self.width:
self.active=False
else:
self.rect.right+=(speed*4)
def reset(self,position):
if self.rect.right>self.width or self.active==False:
self.active=True
self.rect.right, self.rect.top = position
self.rect.right += 20
角色类
class Role(pygame.sprite.Sprite):
def __init__(self,bg_size):
super(Role, self).__init__()
# 确定玩家的两张图片
self.image_one = pygame.image.load('../image/主角猪1_1.png')
self.image_two = pygame.image.load('../image/主角猪1_2.png')
self.image_three = pygame.image.load('../image/无敌光圈.png')
self.image_four=pygame.image.load("../image/加速火焰.png")
self.high=self.image_one.get_height()
# 获取角色位置
self.rect = self.image_one.get_rect()
# 获取背景图片宽高
self.width, self.height = bg_size[0], bg_size[1]
self.or_speed=[0,0]
# 获取角色图片的掩模,用来精确碰撞
self.mask = pygame.mask.from_surface(self.image_one)
# 设置玩家初始位置
self.rect.left, self.rect.top = (120, 370+self.high)
self.active = True
'''角色死亡效果'''
def reset(self):
self.active = True
self.rect.left, self.rect.top = (120, 370-self.high)
class Role_1(pygame.sprite.Sprite):
def __init__(self,bg_size):
super(Role_1, self).__init__()
# 确定玩家的两张图片
self.image_one = pygame.image.load('../image/主角猪1_1.png')
self.image_two = pygame.image.load('../image/主角猪1_2.png')
self.high=self.image_one.get_height()
# 获取角色位置
self.rect = self.image_one.get_rect()
# 获取背景图片宽高
self.width, self.height = bg_size[0], bg_size[1]
self.or_speed=[0,0]
# 获取角色图片的掩模,用来精确碰撞
self.mask = pygame.mask.from_surface(self.image_one)
# 设置玩家初始位置
self.rect.left, self.rect.top = (80, 370-self.rect.height)
self.active = True
'''角色死亡效果'''
# def move_1(self,*args):
# self.image_two=self.image_two[args[0]%len(self.image_two)]
# self.image_one=self.image_one[args[0]%len(self.image_one)]
重力小猪项目已经初步完成,包括开始动画和结束动画,较为完整,仅供借鉴参考