上次我们创建了一个外星人,现在要大批量生产了……

首先我们要创建外星人群,在game_functions.py中增加一个函数creat_aliens,由于后期进行了代码重构,所以呈上最终结果吧:

def get_nuber_alien_x(ai_settings,alien_width):'''屏幕每一行可容纳外星人的数量'''space_x=ai_settings.screen_width-2*alien_width #屏幕上一行可以显示外星人的空间为屏幕的宽度减去两个外星人的宽度,即两端的空隙numbers_alien_x=int( space_x/(2*alien_width) )#每一行显示外星人的数量,每个外星人占两个宽度,一个显示自身,另一个为两个外星人的间隔return numbers_alien_x
def get_number_rows(ai_settings,ship_height,alien_height):'''计算屏幕一共可以容纳多少行外星人'''space_y=(ai_settings.screen_height-3*alien_height-ship_height) #垂直方向可用的空间number_rows=int( space_y/(2*alien_height) )  #可显示外星人的行数return number_rows
def cre_alien(ai_settings,screen,aliens,alien_number,num_row):'''创建一个外星人并将其加入到当前行的正确位置'''alien=Alien(ai_settings,screen)alien_width=alien.rect.width  #获取一个外星人的宽度alien.x=alien_width+2*alien_width*alien_number  #设置每个外星人在当前行的位置alien.y=alien.rect.height+2*alien.rect.height*num_row  #设置各行外星人在垂直方向的位置alien.rect.x=alien.xalien.rect.y=alien.yaliens.add(alien)
def creat_aliens(ai_settings,screen,aliens,ship):'''创建一群外星人'''alien=Alien(ai_settings,screen)numbers_alien_x=get_nuber_alien_x(ai_settings,alien.rect.width) #每一行能装载的外星人数量number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)  #屏幕能装载的行数for num_row in range(number_rows): #循环多行for alien_number in range(numbers_alien_x): #处理每一行的外星人cre_alien(ai_settings,screen,aliens,alien_number,num_row)
def update_screen(ai_settings,screen,ship,bullets,aliens):screen.fill(ai_settings.bg_color)  #调用属性设置屏幕的填充颜色for bullet in bullets.sprites():  #对每个bullets中的小妖怪都调用draw_bullet()方法,重绘所有子弹bullet.draw_bullet()ship.blitme()  #显示飞船aliens.draw(screen) #在屏幕上绘制编组中的每个外星人pygame.display.flip()  #是最近绘制的屏幕可见

一共有五个函数,前三个是为第四个服务的,第五个实现将外星人显示到屏幕上,注释比较清楚了,一开始先创建一行外星人,这里边涉及到了位置的设定,然后是多行外星人,保证飞船和外星人群之间有足够的间隔,大体就是这样。。这里还有一个问题就是函数cre_alien中的alien.rect.y=alien.y这条语句,第一次运行时没有加这条,结果没有报错,但结果却不对,没有正常显示,之前对这个就有些疑问,关于rect的x和其本身的x的关系,记得刚开始就提到过,pygame为了方便处理不规则图形,都是以矩形来表示图形的,也就是说相当于在图形外围加了一个矩形框,这样更方便直接地表示了该图形。一般情况下一个物体的rect的xy坐标应该和其自身的xy坐标差不多吧。。这是我的想法,还会进一步验证的。

最后在主程序中进行相关函数的调用:

def run_game():pygame.init()  #初始化背景设置ai_settings=Settings()  #实例化screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height)) #调用属性设置屏幕的宽高pygame.display.set_caption("Alien Invasion")  #设置标题ship=Ship(screen,ai_settings)  #实例化Shipbullets=Group() #创建一个存储子弹的组aliens=Group() #创建一个存储所有外星人的空编组gf.creat_aliens(ai_settings,screen,aliens,ship)while True:gf.check_events(ship,ai_settings,screen,bullets) #更改事件监听函数ship.update()  #每次循环都访问该函数,保证飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新gf.update_bullets(bullets)    gf.update_screen(ai_settings,screen,ship,bullets,aliens)    

最终效果如下:

由于对宽度进行了取整操作,所以大家看到右端空隙较大,这个无伤大雅,反而会使得游戏更有意思,具体的下次再见~~

