首先,确定好自己的思路
要做什么样的东西?
答:飞机大战
功能?
答:通过键盘打飞机(狗头)
进阶功能?或者说,他有可能有什么样的创新呢?
答: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)
设置了一秒可以自动感受到的次数
此外还有各种各样的敌机大家可以自行绘制