概述
游戏元素:
1.背景
2.我方飞机
3.敌方飞机
4.子弹
5.游戏结束界面
6.游戏主窗口
7.飞机爆炸
8.音效
流程图
音效准备:
import pygame
import sys
pygame.init()
pygame.mixer.init()
#游戏背景音乐
#back_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\game_music.wav')
#back_sound.set_volume(0.05)
pygame.mixer.music.load('D:\\飞机大战素材\\sound\\game_music.wav') #不知道什么原因当背景音乐和飞机爆炸音效都用sound,则放在前面的播放后面的不会播放
pygame.mixer.music..set_volume(0.05)
#子弹发射音乐
bullet_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\bullet.wav')
bullet_sound.set_volume(0.05)
#敌机死亡音乐
enemy_downsound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\enemy1_down.wav')
enemy_downsound.set_volume(0.05)
#游戏结束音乐
gameover_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\game_over.wav')
gameover_sound.set_volume(0.05)
#飞机死亡音乐
plane_sound = pygame.mixer.Sound('D:\\飞机大战素材\\sound\\use_bomb.wav')
plane_sound.set_volume(0.05)
窗口准备:
from 音效 import *
pygame.init()
size = width , height = 480 , 800 #设置游戏屏幕大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption('飞机大战')
back = pygame.image.load('D:\\飞机大战素材\\background.png')
def main():
while 1:
back_sound.play(-1,)
for event in pygame.event.get():
if event.type == 12:
sys.exit()
screen.blit(back,(0,0))
pygame.display.flip()
if __name__ == '__main__':
main()
注意:若不写if __name__ == '__main__': main()
语句,那么程序将会闪退,去掉def main()才会正常,注意是双下划线
子弹准备:
import pygame
class Bullet(pygame.sprite.Sprite):
def __init__(self,position):
pygame.sprite.Sprite.__init__(self)
#子弹图片
self.bullet_image = pygame.image.load('D:\\飞机大战素材\\bullet1.png')
self.bullet_rect = self.bullet_image.get_rect()
self.bullet_rect.top,self.bullet_rect.left = position
self.speed = 20
self.life = True
# 子弹碰撞检测
self.mask = pygame.mask.from_surface(self.bullet_image)
#子弹删除
def del_bullet(self):
self.kill()
#子弹移动
def bullet_move(self):
if self.bullet_rect.left > 0: #搞不懂这为啥是left,用top反而会往左发射
self.bullet_rect.left -= self.speed
else:
self.kill()
角色准备:
import pygame
clock = pygame.time.Clock()
class Ourplane:
def __init__(self,width,height):
#飞机的图片,带动态效果
self.planeimage1 = pygame.image.load('D:\\飞机大战素材\\hero1.png')
self.planeimage2 = pygame.image.load('D:\\飞机大战素材\\hero2.png')
#飞机位置
self.planerect = self.planeimage1.get_rect()
self.width, self.height = width, height
# 获取飞机图像的掩膜用以更加精确的碰撞检测
self.mask = pygame.mask.from_surface(self.planeimage1)
# 定义飞机初始化位置,底部预留60像素
self.planerect.left, self.planerect.top = (self.width - self.planerect.width) // 2, (self.height - self.planerect.height - 60)
# 设置飞机移动速度
self.speed = 10
# 设置飞机存活状态(True为存活, False为死亡)
self.active = True
# 加载飞机损毁图片
self.destroy_images = []
self.destroy_images.extend(
[
pygame.image.load("D:\\飞机大战素材\\hero_blowup_n1.png"),
pygame.image.load("D:\\飞机大战素材\\hero_blowup_n2.png"),
pygame.image.load("D:\\飞机大战素材\\hero_blowup_n3.png"),
pygame.image.load("D:\\飞机大战素材\\hero_blowup_n4.png")
]
)
def move_up(self):
"""
飞机向上移动的操作函数,其余移动函数方法类似
"""
if self.planerect.top > 0: # 如果飞机尚未移动出背景区域
self.planerect.top -= self.speed
else: # 若即将移动出背景区域,则及时纠正为背景边缘位置
self.planerect.top = 0
def move_down(self):
"""
飞机向下移动
"""
if self.planerect.bottom < self.height - 60:
self.planerect.top += self.speed
else:
self.planerect.bottom = self.height
def move_left(self):
"""
飞机向左移动
"""
if self.planerect.left > 0:
self.planerect.left -= self.speed
else:
self.planerect.left = 0
def move_right(self):
"""
飞机向右移动
"""
if self.planerect.right < self.width:
self.planerect.right += self.speed
else:
self.planerect.right = self.width
def reset(self):
# 初始化飞机(飞机挂了, 初始化到初始位置)
self.planerect.left, self.planerect.top = (self.width - self.planerect.width) // 2, (self.height - self.planerect.height - 60)
# 重置飞机的存活状态
self.active = True
敌机准备:
import random as r
import pygame
pygame.init()
class Emeryplane(pygame.sprite.Sprite):
def __init__(self,width,height):
pygame.sprite.Sprite.__init__(self)
#敌机图片
self.emeryplane_image = pygame.image.load('D:\\飞机大战素材\\enemy1.png')
self.emeryplanedie_image = [
pygame.image.load('D:\\飞机大战素材\\enemy1_down1.png'),
pygame.image.load('D:\\飞机大战素材\\enemy1_down2.png'),
pygame.image.load('D:\\飞机大战素材\\enemy1_down3.png')
]
# 随机出现
self.emeryplane_rect = self.emeryplane_image.get_rect()
self.width, self.height = width, height
self.emeryplane_rect.left,self.emeryplane_rect.top = (r.randint(0,self.width-self.emeryplane_rect.left),r.randint(-100,-30))
#敌机状态
self.emeryplane_life = True
#敌机碰撞检测
self.mask = pygame.mask.from_surface(self.emeryplane_image)
#敌机移动
def emery_move(self):
if self.emeryplane_rect.top < self.height:
self.emeryplane_rect.top += 3
else:
self.kill()
#敌机重置
def emery_reset(self):
self.emeryplane_rect.left, self.emeryplane_rect.top = (
r.randint(0, self.width - self.emeryplane_rect.left), r.randint(-100, -30))
self.emeryplane_life = True