Concepts in Games Development是Open2Study平台上的课程,Dr. Clinton Woodward老师任教于Swinburne University of Technology in Melbourne, Australia,主要讲 Games Programming和Artificial Intelligence for Games课程。
简介
这门课主要讲的是游戏开发的总体框架,让学生对游戏开发有较深入的了解。课程在AI部分花了不少时间,对精灵的移动以及寻路算法都有介绍。虽然课程中展示了很多pyglet写的小游戏来加强对概念、算法的理解,但对于编程不做要求。
本来课程应该拿满分的,但是因为理解的原因错了一道题。问题是:假设猎物对于单个hunter总能找到一个躲避的位置,那么出现两个hunter的时候猎物能找的几个用于隐藏的位置?答案是应该能找到两个隐藏的位置,我回答的是一个,感觉两条线可以有一个交点,这个焦点应该是最好的隐藏位置。
课程完成后对课程评价,我的评价是 “More about common things. Suitable for new bird.”。当然,这个new bird指的就是我了。
课程笔记
Module1 游戏开发要素
游戏开发需要设计师提出一个文案,然后围绕文案,与音视频工程师、3D建模工程师一起不断改进。游戏设计的关键要素
Basic idea 基本概念, storyline 故事情节, visual design 画面, audio design 音乐, control 控制与输入,interaction mode 交互模式游戏流程与screen的控制流:比如设置、退出、游戏、分数排名等节目。
对于游戏画面中出现的物体都要定义他们之间如何交互,通常可以使用一个矩阵辅助设计。
设计完成后的游戏开发流程
Pre-production 核心小组研发游戏原型Production 多个小组分工合作开发游戏
Realise 游戏推向市场后的社区维护、升级包、关于游戏平衡性的patch发布
敏捷开发
游戏文档要求很详细,这是因为开发过程中使用了瀑布模型。经验表明这种模型并不是很好,可能无法产生想要的结果。敏捷开发是迭代开发,伴有人员之间的交流,把完成项目作为清晰的目标,可以很好的解决这一问题但敏捷开发同样有一些问题:可能要在不同的实现方式之间选择;大的项目中交流会占用大量时间;大项目很难分成小块分工合作
Module2 游戏制作
游戏循环
Input :玩家、网络、AI、NPCupdate:根据输入更新物体状态
redering:渲染画面
除此之外,在开始之前要加载资源,结束后释放等等
Statements, sequences and selection是编程的三个基本概念
OO编程思想以及工厂模式
根据需求由类实例Object
OOP的三个关键思想:模块化、分解组合、封装
数据驱动用于保存游戏状态
保存状态的三种方式:保存当前所有物体信息;保存初始信息以及所有动作;保存点保存(只保存新数据)
OOP的三个关键思想:模块化、分解组合、封装
消息与数据驱动的游戏
消息用于物体或游戏引擎模块之间的通信数据驱动用于保存游戏状态
保存状态的三种方式:保存当前所有物体信息;保存初始信息以及所有动作;保存点保存(只保存新数据)
图
能很好的组织数据,在游戏开发中很有用。可以用来保存地图之间的联系、游戏策略(树),状态转移图可以用于游戏状态切换
栈、队列、优先级队列
栈、队列、优先级队列
简单的游戏架构
(以tic-tac-toe为例)讲解如何模块化:玩家、游戏画板、规则三个模块
为游戏添加特性的步骤:Select, code and test each feature
游戏中的规则由软件制定而不是由玩家决定,规则可以放在程序中,但放在数据中更有弹性,改动时影响到的数据少。
在网游中,某个玩家想要知道别的玩家的状态需要延迟,服务器可以对别的玩家的状态做出预测,发送给此玩家以减少延时。但在FPS游戏中会造成问题
游戏的Balance与玩家之间的fairness
Module3 规则 移动与交互
为游戏添加特性的步骤:Select, code and test each feature
游戏中的规则由软件制定而不是由玩家决定,规则可以放在程序中,但放在数据中更有弹性,改动时影响到的数据少。
在网游中,某个玩家想要知道别的玩家的状态需要延迟,服务器可以对别的玩家的状态做出预测,发送给此玩家以减少延时。但在FPS游戏中会造成问题
游戏的Balance与玩家之间的fairness
物理仿真
比如风、重力、空气阻力。如碰撞检测,在速度较快时,要保持较高的采样精度
避免不必要的工作量
比如冲突检测,可以先从一个高水平上检测,然后再做细致检测
位图
选取一部分,可以拼成背景或精灵
并发工作:线程、同步
智能体(agent)AI模型步骤:sense,think,act
状态机与判决树:用于决定物体的行为
面向目标的行为规划:预测几步之后的结果,选择最好的行为
steering:根据目标决定行走目的地
Flee evade也是同样的区别
Wall avoiding:在墙附近就给予一个远离墙的力
Obstacles avoiding:提前检测前方位置是否有障碍
战术判决:避免被大鱼吃:如果检测到离大鱼距离不远就从大鱼到障碍物画一条线,然后以障碍物背后为目标
三种力量组合作用决定了一群物体的移动行为
A star:仅在目标方向上泼水,也可以两头同时找。基于Dijkstra算法,但增加目标方向的启发式探索,总体要搜索的面积更小
路径上不同地块可能cost不同
消息与事件
消息可以用公告板或分发模型,有一对一、一对多、经过延迟的消息并发工作:线程、同步
Module4 AI
AI可以带来乐趣,但过于智能会造成对抗的时候乐趣减少智能体(agent)AI模型步骤:sense,think,act
状态机与判决树:用于决定物体的行为
面向目标的行为规划:预测几步之后的结果,选择最好的行为
steering:根据目标决定行走目的地
暴力决定行动方向的方法
seek与pursue:Seek 行走向目标, pursue 行走向预测到的目标将要到达的位置Flee evade也是同样的区别
决定走哪里的例子
wandering:目标前方放置一个圆,随机选择圆上一点作为目标Wall avoiding:在墙附近就给予一个远离墙的力
Obstacles avoiding:提前检测前方位置是否有障碍
战术判决:避免被大鱼吃:如果检测到离大鱼距离不远就从大鱼到障碍物画一条线,然后以障碍物背后为目标
基于group的steering:Boids模型
三种力量:separation保持距离 alignment保持其他物体平均方向 cohesion尽力挤到中央三种力量组合作用决定了一群物体的移动行为
寻路算法path planning
Dijkstra算法:泼水,找最近的路径。可以两头同时找,效率更高。保证能找到最小代价路径A star:仅在目标方向上泼水,也可以两头同时找。基于Dijkstra算法,但增加目标方向的启发式探索,总体要搜索的面积更小
路径上不同地块可能cost不同