Python学习笔记49:游戏篇之外星人入侵(十)

51 篇文章 4 订阅
11 篇文章 0 订阅

前言

之前的文章,已经把基础的游戏功能完成了,就像我们之前项目先写好了基础代码一样,游戏基础的逻辑代码已经编写完毕,后面我们会一步步的填充这个游戏的功能。

我的文章内容和功能实现顺序和原文教学并不是一模一样,是我自己学了这部分以后,重新再写一遍的时候写的思路一些。由于工作的原因有点断断续续不连贯,不习惯的可以直接按书中的内容进行学习即可。

刷新外星人

在游戏中,有两种情况我们需要在窗口中刷新外星人:

  • 外星人全部被消灭
  • 飞船坠毁

第一种是因为外星人被消灭完了,必须生在新的外星人继续游戏。

第二种就是因为飞船坠毁了我们需要清屏,飞船会刷新在窗口底部中央的位置,外星人就从窗口顶部开始重新向下移动。在我们的设定中,外星人撞击到飞船就会使得飞船坠毁。

接下来,针对这两种情况,进行代码编写。

消灭全部外星人

之前的文章中,我们在子弹的移动函数中进行子弹与外星人的碰撞处理,因此我们继续在这个函数中继续往下编写代码。

首先,之前我们已经编写过生成外星人组的函数,我们直接调用它。

def update_bullets(bullets, aliens, setting, screen):
    """更新子弹"""
    bullets.update()
    # 删除已经消失的子弹
    for bullet in bullets.copy():
        # 当子弹矩形底部坐标小于0,说明子弹已经出了上边界
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
    pygame.sprite.groupcollide(bullets, aliens, True, True)
    if len(aliens) == 0:
        create_fleet(setting, screen, aliens)

由于之前没有settingscreen两个参数,所以我们需要在main模块中调用update_bullets函数的位置增加这两个参数。

import pygame
from pygame.sprite import Group

import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting
from alien_invasion.ship import Ship


def run_game():
    """启动游戏"""

    # 初始化pygame
    pygame.init()
    # 定义一个系统设置对象
    setting = Setting()
    # 新建窗口
    screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))
    # 窗口命名
    pygame.display.set_caption(setting.caption)
    # 定义一个飞船对象
    ship = Ship(setting, screen)
    # 创建子弹编组
    bullets = Group()
    # 创建外星人编组
    aliens = Group()
    # 创建编组内的外星人
    gf.create_fleet(setting, screen, aliens)

    while True:
        # 处理监听事件
        gf.check_event(ship, setting, screen, bullets)
        # 移动飞船
        ship.move()
        # 更新子弹位置
        gf.update_bullets(bullets, aliens, setting, screen)
        # 更新外星人
        gf.update_aliens(aliens, setting, ship)
        # 刷新屏幕
        gf.update_screen(setting, screen, ship, bullets, aliens)


if __name__ == '__main__':
    run_game()

代码编写完后,启动main模块,击毁窗口中所有的外星人,看看效果,不出所料在外星人被击毁完毕后重新生成了一批新的外星人。

当然,我们的子弹还是存在的没有清空掉,这个子弹要不要清空,大家自行决定。

撞击飞船

与前一种刷新方式一下,我们回到外星人移动的函数,在暂停后清空外星人,并重新生成。

def update_aliens(aliens, setting, ship):
    check_fleet_edges(aliens, setting)
    aliens.update()
    if pygame.sprite.spritecollideany(ship, aliens):
        ship.center_ship()
        sleep(0.5)
        aliens.empty()
        create_fleet(setting, ship.screen, aliens)

这里我们将暂停时间修改为0.5秒。由于创建外星人的函数参数在本函数中都存在,所以我们不需要对main模块进行修改,直接启动就行。

启动后,我们主动移动飞船撞击外星人,在短暂暂停后,飞船回到底部中央,外星人也重新在顶部刷新。

结尾

外星人的刷新功能比较简单就完成了,后面我们加上一个游戏状态的功能以及按钮光标等(原书的内容)。

加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值