按照个人的相法,对原代码进行了改进,添加功能如下:
功能1:飞机的移动多样化
原代码飞机只能左右移动,没有前后移动,增加飞机前后移动
方法:
1、在GameSprite初始化时添加一个速度值参数,用于水平速度的设定
class GameSprite(pygame.sprite.Sprite):
def __init__(self, image_name, speed1=1,speed2=1):
#继承父类方法
super().__init__()
self.image = pygame.image.load(image_name) #通过图像生成surface对象
self.rect = self.image.get_rect() #生成rect对象
self.speed1 = speed1 #设置垂直速度,如果不设置则默认为1
self.speed2 = speed2#设置水平速度,如果不设置则默认为1,主要是飞机应用
2、在Hero的定义中,初始化中添加参数调用,加上修改update,添加y方向的运动,并且添加底部防出框的代码
class Hero(GameSprite):
def __init__(self):
.......
def update(self):
# 英雄在水平方向运行
self.rect.x += self.speed2
# 英雄在垂直方向运行
self.rect.y -= self.speed1
# 控制英雄不能离开屏幕
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.y < 0:
self.rect.y = 0
elif self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right
elif self.rect.bottom> SCREEN_RECT.bottom:
self.rect.bottom = SCREEN_RECT.bottom
3、在plane_Main中胡__event_handler中添加键值上下对水平速度参数的控制
keys_pressed = pygame.key.get_pressed()
# 判断元祖中对应的按键索引值
if keys_pressed[pygame.K_RIGHT]:
# print("向右移动。。。")
self.hero.speed2 = 2
elif keys_pressed[pygame.K_LEFT]:
self.hero.speed2 = -2
else:
self.hero.speed2 = 0
if keys_pressed[pygame.K_UP]:
self.hero.speed1 = 2
elif keys_pressed[pygame.K_DOWN]:
self.hero.speed1 = -2
else:
self.hero.speed1 = 0
功能2:实现计分功能
实现过程在不停的摸索后实现,反正就是变量的作用域问题,自己走了不少弯路,一言难尽啊!不说了,直接说明:
1、在碰撞处返回每次的碰撞数,添加参数返回
def __check_collide(self):
# 1.子弹摧毁敌机
shooted=pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)
# print("碰撞的个数:{0}".format(len(shooted)))
return len(shooted)
2、在方法调用处接收每次的碰撞数,也就是击落飞机的架数
num_shooted=self.__check_collide()
Score += num_shooted *100
3、在开始定义Score,并赋原始值0,然后在使用处即2的位置上加global 将其变为全局变量,并计算得到Scorer的值
global Score
4、创建标签,并显示
#创建标签和精灵组
Label_score =LabelSprite("得分:" + str(Score), 0, 0, 30)
label_group=pygame.sprite.Group()
label_group.add(Label_score)
#创建LabelSprite精灵
class LabelSprite(pygame.sprite.Sprite):
def __init__(self,content,x,y,fontsize=30):
super().__init__()
# self.destination = destination
self.content = content
self.myfont = pygame.font.SysFont("font/Marker Felt.ttf", 40)
print("self.content内容是{0}".format(self.content))
self.textImage = self.myfont.render(self.content, True, (0,0,0))
self.rect = self.textImage.get_rect()
self.rect.x = x
self.rect.y = y
功能3:实现音效与背景音乐
1、创建SoundSprite精灵
创建SoundSprite精灵,定义播放方法,而参数决定是音效还是音乐
#创建SoundSprite精灵
class SoundSprite(pygame.sprite.Sprite):
def __init__(self,sound_name):
super().__init__()
self.sound_name=sound_name
def play(self,is_music=False):
self.sound = pygame.mixer.Sound(self.sound_name)
pygame.mixer.Sound.play(self.sound)
if is_music :
self.music=pygame.mixer.music.load(self.sound_name)
pygame.mixer.music.play(-1)
2、初始化声音
# 初始化声音
pygame.mixer.init()
3、调用音效及音乐
# 播放背景乐
music=SoundSprite("sound/game_music.mp3")
music.play(True)
#添加子弹发出的声音
sound_bullet=SoundSprite("sound/bullet.mp3")
sound_bullet.play()
sound_enemydown=SoundSprite("sound/enemy0_down.mp3")
if len(shooted) > 0:
sound_enemydown.play()
说明:
一开始直接加入声音,会产生很多的声音,十分杂乱,因此加入判断,返回值有内容时才能播放声音,才正常。