准备

  IDE:VisualStudio 2015

  Language:VB.NET/C#

  图形API:Win2D

  MSDN教程:UWP游戏开发

  游戏开发涉及哪些技术?

  • 游戏开发是一门复杂的艺术,编码方面你需要考虑图形、输入和网络
  • 以及相对独立的音频、物理仿真和AI引擎等,每一个部分单独开发都一场是旷日持久的“战斗”
  • 美术、音乐和剧本也是组成游戏的重要部分,当然引擎不必包含这些素材

  不要试图一个人去完成所有的事情

  • 设计和实现完整的游戏引擎并不是一件轻松的事情
  • 制定几个特定的目标,然后将有限的时间花在这些“简单的”但靠谱的目标上
  • 得益于开源社区,你可以很便捷的找到各类完善的开源引擎,懂得借鉴它们并完善自己。

第一节 场景

你轻轻闭上眼睛,脑海中回想起过往的某个画面,美好的画面喻示着你此刻的心情还不错。我们称组成这个画面的所有元素就是一个场景(Scene)。

  (上述定义从某个角度告诉我们,场景是一系列游戏元素的集合,但这不能很好地说明什么是场景)

  场景包含哪些元素?

  • 摄像机 Camera
  • 图层 Layer
  • 物体 Body
  • 外部资源 Resource

  场景摄像机

  • 摄像机是场景中一类特殊对象,几乎具有可视化对象的全部属性与行为,但它是不可见的
  • 摄像机与场景绘制紧密相关,平面变换、效果和动画都将作用于摄像机裁剪时或裁剪后的画面
  • 场景中允许多个摄像机存在,但同一时间最多一个会被激活
  • 通过摄像机实现场景虚拟化,由可视化元素是否在摄像机视口内决定它是否要被绘制

  资源加载与预绘制

  • 场景绘制与更新前需要先加载外部资源和预绘制
  • 外部资源包括贴图、音频、文本和用户自定义数据
  • 预绘制完成内存占用较多的缓存对象的绘制
  • 若加载花费一段时间,需要向用户提供加载动画
  • 不同场景之间资源不共享,这意味着切换场景必须重新加载资源

图1.1 可视对象接口继承层次(仅供参考)

第二节 图层

你试图向我描述回忆画面,远处缥缈隐现的连绵山峰,近处一片相对开阔的草地,天空似乎还有着淅沥的小雨。不像3D画面可以天然的展现景深关系,2D需要依赖图层(Layer)来实现。

  (分层绘制不仅能表达景深,还可以很容易地为不同图层定制不同的行为)

  图层怎么分类?

  • 静态层 StaticLayer
  • 动态层 AnimateLayer
  • UI层 ControlLayer

  静态层

  • 通常由一副静态图像组成,玩家不能改变其中的内容
  • 一些景深丰富的游戏还会有超前景图层,它也是静态的

  动态层

  • 玩家直接控制的角色所在的图层
  • 主景图层通常由区块(Tile)和角色(Character)组成
  • 区块构成场景环境,角色则在区块上活动
  • 区块严格意义上不是静态的,可能会有来自玩家的破坏

  UI层

  • 展现UI的图层,比如显示消息框、文本框或按钮
  • 有时候用户接触的UI可能来自外部,而不是场景中的元素

图2.1 图层类继承层次(仅供参考)

第三节 物体

我对你的回忆产生了兴趣并希望了解更多的细节,你向我继续描述,草地上青草随风浮动,天空偶有不知名的鸟儿飞过。具体的某个可视化元素我们称之为物体(Body)。

(一般情况下,2D游戏中的物体是一个Sprite)

   物体有哪些属性?

  • 平面变换Transform:描述元素的平面变换
  • 外观 Appearance:描述元素的外观
  • 附加组件 Compnent:表示附加在元素上的游戏组件

  平面变换

  • 平移Translation:元素在场景中的位置
  • 旋转Rotation:元素绕旋转中心旋转
  • 缩放Scale:元素垂直或水平缩放

  外观

  • 可见性Visible:元素是否可见
  • 透明度Opacity:元素不透明度

  *模型与视图分离

  • 模型是游戏中可视化对象的数据
  • 视图是决定如何渲染模型的对象
  • 分离的好处之一是同一模型可绑定不同的视图
  • 改变一个模型的渲染行为,只要改变与它绑定的视图即可  

图3.1 视图类继承层次(仅供参考)

第四节 行为

