UWP简单示例(三):快速开发2D游戏引擎
准备
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的游戏引擎
作者:ExperDot
复杂度:
简介:适用于UWP的2D游戏图形引擎 ,提供丰富的游戏模型库与组件库
说明:整合了我之前博客里的自然树、粒子系统和自动绘图模型,以及一些有趣的效果组件
作者: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游戏引擎的更多相关文章
- UWP简单示例(三):快速开发2D游戏引擎
准备 IDE:Visual Studio 图形 API:Win2D MSDN 教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面你需要考虑图形.输入和网络 以及相对独立的 ...
- Siki_Unity_1-8_使用Unity开发2D游戏_PongGame
Unity 1-8 使用Unity开发2D游戏 PongGame 任务1:演示 http://pan.baidu.com/s/1pKUHsev; up2i 任务2:案例介绍 创建PongGame,注意 ...
- Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节
声明: 本博客文章翻译类别的均为个人翻译,版权全部.出处: http://blog.csdn.net/ml3947,个人博客:http://www.wjfxgame.com. 译者说明:这是一个系 ...
- Atitit 开发2d游戏的技术选型attilax总结
Atitit 开发2d游戏的技术选型attilax总结 1.1. 跨平台跨平台:一定要使用跨平台的gui技术,目前最好的就是h5(canvas,webgl,dom) +js了..1 1.2. 游戏前后 ...
- 开发H5游戏引擎的选择:Egret或Laya?
开发H5游戏引擎的选择:Egret或Laya? 一.总结 一句话总结:选laya吧 二.开发H5游戏引擎的选择:Egret或Laya? 一.H5游戏开发的引擎介绍 开发H5游戏的引擎有很多,比如egr ...
- Android 2D游戏引擎AndEngine配置环境
Android 2D游戏引擎AndEngine配置环境 1.2 配置环境 在任何编程中,都需要一些软件或者硬件的支持.否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和 ...
- SNF快速开发平台--规则引擎整体介绍及使用说明书
一.设计目标 a)规则引擎语法能够满足分单,计费,WMS策略的配置要求.语法是一致和统一的 b)能够在不修改规则引擎模块的情况下,加入任意一个新的规则:实现上述需求之外的规则配置需求 c)运算速度快 ...
- 【2D游戏引擎】WIP反思
WIP(Working In Progress)是我初学游戏引擎开发时候开发的一个2D游戏引擎,当时计划为它实现类似Unity一样的编辑器,具有和Unity相似的工作流,但是由于水平不够,走了很多弯路 ...
- 配置JDKAndroid 2D游戏引擎AndEngine
配置JDKAndroid 2D游戏引擎AndEngine JDK全称为Java Development Kit(也即Java开发包),是用于支持Java 编程的基础.无论是什么编程,只要用到了Java ...
随机推荐
- 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题
千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...
- 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)
环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- 更愉快的书写CSS
我在写CSS的时候经常会碰到些麻烦事儿: 1)看上去蛮简单的排版却写了很久 2)代码写的越来越散,总是这里补一句,那里补一句,没有条理性 3)margin.padding.font-size等属性在不 ...
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
- EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...
- java常用的设计模式
设计模式:一个程序员对设计模式的理解:"不懂"为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的"复杂"恰恰就是设计模式的精髓所 ...
- Mysql - 函数
Mysql提供的函数是在是太多了, 很多我都见过, 别说用了. 园子里面, 有人弄了一个比较全的. MYSQL函数 我这里会将他写的完全拷贝下来, 中间会插入一些自己项目中使用过的心得 一.数学函数 ...
- 【python之路3】if 语句
1.if语句用法(if....else....) #!/usr/bin/env python # -*- coding:utf-8 -*- my_name = raw_input("plea ...
- 《图解HTTP》读书笔记
目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书<HTTP权威指南>与<TCP/IP详解,卷1>,但内容晦涩难懂,学习难度较大.其实,HTTP协议并不复杂,理 ...