python飞机大战思路与总结

首先,确定好自己的思路

要做什么样的东西?

答:飞机大战

功能?

答:通过键盘打飞机(狗头)

进阶功能?或者说,他有可能有什么样的创新呢?

答: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)

设置了一秒可以自动感受到的次数

此外还有各种各样的敌机大家可以自行绘制

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值