你继续回忆,脑海中画面不断的变化,有新的景象出现,也有旧的消失不见。画面中总有一些元素是动态的(Dynamic),它们具有自己特定的行为(Behavior)。

  (行为就是游戏元素做出动作,发出声音,作出反应)

  元素有哪些行为?

  • 初始化 Start
  • 更新 Update
  • 事件 Event
  • 绘制 Draw

  初始化

  • 完成元素初始化的操作
  • 比如指定元素的初始位置,绑定事件等
  • 通常在整个元素的生命周期中初始化只进行一次
  • 多次初始化可能会导致某个事件多次绑定事件处理程序

  更新

  • 每帧调用并执行的操作
  • 通常更新帧率与绘制帧率保持一致
  • 有的游戏元素没必要每帧都更新,比如计算量大的AI

  事件

  • 为某个事件提供事件通知
  • 可以动态的为某个事件注册事件处理程序
  • 事件处理机制可为游戏元素实现丰富的行为

  绘制

  • 只有可视化的对象具有该行为
  • 为节约性能,一个可绘制的元素可以缓存成静态图像
  • 为保证画面在不同机器上的流畅性,需要设定渲染级别

  *元素集合变动 

  • 游戏过程中修改游戏元素集合会导致集合不能遍历
  • 一种方法是先将集合改动的行为缓存起来,当一帧结束后再执行这些行为
  • 另一种方法是使用线程安全的集合,在集合遍历期间的更新操作将会被阻塞

图5.1 不同行为预制件类继承层次(仅供参考)

第五节 组件

我吐槽你没有什么想象力,你描述的画面中蜻蜓和鸟儿都是在飞,而不是其中一个会在陆地上飞奔。通常不同的元素很有可能会具有相同的行为,这类行为可以封装为组件(Compnent)。

  (组件有自己的属性、方法和事件,但它们不能独立存在,必须附加在游戏物体上)

  有哪些类型的组件?

  • 动画器 Animation
  • 效果器 Effect
  • 音效器 Audio
  • 触发器 Trigger
  • 命令器 Command
  • 行为器 Behavior

  动画器

  • 附加于游戏对象的动画器在时间线的控制下播放一段动画
  • 多种动画经常组合在一起,比如角色跳跃时既有帧位图动画也有按路径移动的动画
  • 理想情况下,游戏中应使用尽可能多的动画来增强画面效果,使得游戏更具有吸引力

  音效器

  • 附加于游戏对象的音效器用于播放一段音频
  • 音效对烘托游戏环境气氛起着十分关键的作用
  • 音效器最有必要体现的是动态感和方位感
  • 高性能的音效引擎应该是低延迟的且支持动态缓冲
  • XAudio2支持同步采样准确播放以及隐式源速率转换

  效果器

  • 平面变换Transform:平移、旋转和缩放
  • 高斯模糊GaussianBlur:减少噪声或降低细节层次
  • 颜色矩阵ColorMatrix:特殊的位图颜色变化效果
  • 光照效果Light:点光源,方向光源,全局光照
  • 阴影效果Shadow:生成模糊的阴影

  触发器

  • 触发器由三个部分组成,事件、条件、动作
  • 事件:当某个事件发生的时候就运行触发器
  • 条件:判断是否达到指定的条件,如果没有达到条件将不执行动作
  • 动作:条件通过后所要做的事情

  命令器(行为器)

  • 命令器和行为器是决定游戏对象如何进行动作的附加对象
  • 命令器是行为器的超集,前者区别于后者是它在每帧都会有更新行为
  • 很显然,行为器只是控制下一步的动作,命令器则是控制时间线上的一系列动作

图5.1 组件接口继承层次(仅供参考)

第六节 真实

  你回应这是真实的回忆而不是梦境,鸟儿只会在蓝天翱翔。事实上,游戏不是真实的(Reality),只是感觉上有些真实。

  (游戏设计中尽量让玩家感受真实的部分就是物理仿真与游戏AI)

  物理引擎

  • 物理引擎通过为刚性物体赋予真实的物理属性的方式来计算刚体运动、旋转和碰撞
  • 为每个游戏或者每个游戏对象使用物理引擎并不是完全必要的
  • 取决于需求,游戏运行时的物体引擎需要平衡实时性和高精度两者

  Box2D

  • Box2D以固定的离散时间步长实现游戏物理世界的仿真
  • Box2D提供了支持像圆形或多边形这样的几何形状的刚体仿真
  • Box2D可用关节连接不同的形状,还可以包括关节马达和滑轮

  游戏AI

  • 游戏AI是游戏中能够像人一样思考和行动的元素
  • AI设计需要考虑趣味性、随机性和难度三个因素
  • AI三大系统主要是感知系统、导航系统和决策系统

  AI分层

  • 感知事件层:对输入的信息进行过滤和分配
  • 行为层:具体描述如何执行指定动作
  • 动画层:判断哪组动画更符合当前游戏状态
  • 运动层:处理探路、碰撞和躲避等行为
  • 短期决策层:AI实体短幅视距上的智能处理层
  • 长期决策层:AI实体开阔视距上的智能处理层
  • 基于位置的信息层:包括来自影响图、智能地形或类似结构的信息

  *蜻蜓在地上飞奔

  • 违背真实性或荒诞不经的设定虽然讨趣,但最好不要让玩家有上当的感觉
  • 除非你在一开始就告诉他,如游戏名字叫《地上飞奔的蜻蜓》,玩家才可能会原谅你
  • 不符合直觉的设计通常是糟糕透顶的,但有时候这些设计可能带来突破性的新颖玩法