Pygame实战之外星人入侵NO.7——大批外星人来袭相关推荐

  1. Pygame实战之外星人入侵NO.9——消灭外星人

    万事俱备,只欠子弹和外星人同归于尽-- 我们将使用sprite.groupcollide()来检测子弹和外星人的碰撞,也就是查看二者是否重叠在一起~~ 在game_functions.py中的upda ...

  2. Python项目实战学习 外星人入侵实现子弹射杀外星人,并且在外星人全部消灭后生成新的外星人

    这里写自定义目录标题 外星人入侵 当子弹碰到外星人飞船时外星人被消灭 响应外星人和飞船碰撞 有外星人达到底部 各文件完整代码 settings.py ship.py alien.py bullet.p ...

  3. Pygame实战之外星人入侵NO.6——外星人登场

    飞船和子弹都整好了,外星人该登场了,首先建一个表示外星人的模块alien.py: import pygame from pygame.sprite import Sprite class Alien( ...

  4. Pygame实战之外星人入侵NO.11——设置开始按钮

    目前的状态是当我们打开游戏时便自动运行了,这样显然不符合逻辑,那我们就设置一个开始按钮,当我们点击它是游戏才开始,这次我们先将这个开始按钮搞出来,后续操作下篇见-- 首先我们要将游戏的初始状态设置为非 ...

  5. Python-项目实战-《外星人入侵》Pygame小游戏-阶段二:外星人来了

    来源于<Python编程从入门到实践>的13章外星人来了. 此为第二阶段: Python-项目实战-<外星人入侵>Pygame小游戏-阶段一:武装飞船(含教程)_Kox233的 ...

  6. Python项目实战学习 外星人入侵游戏开发总结

    外星人入侵开发总结 设置屏幕大小.游戏名称.背景颜色 pygame.init() #初始化背景设置ai_settings = Settings()screen = pygame.display.set ...

  7. Pygame 实战(行动代号(单机版)):(二). 游戏编程

    当前系列历史文章: Pygame 实战(行动代号(单机版)):(一). 游戏简介 这一部分就开始讲实现的代码啦!因为之前写代码的时候没什么经验,所以可能有不少冗余的部分和可以简化的地方命名也不是很规范 ...

  8. Pygame实战:利用Python实现智能五子棋,实现之后发现我玩不赢它。

    导语 前段时间不是制作了一款升级版本五子棋的嘛! 但是居然有粉丝私信我说: "准备拿到代码玩一下ok过去了!太难了准备放收藏夹落灰q@q~" 所噶,今天先放一个简易版本的五子棋给大 ...

  9. 【Pygame实战】经典的坦克大战游戏,勾起童年无限回忆《坦克大战小霸王版》

    导语 哈喽!哈喽--我是木木子 今天来升级下之前写的坦克大战游戏嘛,哈哈哈 其实也不算是修改,就是稍微的调试一下!​​ 因为之前写的界面都是英文的 ,有的小伙伴儿英文一点儿都不会的可能看着别扭,今天来 ...

  10. Python项目实战学习 外星人入侵 创建外星人飞船并实现外星人动态移动效果

    外星人入侵 本篇博客紧接上一篇博客:设置飞船发出子弹https://blog.csdn.net/Ace_bb/article/details/104845723 本篇博客实现在游戏窗口中添加动态的外星 ...

最新文章

  1. 解决QueryTask执行中的网络请求错误
  2. ubuntu16.04 安装jdk
  3. Spring boot嵌入式Servlet容器定制器
  4. Android动画开发——Animation动画效果
  5. [容易]在二叉查找树中插入节点
  6. Spring源代码分析-Persist--JdbcTemplate
  7. 用html页面制作开关,利用前端基础制作html开关图标
  8. allure测试报告
  9. ecshop二次开发bug(一)
  10. 计算机英语读音在线,computer是什么意思_computer翻译_读音_用法_翻译
  11. bootstrap-select学习基础示例
  12. Windows10快捷键合集
  13. C/C++ Linux 键盘检测
  14. 机器人会偷走你的饭碗吗——写作篇
  15. 为什么你在互联网上搞不到钱?
  16. 小猿圈python金角大王_小猿圈python学习-基本数据类型
  17. PS - 蓝色发光字
  18. Yolov3没框原因和解决办法
  19. 解决echarts中地图重叠问题
  20. 计算机专业无领导小组面试题,2015年事业单位招聘(无领导小组讨论)面试真题及真题分析(一)...

热门文章

  1. 华三交换机配置vrrp_华三交换机 VRRP V7版本
  2. 兴业java入职考试是考什么_兴业银行考试考什么
  3. 内存虚拟化硬件基础——EPT
  4. 多线程:synchronized关键字解析
  5. 软件开发人员如何记笔记
  6. 卡内基梅隆大学计算机专业介绍,美国卡内基梅隆大学计算机专业介绍
  7. 目标检测 | 丰富特征导向Refinement Network用于目标检测(附github源码)
  8. 安卓的网络视频播放器(简易版)
  9. Dubbo Failover机制
  10. 金融工程与并行计算:第二章 仿真法在财务工程的使用 Part 2