首先,确定好自己的思路
要做什么样的东西?
答:飞机大战
功能?
答:通过键盘打飞机(狗头)
进阶功能?或者说,他有可能有什么样的创新呢?
答:1.通过手势操控(引入深度学习利用摄像头实现手势识别)
2.链接树莓派进行硬件上的编程也许可行!
3.兴许用到计算机图形学的内容进行图像处理?
好
第一步.搭建主函数,搜集资源
找到飞机所需要的图片与音效
这里要谈到图片的处理啦!
对于pygame来说,加载图片利用pygame.image.load(filename)
但是如果直接这样做的话,飞机会变得不透明!
需要用surface对象的convert函数进行转换,使其变得透明!
还有convert_alpha有兴趣的可以自行了解
然后是游戏的基础:背景的初始化
pygame.init()
pygame.mixer.init()
bg_size = width, height = 450, 700
screen = pygame.display.set_mode(bg_size) #设置界面大小
pygame.display.set_caption("飞机大战") #打印界面
background = pygame.image.load("images/background.png").convert()
BLACK =(0, 0, 0)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
WHITE = (255, 255, 255)
# 载入背景音乐
pygame.mixer.music.load("sound/game_music.ogg")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
bullet_sound.set_volume(0.2)
button_sound = pygame.mixer.Sound("sound/button.wav")
button_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.2)
enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.2)
enemy3_flying_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
enemy3_flying_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
get_bullet_sound.set_volume(0.2)
me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
me_down_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound("sound/supply.wav")
supply_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
upgrade_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
bomb_sound.set_volume(0.2)
游戏结束的画面也让我们提前准备好
# 游戏结束画面 gameover_font = pygame.font.Font("font/font.ttf", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect()
第二步,建造飞机,敌人,子弹,所有要移动的东西都设置为一个对象
谈到pygame里的移动对象不得不说sprite
如果在屏幕上绘制很多surface对象来更新,不仅增加了代码长度,过程繁琐,容易出bug,而且代码运行较慢
但是如果用sprite就要简单得多了,每一个sprite类都有自己的速度属性,每次调用玩update更新屏幕后就会更新位置,自动判断碰撞等事件,而且如果调用group类的话,可以方便的引入一群对象作为操作
这是我们的飞机类的构造函数
class MyPlane(pygame.sprite.Sprite):
def __init__(self, bg_size):
pygame.sprite.Sprite.__init__(self)
self.image1 = pygame.image.load("images/me1.png").convert_alpha()
self.image2 = pygame.image.load("images/me2.png").convert_alpha()
self.destroy_images = []
self..extend([\
pygame.image.load("images/me_destroy_1.png").convert_alpha(), \
pygame.image.load("images/me_destroy_2.png").convert_alpha(), \
pygame.image.load("images/me_destroy_3.png").convert_alpha(), \
pygame.image.load("images/me_destroy_4.png").convert_alpha() \
])
self.rect = self.image1.get_rect()
self.width, self.height = r_size[0], r_size[1]
self.rect.left, self.rect.sb = \
(self.width - self.rect.width) // 2, \
self.height - self.rect.height - 60
self.speed = 10
self.active = True
其中active是检验是否发生碰撞的因子,true则为碰撞
def reset(self, position): # 重新设置子弹的位置
self.rect.left, self.rect.top = position
self.active = True
碰撞后则调用以下函数更改子弹状态
然后enemy对象类似
第三步,如何对这些对象进行操作与整合
1.召唤小型敌机,即创建一堆enemy对象并加入group中
def add_small_enemies(group1, group2, num):
for i in range(num):
e1 = enemy.SmallEnemy(size)
group1.add(a)
group2.add(b)
2.调用上方class enemy中的函数生成main函数中的敌机
#生成敌方小型飞机
small_enemies = pygame.sprite.Group() #
add_small_enemies(small_enemies, enemies, 15) #函数,添加飞机,添加到 small_enemies, enemies, 添加15个
子弹同理
# 生成普通子弹
bullet1 = []
bullet1_index = 0
BULLET1_NUM = 17
bullet2 = []
bullet2_index = 0
BULLET2_NUM = 17
bullet3 = []
bullet3_index = 0
BULLET3_NUM = 17
for i in range(BULLET1_NUM):
bullet1.append(bullet.Bullet1(me.rect.midtop))
bullet2.append(bullet.Bullet1(me.rect.midtop))
bullet3.append(bullet.Bullet1(me.rect.midtop))
# 这里子弹初始化时,位置参数为 me.rect.midtop
第三步,键盘输入控制飞机移动
说到这里就不得不谈一下pygame的键盘输入了
基本有两种方式:
1.用pygame.event.get()方法捕获键盘事件,使用这个方式捕获的键盘事件必须要是按下再弹起才算一次操作,较为迟缓(也不是,就是需要一直点点点,不能按着让她一直移动)
2.在pygame中可以使用pygame.key.get_pressed来返回元组,通过判断键盘常量,可以在元组中判断哪个键被按下,最重要的!可以持续按着不松手通过设置一个感应时间来让他持续移动,让手好好休息一下!
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit()
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
#start.play() 声音代码
count_down()
pygame.key.set_repeat(10, 15)
return
SCREEN.blit(Background,(back_x,0))
if back_x<0:
back_x += 2
elif back_x>=0:
for i in range(100):
back_x -= 2
SCREEN.blit(Background, (back_x, 0))
pygame.display.update()
time.sleep(0.05)
pygame.display.update()
CLOCK.tick(FPS)
其中
pygame.key.set_repeat(10, 15)
设置了一秒可以自动感受到的次数
此外还有各种各样的敌机大家可以自行绘制