欢迎光临散文网 会员登陆 & 注册

基础 | 自治智能体----类鸟群(二)

2020-03-20 11:57 作者:有木乘舟  | 我要投稿

本系列为笔者初学c/c++和游戏AI开发的学习过程,算法为主,不涉及到具体的游戏开发软件学习(如unity,虚幻4等),若有错误请在评论区留下批评意见。

  • 语言:c/c++ (11及以上)

  • 平台:macOS mojave

  • 编译器:vs Code / g++

一、构建一个世界

1.1 SFML

  SFML是一个简单方便的第三方图形库, 接口简洁,非常适合用来当做简单的2D游戏引擎。详细的安装教程见这里

  SFML同大多数图形库一样,只需要几行代码就可以构建出一个窗口,并检测键盘和鼠标事件。

图2 窗口和事件

1.2 创建Boids生活的环境

  就像现实中的鸟群一样,我们的Boids也需要一个可以自由飞翔的世界。

  在这个世界里,我们就是上帝,只要点一点鼠标左键,就可以凭空创造出一只飞鸟来。

  我们通过一个类来实现这个想法,在这个类里定义世界的大小(屏幕的宽高),一个存储Boids的动态数组(存储图形),处理事件和渲染的方法,以及启动世界的开关。

图3 Boids的世界

  如图3:

  • creBoid():接收一个坐标,并在这个坐标上生成一个boid

  • creBoids():生成一群boid,并将其存储在动态数组shapes中。

  • render():用来渲染图形

  • handleInput():处理键盘和鼠标事件。

  • run():创建一个窗口,并在该窗口上执行一系列操作

  如图4,初始化World类时,设置个体boid的大小,并将窗口大小设置为当前屏幕的大小。函数run()创建该窗口,生成Boids,并持续渲染图形,监测事件,直到窗口被关闭。

图4 World类初始化和run()函数

  如图5,handleInput()监测两个事件,一是退出窗口事件,二是鼠标左键点击事件。当点击鼠标左键,会在鼠标当前位置生成一个boid个体。render()渲染图形,将其显示在窗口内。

图5 render()和handleInput()

  如图6,调用creBoids函数生成指定数量的类鸟群,调用creBoid生成单个个体,并将其存储在动态数组shapes中。

图6 生成boids

  最后,我们在主函数中运行这个世界:  

图7 主函数

  到这里,我们需要创建三个文件World.h 、World.cpp 和 main.cpp,并通过makefile文件来编译程序。

  makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,是一个自动化编译工具。

图8 makefile文件配置

  最后,当程序运行正确的时候,应该会得到以下的画面:

  现在的Boids还是只有“肉体”,而没有“灵魂”,我们需要赋予每个boid行动和简单思考的能力。回想一下之前学到的有限状态机,如果将两者结合起来,一定会发生很有趣的事情。


参考:

  • 《游戏人工智能编程案例精粹》

  • SFML    https://www.sfml-dev.org/tutorials/2.5/

  • 这个频道的主播用unity实现了书中所有的项目,有需要的小伙伴可以自行观看https://www.youtube.com/watch?v=XrxhwgyQa_Q&t=8300s

基础 | 自治智能体----类鸟群(二)的评论 (共 条)

分享到微博请遵守国家法律