图6.1 物理引擎关节类继承层次(仅供参考)

附录

  下面,为你介绍两款适用于UWP的游戏引擎

开源:GitHub.EDGameEngine

作者:ExperDot

  复杂度:

  简介:适用于UWP的2D游戏图形引擎 ,提供丰富的游戏模型库与组件库

  说明:整合了我之前博客里的自然树、粒子系统和自动绘图模型,以及一些有趣的效果组件

开源:GitHub.N2Engine

作者:Nukepayload2

  复杂度:

  简介:用于支持任意能够生成可移植类库的.NET语言制作基于 Win2D 和 MonoGame 两种图形框架的跨平台游戏

  说明:目前完成度低,你可以在Issue中浏览Stone1.0的完整设计(对此感兴趣也可以贡献Contributions)

  参考书籍

  《AI Game Engine Programming》(美) BrianSchwab 著

  《Object-Oriented Game Development》(美) Julian Gold 著

  《Ulimate Game Design-Building Game Worlds》(美) Tom Meigs 著

UWP简单示例(三):快速开发2D游戏引擎的更多相关文章

  1. UWP简单示例(三):快速开发2D游戏引擎

    准备 IDE:Visual Studio 图形 API:Win2D MSDN 教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面你需要考虑图形.输入和网络 以及相对独立的 ...

  2. Siki_Unity_1-8_使用Unity开发2D游戏_PongGame

    Unity 1-8 使用Unity开发2D游戏 PongGame 任务1:演示 http://pan.baidu.com/s/1pKUHsev; up2i 任务2:案例介绍 创建PongGame,注意 ...

  3. Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节

    声明:   本博客文章翻译类别的均为个人翻译,版权全部.出处: http://blog.csdn.net/ml3947,个人博客:http://www.wjfxgame.com. 译者说明:这是一个系 ...

  4. Atitit 开发2d游戏的技术选型attilax总结

    Atitit 开发2d游戏的技术选型attilax总结 1.1. 跨平台跨平台:一定要使用跨平台的gui技术,目前最好的就是h5(canvas,webgl,dom) +js了..1 1.2. 游戏前后 ...

  5. 开发H5游戏引擎的选择:Egret或Laya?

    开发H5游戏引擎的选择:Egret或Laya? 一.总结 一句话总结:选laya吧 二.开发H5游戏引擎的选择:Egret或Laya? 一.H5游戏开发的引擎介绍 开发H5游戏的引擎有很多,比如egr ...

  6. Android 2D游戏引擎AndEngine配置环境

    Android 2D游戏引擎AndEngine配置环境 1.2  配置环境 在任何编程中,都需要一些软件或者硬件的支持.否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和 ...

  7. SNF快速开发平台--规则引擎整体介绍及使用说明书

    一.设计目标 a)规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b)能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c)运算速度快 ...

  8. 【2D游戏引擎】WIP反思

    WIP(Working In Progress)是我初学游戏引擎开发时候开发的一个2D游戏引擎,当时计划为它实现类似Unity一样的编辑器,具有和Unity相似的工作流,但是由于水平不够,走了很多弯路 ...

  9. 配置JDKAndroid 2D游戏引擎AndEngine

    配置JDKAndroid 2D游戏引擎AndEngine JDK全称为Java Development Kit(也即Java开发包),是用于支持Java 编程的基础.无论是什么编程,只要用到了Java ...

随机推荐

  1. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  2. C# 文章导航

    1. C#相关文章 1.1 C# 基础(一) 访问修饰符.ref与out.标志枚举等等 1.2 C# 基础(二) 类与接口 1.3 C# DateTime日期格式化 1.4 C# DateTime与时 ...

  3. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  4. 【SQLServer】【恢复挂起的解决方案】附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。 ”【数据库恢复】

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 先贴错误: 吐槽一下: 进入正题: 新建一个同名数据库 停止MSSQL服务 替换数据库文 ...

  5. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法

    双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...

  6. Electron使用与学习--(基本使用与菜单操作)

    对于electron是个新手,下面纯属个人理解.如有错误,欢迎指出.   一.安装 如果你本地按照github上的 # Install the `electron` command globally ...

  7. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  8. ASP.NET Core 中文文档目录

    翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先生的群中发布了翻译计划招募信息,并召 ...

  9. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...

  10. jquery.each()

    $(selector).each(function(index,element)) index - 选择器的 index 位置 element - 当前的元素(也可使用 "this" ...