Learning XNA 4.0

Size: px
Start display at page:

Download "Learning XNA 4.0"

Transcription

1 基于 PC,Xbox 360 和 Windows Phone 的游戏开发 学习指南 Araon Reed 著 裴小星 译

2 游戏编程 XNA 4.0 学习指南 想为 Xbox360 和 Windows Phone 7 开发游戏吗? 通过这本人手必备的教程, 您将立马掌握使用微软 XNA 4.0 游戏开发框架, 即使您毫无游戏开发经验 尽管 XNA 包含几个重要并且对于网络开发新手很难掌握的概念, XNA4.0 学习指南 却能通过清晰 易解的而又循序渐进的方式来减少学习弯路 每章节都提供了带有例证和注释的独立课程, 与练习和复习问题一起来帮助您测试理解力和实践刚学到的新技能 一旦阅读完本书, 您将可以自始至终独立地开发属于自己的高端游戏 XNA4.0 学习指南 完 美地介绍 XNA 世界, 带领 读者掌握和喜爱它 瑞恩 海尔 (Ryan Hair) 诺门大学学生 学习游戏开发的重要概念, 涵盖了从 2D 动画到 3D 场景摄像机和特效制作的各个方面 深入探讨 3D 渲染的高级着色语言 (HLSL), 并涉及到基本的人工智能概念 构建三个完整 激动人心且使用到 2D 3D 和多玩家技术的游戏 开发和部署您的游戏到 Xbox360 和 Windows Phone 7 平台上 这本书是个很好的起 点, 它将帮助您回答问题 : 我是否想深入钻研? 爱曼纽 塔巴利 (Emmanuel Tabarly) 法国 游戏与互动媒体 (ENJMIN) 研究生院 艾恩 里德 (Aaron Reed) 拥有广泛的软件开发及其教学经验 从 2004 年起, 他就在诺门大学 (Neumont University) 教授多门课程, 诸如.NET 网页开发与网络服务 DirectX XNA 以及系统设计与结构等 The Graduate School of Games and Interactive Media(ENJMIN) 学生 此前有程序开发经验者推荐 orelly.com 免费在线版本 试读 45 天后需购买此书 详见内页序言部分

3 XNA 4.0 学习指南 Aaron Reed 著 裴小星译

4

5 目 录 序言... VII 第 1 章 XNA 4.0 有哪些新特性?...1 改进的项目文件夹结构 1 为 Windows Phone 7 系列开发游戏 2 图形适配标准 2 可配置效果 3 标量与方向 4 内嵌状态对象 5 改进的输入 API 5 附加音频 API 5 音图枚举与视频回放 6 修改和添加的类与方法 6 知识测试 : 问答 6 第 2 章入门指南...8 系统需求 8 其它资源 9 安装 9 创建您的第一个 XNA 应用程序 9 您刚刚做了些什么 12 总结 13 知识测试 : 问答 14 第 3 章与精灵同乐...15 幕后一览 15 游戏开发和轮询 17 修饰您的游戏 19 在您的项目中增加一个精灵 21 加载并绘制精灵 23 透明度及其它选项 25 层深度 29 让我们动起来 32 动画 33 调整帧率 37 调整动画速度 38 I

6 您刚刚做了些什么 39 总结 39 知识测试 : 问答 40 知识测试 : 练习 40 第 4 章用户输入和碰撞检测...41 更多的精灵 41 键盘输入 43 鼠标输入 45 游戏手柄输入 46 保持精灵在游戏窗口中 49 碰撞检测 49 您刚刚做了些什么 53 总结 53 知识测试 : 问答 53 知识测试 : 练习 53 第 5 章应用面向对象设计...54 设计您的类 54 创建精灵类 55 创建用户控制精灵类 57 创建自动精灵类 61 游戏组件 62 编写 SpriteManager 64 清理 66 让它们动起来 67 您刚刚做了些什么 67 总结 67 知识测试 : 问答 67 知识测试 : 练习 67 第 6 章声音和音效...69 使用 XACT 69 在代码中使用 XACT 声音文件 74 使用简化音频 API 76 添加更多声音到您游戏中 77 您刚刚做了些什么 80 总结 81 知识测试 : 问答 81 知识测试 : 练习 81 第 7 章人工智能基础...82 II

7 图灵测试 82 随机创建精灵 83 随机产生精灵 84 无关的对象 87 创建一个追逐精灵 89 创建一个躲避精灵 93 您刚刚做了些什么 97 总结 97 知识测试 : 问答 97 知识测试 : 练习 98 第 8 章整合...99 绘制 2D 文本 99 随机生成不同精灵类型 104 增加精灵的多样性 106 添加背景图片 111 游戏得分 113 游戏状态 118 启用 / 禁用游戏组件 121 游戏结束逻辑和画面 123 微调游戏 129 创建法宝 132 您刚刚做了些什么 136 总结 136 知识测试 : 问答 136 知识测试 : 练习 136 第 9 章 3D 游戏开发 坐标系 138 摄像机 139 创建 3D 镜头 141 绘制基元 142 矩阵乘法 147 移动与旋转 147 背面消隐 150 关于旋转 151 再谈旋转 152 基元类型 153 应用纹理 157 您刚刚做了些什么 160 总结 160 III

8 知识测试 : 问答 160 知识测试 : 练习 161 第 10 章 3D 模型 使用 3D 模型 162 建立项目 162 向项目中添加模型 165 用 BasicModel 类绘制模型 166 添加模型管理器 169 让模型转起来 172 您刚刚做了些什么 173 总结 174 知识测试 : 问答 174 知识测试 : 练习 174 第 11 章创建第一人称摄像机 可移动的 3D 摄像机组件 175 移动第一人称摄像机 178 旋转第一人称摄像机 180 摄像机的偏航 182 摄像机的翻转 183 摄像机的俯仰 183 3D 游戏的摄像机代码 184 您刚刚做了些什么 187 总结 187 知识测试 : 问答 188 知识测试 : 练习 188 第 12 章 3D 碰撞检测与射击 创建可移动的敌人 189 添加游戏逻辑 191 开始射击 197 三维碰撞检测及边界范围 201 添加准星 204 添加音效 205 您刚刚做了些什么 210 总结 210 知识测试 : 问答 211 知识测试 : 练习 211 第 13 章 HLSL 基础 HLSL 语法 213 IV

9 HLSL 特效文件样例剖析 214 将 HLSL 特效应用于 C# 221 应用 HLSL 纹理 228 HLSL 特效 : 反相 234 HLSL 特效 : 模糊 235 HLSL 特效 : 灰度 236 您刚刚做了些什么 237 总结 237 知识测试 : 问答 238 知识测试 : 练习 238 第 14 章粒子系统 创建粒子引擎 240 添加粒子特效文件 249 在游戏中添加粒子引擎 251 添加星域 253 您刚刚做了些什么 256 总结 257 知识测试 : 问答 257 第 15 章包装您的 3D 游戏 添加启动界面游戏组件 259 保留得分 268 添加能力提升机制 270 您刚刚做了些什么 274 知识测试 : 练习 275 第 16 章部署到 Xbox 360 上 添加 Xbox 360 设备 276 将项目移植到 Xbox 360 上 279 支持手柄输入 281 部署到 Xbox 360 上 287 Xbox 360 显示设置 288 标题安全区 289 您刚刚做了些什么 291 总结 291 知识测试 : 问答 291 第 17 章针对 Windows Phone 7 的开发 设置 Windows Phone 7 设备 292 注册开发人员账户 292 注册您的 Windows Phone V

10 开启您的电话 294 创建 Windows Phone 7 项目 297 资源 298 深入学习 299 屏幕旋转和分辨率 303 更多的模型类 304 添加模型管理器 309 细节整理 313 您刚刚做了些什么 316 总结 316 知识测试 : 问答 317 第 18 章多人游戏 分屏显示功能 318 网络游戏开发 325 网络配置 326 编写 XNA 网络游戏 328 更改精灵类 329 更改用户控制精灵类 329 为 Game1 类编码 331 添加更新代码 333 在 SignIn 状态下更新游戏 334 在 FindSession 状态下更新游戏 336 在 CreateSession 状态下更新游戏 338 在 Start 状态下更新游戏 338 在 InGame 状态下更新游戏 345 在 GameOver 状态下更新游戏 346 添加绘制代码 347 添加疯狂的生化炸弹! 350 您刚刚做了些什么 357 总结 357 知识测试 : 问答 358 附录问答与练习参考答案 VI

11 序 言 1 我在诺门大学教授 DirectX 和 XNA 游戏开发课程也有好几年了, 然而我总是为自己没能找到 适合这些课程的书籍而倍感失落 这门学科有着海量的相关书籍, 但却没有一本适合我的课程目标 ( 专门为熟悉 C# 编程语言的大学生设计的初级游戏开发课程 ), 或者说那些书的内容没有以一种我觉得合适的风格和顺序来呈现 许多书籍要求事先具备太多的游戏或图形开发领域的预备知识, 不然就是假定读者几乎不具备游戏开发之外的相关知识 还有一些书则过分地依赖第三方库, 或者以一种让新接触游戏开发的读者违背直觉的顺序来组织书中的内容 我发现我经常需要从一本书的第 3 章跳到另一本书的第 18 章, 然后跳回原来的书看第 7 章和第 9 章, 如此反反复复地跳跃, 同时我还需要用自己创作的幻灯片 代码示例和文档来进行衔接 最后, 我决定以我为 XNA 游戏开发课程所创作的内容为题材写一些能够在课堂上使用的材料 最初我只是打算简单地给学生们写一些讲义和短文, 但后来我又意识到这所大学之外的广大读者或许也能够从这些材料中受益 于是我联系了 O'Reilly 出版社, 然后就有了大家手上的这本书 根据自己在 XNA 游戏开发方面的教学经验, 我能够判断出学生们通常会在哪些方面遇到学习上的障碍, 而哪些表达方式又能让学生很容易地理解 ; 此外, 我也创造了一种直观的教学方法, 能够以合理而容易接受的顺序, 循序渐进地呈现书中的内容 这本书就是遵照这样一种顺序, 并且以帮助读者充分理解每一个独立的教学主题为目的, 来设计书中的所有课程, 以及介绍各式各样有关游戏开发的实用概念的 本书为谁而写 本书为掌握.Net Framework 和 C#( 或相关技术 ) 基础的读者提供完整的入门基础教程, 不要求读者具备 XNA 或者其它游戏 图形领域的开发经验或知识 本书如何组织 本书将带领读者漫步于三个不同的 XNA 游戏的开发过程, 同时向读者介绍 XNA 游戏开发的相关概念 尽管大多数资料通用于任何可用平台的游戏开发, 但第 17 章和第 16 章分别专门讲解了 Windows Phone 7 和 Xbox 360 游戏主机上的游戏开发 本书的第一部分带领读者了解 XNA 4.0 的新特性和一个 2D 游戏的开发过程, 下面是组成这 1 译注 : 诺门大学英文名为 Neumont University VII

12 个部分的章节 : 第 1 章 第 2 章 第 3 章 第 4 章 第 5 章 第 6 章 第 7 章 第 8 章 带领读者了解 XNA 4.0 与之前的版本相比有哪些变化 简单地介绍 XNA, 开发 XNA 游戏需要的工具和 XNA Game Stduio 4.0 的安装 2 介绍 2D 精灵 透明度 排序次序 移动 帧率 精灵位图还有动画 涵盖键盘 鼠标和 Xbox 360 手柄的输入处理并实现简单的碰撞检测 讨论并实现游戏组件, 并把面向对象类层次结构应用到您的游戏设计中 介绍跨平台音效制作工具 (XACT 3 ), 以及使用新的简化的音频 API 为您的游戏 (PC Xbox360 Windows Phone 7) 添加声音 介绍人工智能学科的本质和人工智能的基础概念, 并且在类层次中使用自定义的派生类来为您的精灵实现不同的行为 完成 2D 游戏的最后一步, 包括 2D 文本 分数 添加不同类型的精灵 背景图片 游戏状态和法宝系统 下一个部分将带领读者走进 3D PC 游戏开发 在这部分的末尾, 将对游戏进行调整并最终移植到 Xbox 360 上 这一部分的章节有 : 第 9 章讨论坐标系 摄像机和图元的绘制,3D 空间中物体的平移 旋转和缩放 另外也将谈到背面消隐和纹理技术 第 10 章介绍 3D 模型,3D 模型在 3D 空间中的绘制 旋转和移动 第 11 章带领读者实现一个基于向量的第一人称的摄像机 ; 实现前后移动, 平移, 偏航 (yaw), 俯仰 (pitch) 和翻滚 (roll) 2 译注 :sprite sheet 也可译作 精灵图 或 精灵表 精灵位图会在第 3 章重点介绍的 3 译注 :XCAT 英文全称 Cross platform Audio Creation Tool, 中文名为 跨平台音效制作工具, 第 6 章会重点介绍的 VIII

13 第 12 章深入研究射击移动中的敌人的代码, 创建一个射击目标, 在 3D 空间中移动它, 并且用包围球处理 3D 空间中的碰撞检测 ; 为游戏添加 3D 准星 HUD 和音效 第 13 章介绍高级着色语言 (HLSL 4 ) 语法及其实现和在 XNA 中使用 HLSL 特效所需要编写的代码 ; 用 HLSL 实现多种图像处理效果 第 14 章带领读者实现一个用来创造爆炸粒子效果的自定义顶点和粒子 第 15 章微调您的 3D 游戏, 包括启动画面, 游戏状态, 分数和能力提升功能等 第 16 章带领读者将 Xbox 360 连接到 PC, 并将游戏部署到 Xbox 360 上, 另外还探讨了 XBox 360 和 PC 上的用户输入与屏幕分辨率的差异 下一个部分将带领读者开发一个完整的 Windows Phone 7 游戏 : 第 17 章带领读者开发 Windows Phone 7 上的新游戏, 同时探讨 Windows Phone 7 开发与其它平台上的开发的关键区别 本书的最后一部分将带领读者用 XNA 开发一个网络游戏 这一部分只有一章, 以之前的所有章节为基础, 在开发一个新的 XNA 游戏的过程中集中展现 XNA 的网络功能 : 第 18 章通过分屏功能和网络功能来介绍多人游戏的概念 ; 涵盖了网络体系架构 网络状态 通过信息包进行网络通信和提供游戏玩家服务等主题 最后, 在附录中, 您将会找到每个章节末尾的测试题的答案 技术支持 我写这本书的目的是帮助读者真正地理解和热爱 XNA 游戏开发 为此, 我将通过我的博客来支持这本书 我的博客地址为 : 4 译注 :HLSL 英文全称 High Level Shader Language, 维基百科译作 高级着色器语言, 也可译作 高级渲染语言 IX

14 在这个网站上, 您可以找到本书的源代码, 和一些 XNA 相关的内容 ( 当然也有一些非 XNA 相关的内容 ) 请自由地在论坛上发表您的疑问 评论甚至是为其它读者解答问题 本书中使用的约定 以下是本书使用的印刷排版格式的约定 : 斜体用于强调 技术术语定义 超链接 文件名 文件扩展名和路径名 等宽字体用于代码样例 方法 函数 变量名及其值 对象和类名等 等宽粗体用于强调代码示例的重点部分 这个图标表示提示 建议或概括性的说明 这个图标表示一个警告或者注意事项提醒 使用示例代码 这是一本帮助您解决问题的书 一般来说, 您可以在您的程序和文档中使用这些代码 除非您复制了大量的关键代码, 否则您可以在不获我们许可的情况下自由使用本书中的代码 例如, 写一个程序使用到本书几大段代码不需要获得许可, 但销售或分发一张带有本书示例的 CD ROM 却需要许可 ; 为了回答一个问题而引用本书或援引本书的示例代码不需要许可, 但将大量的示例代码整合到您的产品文档中却需要获得许可 我们会很感激您注明出处, 但这不是必须的 一段引用说明通常包括标题 作者 出版商和 ISBN 例如:Learning XNA 4.0, by Aaron Reed. Copyright 2011 Aaron Reed, 如果您觉得您所使用的代码示例超出了常用范围或以上所提及的许可范围, 无须拘谨, 请通过 permissions@oreilly.com 与我们联系 X

15 我们希望聆听您的声音 我们已经尽我们所能测试并核对了书中的信息, 但是您可能会发现某些功能已经有所改变或者我们也许犯了一些小错误 ( 尽管我们觉得这种可能性实在是微乎其微 ) 请告诉我们您发现的任何错误, 以及您对后续版本的建议, 您可以写信到 : O Reilly Media, Inc Gravenstein Highway North Sebastopol, CA ( 美国或加拿大 ) ( 国际或当地 ) ( 传真 ) 我们为这本书设有一个网页, 在那里我们列举出示例和未来版本计划 您可以到下面网址获得这些信息 : 您也可以发送电子简讯 订阅邮件或者需要一份书目, 请发送电子邮件到 : info@oreilly.com 评论图书, 请发送电子邮件到 : bookquestions@oreilly.com 关于我们图书 会议 资源中心和 O'Reilly 网络的更多信息, 请留意我们的网站 : Safari Books Online 当您在您最爱的技术图书封面上看到 Safari Books Online 图标时, 那意味着此书可以到 O'Reilly 网络 Safari 书架 ( O'Reilly Network Safari Bookshelf ) 在线获取 Safari 提供一套比电子书更好的方案 它是一个虚拟的图书馆, 能够让您搜索成百上千本顶级技术图书, 剪切和粘贴示例代码, 下载部分章节和更快找到您所需要的最精确的答案和实时信息 免费尝试一下 : XI

16 XII

17 第 1 章 XNA 4.0 有哪些新特性? 本章中, 我将回顾下 XNA 4.0 所发生的主要改变 如果您熟悉 XNA 3.x 或其它版本的话, 这 将是开始学习本书的很好的起点 如果您从未接触过 XNA, 可能应该跳到下一章 您不会错过 任何信息, 因为本章涵盖的内容在其它章节中都有介绍 改进的项目文件夹结构 当您在 XNA 4.0 中创建游戏项目时, 首先会注意到解决方案的结构改变了 在 XNA 早期的版本中, 内容管道 (content pipeline) 从一个名为 Content 的子文件夹中获得游戏内容,Content 位于您创建的游戏项目中, 在解决方案资源管理器中可见 ( 见图 1 1) 图 1-1 XNA 3.x 解决方案示例在 XNA 4.0 中,Content 文件夹在您的解决方案中被移动到新的项目中 内容项目将被列入到名为 GameProjectNameContent( 请用您项目名替换 GameProjectName) 的目录下, 并且后面带有用括号括起来的 Content 字样 ( 见图 1 2) 在内容项目上添加您所有的游戏内容 ( 声音, 纹理和模式等等 ), 与 XNA 3.x 中添加它们到内容文件夹的方法相同 您还需要使用相同的代码通过内容管道访问内容, 跟您在 XNA 3.x 中的操作相同 这一变化使得同一个项目的多个版本 ( 也就是, 如果您建立 Windows 和 Xbox 360 都可用的项目 ) 的界面更加友好些同时也少了些混淆 1

18 图 1-2 XNA 4.0 解决方案示例 为 Windows Phone 7 系列开发游戏 与 XNA 框架的早期版本相同,XNA 4.0 被设计用于跨平台开发 开发人员使用 XNA 4.0 可以为 Windows Xbox 360 以及现在的 Windows Phone 7 系列编写游戏 不仅仅是那样, 除了一些资源管理与屏幕分辨率的问题, 几乎 100% 地为这些平台中的其中之一所编写的代码同样也都可以在其它平台上使用 这样就最大限度的为游戏开发者提供了针对每个平台创建游戏的弹性 想了解更多关于 Windows Phone 7 系列游戏开发的信息, 请参阅第 17 章 图形适配标准 在当今支持 DirectX 10 或更高 强大的 Xbox 360 与 Windows Phone 7 系列引进的一线显卡之间,XNA 框架支持在具有不同硬件性能的广泛的硬件上进行开发 在 XNA 早期的版本中, 这些硬件差异必须在运行时 (runtime) 上处理, 这经常会导致平台相关性代码 为了帮助促进在这些不同的设备上进行开发,XNA 4.0 引入了图形适配标准 (graphics profile 5 ) 的概念 这些标准允许开发者通过支持配置标准所指排的特定图形 API 包来选定某些硬件设备 在 XNA 4.0 中有两种配置标准 :Reach 和 HiDef HiDef 是设计用于高功率的 一线硬件, 而 Reach 是设计用来支持更宽泛的硬件设备 Reach 标准提供一个有限的图形特征集合并且它是 HiDef 的子集 当选择使用 Reach 标准编写游戏时, 您牺牲了一些更强大的图形 API, 但同时也确保您的游戏可以在更宽泛的设备 ( 尤其是 Windows,Xbox 360 和 Windows Phone) 上运行, 假设这些设备都符合 XNA 4.0 的最小规格要求 HiDef 标准设计用来支持当前最强大的显卡 您可以使用 HiDef 标准来专注于 Xbox 360 硬 5 2 译注 :graphics profile 较难直译, 暂意译为 图形适配标准, 后文会简称为 ( 适配 ) 标准 或 配置

19 件以及至少支持 DirectX 10 显卡的基于 Windows 的电脑 通过使用 GraphicsAdapter.IsProfilesSupported 方法在运行时上您可以辨别您的 硬件支持哪个配置标准 下面的表 中列出了 Reach 和 HiDef 标准之间更多的细节差异 : 表 1-1 XNA 图形适配标准比较 Reach HiDef 支持平台 Windows Phone 7 系列,Xbox 360, 与带有至少支持 shader model 2.0 Xbox 360, 带有 DirectX 10( 或更高 )GPU 的 Windows PC 的 DirectX 9 GPU 的 Windows PC 着色器模型 2.0( 但 Windows Phone 不支持自定义着色器 ) 3.0+(Xbox 360 支持自定义着色器扩展如 vfetch, 但它在 Windows 上不可用 ) 最大纹理尺寸 ,096 最大立方图尺寸 512 4,096 最大体纹理尺寸 不支持体纹理 256 无二次幂限制的纹理 支持但带有限制 : 不支持环绕选址模式, 是 不支持 mipmaps, 对无二次幂限制的纹理不支持 DXT 压缩 无二次幂限制的立方 否 是 图 无二次幂限制的体纹 不支持体纹理 是 理 每次 Draw 调用的基 65,35 1,048,575 元最大值 顶点流最大值 最大顶点流幅度 索引缓冲格式 16 位 (bit) 16 和 32 位 顶点元素格式 Color,Byte4,Single, Vector2,Vector3, 所有的 Reach 顶点元素格式, 加上 HalfVector2,HalfVector4 Vector4,Short2,Short4, NormalizedShort2, NormalizedShort4 纹理格式 Color,Bgr565,Bgra5551, Bgra4444,NormalizedByte2, NormalizedByte4,Dxt1, Dxt3,Dxt5 所有的 Reach 纹理格式, 加上 Alpha8,Rg32,Rgba64, Rgba ,Single,Vector2, Vector4,HalfSingle, HalfVector2,HalfVector4; 浮点纹理格式不支持过滤 6 译注 : 限于译者水平, 表 1 1 中某些专业名词的翻译可能存在错漏之处 为了更好地帮助读者理解这些信息, 本章末会附录上相应的中英文技术名词对照表, 以供参阅 3

20 顶点纹理格式 不支持顶点纹理 Single,Vector2,Vector4, HalfSingle,HalfVector2, HalfVector4 渲染目标格式 调用 QueryRenderTargetFormat() 来找出支持什么 调用 QueryRenderTargetFormat() 来找出支持什么 多重渲染目标 否 上限为 4; 必须都有相同的位深度 ; 支持阿尔法混合与每个渲染目标的独立写屏蔽 闭塞查询 否 是 独立阿尔法混合 否 是 可配置效果 在 XNA 的早期版本中 BasicEffect 类是一个非常基础的效果, 它的执行主要是使游戏开发新手可以在对复杂的着色器代码没有深入了解的情况下构建游戏 当时的观念是认真的游戏开发者会实现它们自己的着色器而不会依赖 BasicEffect 类 随着 Windows Phone 7 的上市很多设想都不得不改变, 因为它不支持自定义着色器 因此, 因此, 新的可配置效果被添加到 Reach 和 HiDef 两者标准中 它们是 : 基本效果 : 对 BasicEffect 类进行调整从而包含更多的像素和顶点着色器用来支持更真实的灯光与烟雾效果 双重纹理效果 : 这个效果使您可以使用带有独立纹理坐标的两个不同的纹理 这两个纹理被混合到一起用来增添复杂性和更多的细节 阿尔法测试效果 : 这个效果使用一个参考阿尔法 (reference alpha) 和一个阿尔法功能实现阿尔法测试 它可以通过仅更新在场景中描绘的像素来提高性能 皮肤效果 : 这个效果使用骨骼和重量来确定顶点位置 当用在动画和实例中时该效果有很强大的作用 环境映射效果 : 这个效果使用到了根据环境的纹理和立方映射纹理来渲染对象, 反射来自场景对象的光线 4

21 内嵌状态对象 在 XNA 的早期版本中, 一些状态属性, 被用来改变场景在屏幕上绘制的方式以及图形设备处理您的游戏发送给它数据的方式, 这些都已经被移动到状态对象类中 这些类是 : BlendState 控制颜色和阿尔法值如何被混合的 DepthStencilState 控制深度缓冲 (depth buffer) 与模板缓冲 (stencil buffer) 是如何被使用的 RasterizerState 确定如何把矢量数据 ( 形状 ) 转化为栅格数据 ( 像素 ) SamplerState 确定如何取样纹理数据 标量与方向 XNA 4.0 中的标量 (scalars) 使开发者在编写游戏时无需担心原始分辨率或屏幕方向的问题 当您玩游戏时, 标量将自动地根据设备将分辨率调节为您想要的分辨率 这个增强功能极大的提高了游戏性能 屏幕方向是 Windows Phone 7 设备上最重要的元素, 当旋转设备, 横竖屏循环切换并返回 标量自动地从一个方向到另一个方向去映射您的游戏并且旋转输入装置, 例如相应的输入触摸面板 改进的输入 API Microsoft.Xna.Framework.Input.Touch 命名空间含有几个类, 这些类能访问到对 Windows 和 Windows Phone 设备的多点触摸输入 此命名空间增加 TouchPanel 类和 TouchLocation 类, 它们能够访问到来自输入设备 ( 如 Windows Phone 7 系列设备中的触摸面板 ) 的触控点 附加音频 API 在 Microsoft.Xna.Framework.Audio 命名空间中增加了两个新类来提高音频支持力度 : Microphone 这个类提供使用麦克风来捕获音频的方法 域和事件 DynamicSoundEffectInstance 5

22 这个类提供音频缓冲回放的方法和事件, 让开发者可以回放合成或缓冲的音频 音图枚举与视频回放 添加新的音频支持使开发者可以使用统一资源标识符 (URI 7 ) 来播放歌曲, 以及选择, 编辑和发布照片 使用 Song.FromUri 方法构造一个基于指定 URI 的 Song 对象 使用 MediaLibrary.SavePicture 方法保存图像到媒体库中 修改与添加的类与方法 相当一部分的类与方法被添加或修改了 您可以在 Microsoft 的 MSDN 网站 us/library/bb aspx 上查看全部的清单 知识测试 : 问答 1. 在 XNA 4.0 中对 XNA 文件夹结构进行了什么重大改变? 2. XNA 4.0 支持什么游戏平台? 3. XNA 4.0 中 Reach 和 HiDef 标准有什么不同? 7 6 译注 :URI 英文全称 Uniform Resource Identifier(s)

23 译者附录 : 表 1 1 中部分中英文技术名称对照表译者的话 最新专业技术名词的翻译, 一直都是翻译的难点 我们一直遵循着翻译的几大原则, 对于英语技术名词的翻译一般采用 : 直译能准确表达出文意就采用直译 ; 无法直译的, 就采用意译 ; 两者都无法准确表达的就直接使用英语原词条或者音译 ; 所有技术名词的翻译均考虑到了易解性 通用性与权威性 我们参阅大量资料, 并通过多次网络 ( 网络是最大的语料库 ) 尤其维基搜索等来求证 即使如此, 限于译者水平, 翻译错漏之处仍无法避免, 望广大读者批评指正, 以便再版时修正 英文 中文 备注 shader model 着色器模型 也可译作 渲染器模型,3D 图形领域一般译作 优化渲染引擎模式 cubemap/cube map(ping) 立方图 网络上有译作 立方环境贴图 或 立方图映射 等 Volume Texture 体纹理 直译 Non Power of Two Textures (Non-Power-of-Two Textures) 无二次幂限制的纹理 此译名获得网络搜索支持, 也较符合原书意思 Non Power of Two Cubemaps 无二次幂限制的立方图 参照上行译法给予翻译 Non Power of Two Volume 无二次幂限制的体纹理 同上 Textures wrap addressing mode 环绕选址模式 Primitives 基元 Vertex Streams 顶点流 Vertex Streams Stride 顶点流幅度 Index Buffer Formats 索引缓冲格式 Vertex Element Formats 顶点元素格式 Texture Formats 纹理格式 Vertex Texture Formats 顶点纹理格式 Render Target Formats 渲染目标格式 Multiple Render Targets 多重渲染目标 alpha blending 阿尔法混合 independent write masks 独立写屏蔽 Occlusion Queries 闭塞查询 Separate Alpha Blend 独立阿尔法混合 7

24 第 2 章 入门指南 您是否曾经想过要开发属于自己的游戏? 我猜您的的回答一定是 是, 因为您正在阅读本书 ( 当然, 除非您仅仅是因为本书文笔优美而进行阅读的, 如果是这种情况, 那么也请继续往下读吧 ) 就像许多孩子一样, 我在游戏开发方面的兴趣更多地是在玩游戏的过程中培养起来的 有时我宁愿连续在电脑面前花费好几个小时 这些游戏经历始于太空入侵者 (Space Invaders) 爆破小行星 (Asteroids) 雅达利战争 2600(Combat on the Atari 2600) 等 后来, 我又着迷于罗伯塔 威廉姆斯 (Roberta Williams) 的 国王秘史 (King s Quest 8 ) 系列游戏里达文陲 (Daventry) 的国王格雷厄姆 (Graham) 的传奇故事 我和我的弟弟为了打败迪凯瑟垅 (Decathlon) 的布鲁斯 詹纳 (Bruce Jenner), 不知敲坏了多少个键盘 但我意识到仅仅玩游戏是不够的 我还想做得更多 ; 我想真正地亲自创造游戏 我认为是好奇心将软件开发者和软件使用者区分开来的 ; 或者说是一种想看看画面背后到底发生了什么和是什么使事情变得有趣的渴望 对于我们这些天生有着强烈好奇心并渴望着自己编写游戏的人来说, 微软的 XNA 游戏开发框架完全能够实现我们曾经的梦想 借助这个开发框架直观的构建方式和它向开发者展现的强大力量, 在 PC 上编写激动人心的游戏从未变得如此容易 尤为重要的是,XNA 4.0 还为独立开发者提供了前所未有的机会 : 能够为 Xbox 360 和 Windows Phone 7 开发自己的游戏 在此之前, 面向次世代主机或者最新便携多媒体设备的软件开发工具包 (SDK) 的获取从来没有这么容易 我相信您肯定已经跃跃欲试, 准备要动手去创造下一个伟大的游戏的了, 那就让我们马上开始吧 这一章将帮助您安装好所有需要的程序, 这样您就可以一路高歌猛进, 开始您的 XNA 4.0 开发之旅了 系统需求 8 8 本书使用 XNA Game Studio 4.0, 它是 Microsoft Visual Studio 集成开发环境 (IDE) 的扩展, 目的是辅助 XNA 游戏的开发 XNA Game Studio 使用 XNA Framework 4.0, 为开发者提供了一个 XNA 游戏的框架, 以便开发者进行开发或进行定制和扩展来创造自己的游戏 XNA Game Studio 4.0 可以在 Visual Studio 2010 的多种版本上运行 安装 XNA Game Studio 4.0 之前, 必须先安装 Visual Studio 2010 标准或更高版本 ( 需要安装 C# 语言支持组件 ) 或者 Visual C# 2010 速成版 Visual C# 2010 速成版可以在 Microsoft 微软的官网 p/ 上免费下载 如果您没有其它版本的授权的话, 这将是开始学习 XNA 的好办法 译注 :King s Quest 也译作 国王密使, 是由美国电脑游戏公司雪乐山制作的一个冒险游戏系列, 系列中的首作在 1984 年推出 它被认为是冒险游戏黄金时代中的一只经典, 在首作 第一只 三维 冒险游戏 成功后为雪乐山公司带来了名誉 Roberta Williams, 雪乐山公司的创立者及前拥有人, 设计了国王密使系列中的所有游戏 ( 来自维基百科 )

25 在整本书中, 我都会使用 Visual Studio 2010 专业版 不同版本之间的屏幕截图应该是一样的 ( 至少很相似 ), 但是您应该意识到使用不同的版本创建书中的例子可能存在不一致的地方 通过 XNA 4.0, 开发者可以将他们的游戏部署到以下平台 :Windows Vista Windows 7 Xbox 360 和 Windows Phone 7 移动设备 为了在 Windows 平台下运行 XNA 游戏, 您需要支持 WDDM 1.1 和 DirectX 10( 或更高版本 ) 的显卡 不过, 也有一套受限制的 API, 编写出的游戏可以在支持 DirectX 9 和 Shader Model 2.0 的显卡上运行 XNA Game Studio 4.0 可以在 XNA 创作者俱乐部 (XNA Creator s Club) 网站上免费下载, 网址为 其它资源 除本书之外, 您应该看看 XNA 创作者俱乐部网站 ( 这个网站包含了许多教程 示例代码和其它可以帮助您开始学习 XNA 的资源 如果您是一名学生, 还应该看看 DreamSpark( DreamSpark 是微软的一个让学生可以免费使用 Visual Stduio 专业版和其它设计开发工具的活动 安装 在您安装了前面提到的某种版本的 Visual Studio 之后, 开始安装 XNA Game Studio 4.0 XNA Game Studio 的安装相当的简单, 但这里我将带您走过每一步 在 EULA 界面 ( 图 2-1), 仔细阅读最终用户许可协议并点击 Accept 9 ( 接受 ) 接下来, 点击 Install Now( 现在安装 ) 按钮, 如图 2-2 所示 如果需要, 这个安装程序会自动下载完成安装所需要的资源, 然后自动安装 Game Studio 4.0 和 Windows Phone Developer Tools 安装完成后您会看到安装完成画面 ( 图 2-3) 不错吧, 嗯? 您现在可以准备用 XNA 大干一场了! 创建您的第一个 XNA 应用程序 现在您已经安装好 XNA Game Studio 4.0, 是时候去创建您的第一个 XNA 应用程序了 在 Visual Studio 中选择 File( 文件 ) New( 新建 ) Project( 项目 ) 在窗口左边的 Installed Templates ( 已安装模板 ) 中选择 Visual C# XMA Game Studio 4.0 在窗口右边的项目模板区域中, 您可以看到很多可选项目, 这时您应该创建一个 Windows Game (4.0) 项目, 命名为 Collision, 选择项目的保存目录, 然后点 OK, 如图 译注 : 为了准确起见, 文中像 Accept File New Project 等软件安装或 Visual Studio 操作指南会以原始英文的方式出现, 某些词条会在首次出现的地方置入括号内给予中文翻译 9

26 图 2-1 EULA( 最终用户授权许可 ) 图 2-2 欢迎界面 10

27 图 2-3 安装完毕 图 2-4 新建项目 11

28 图 2-5 运行 Collision 项目当项目加载完成后, 选择 Debug( 调试 ) Start Debugging in Visual Studio 项目将开始编译然后运行, 显示一个和图 2 5 类似的界面 注意, 如果您收到如图 2 6 所示的错误信息 ( 而不是游戏窗口 ), 可能您的显卡不支持 DirectX 10 或者您需要更新您的显卡驱动程序 如果您的显卡只支持 DirctX 9 以及 shader model 2.0, 您可以调整游戏设置, 仅使用有限的一部分 API 集合, 来使您仍然能够使用现有的显卡进行游戏编程 要调整游戏设置, 请在解决方案资源管理器中的 Collision 项目上点击鼠标右键, 选择 Properties( 属性 ) 将游戏设置为使用 Reach ( 而不是 HiDef ), 如图 2 7 所示 游戏设置为 Reach 之后, 再次运行游戏, 如果您的显卡满足最低配置的话, 将可以看到游戏窗口 同时需要注意, 如果是为 Windows Phone 7 开发游戏, 项目默认设置为 Reach ; 相反, 如果是为 Xbox 360 开发游戏, 项目默认设置为 HiDef 恭喜! 您刚刚创建了您的第一个 XNA 游戏! 也许没有您以前玩过的游戏激动人心, 不过别搞错了, 这个一个 100% 纯正的 XNA 4.0 应用程序 而且它实际上做的要比我们看到的要多很多 尽管这个项目没有用到图像 声音或者其它酷炫的内容, 但这个应用程序的确正在利用 XNA 框架来绘制 更新并管理资源, 就像这本书会用到的那样 稍后的章节我们会讨论程序画面的背后到底发生了些什么 您刚刚做了些什么 现在您已经准备好动手创造您的第一个游戏了, 但是首先, 让我们回顾一下您在这一章里的成果 : 您安装了 XNA Game Studio 4.0 并且配置了您的计算机来进行 XNA 开发 您创建并运行了您的第一个 XNA 项目 12

29 图 2-6 未能发现适配的显卡 错误 图 2-7 使用 Reach 设置 部署到 Xbox 360 或 Windows Phone 7 如果您急于尝试 Xbox 360 或者 Windows Phone 7 上的游戏开发, 可能需要提前看看第 17 章有关在 Windows Phone 7 上部署游戏的内容或第 16 章有关在 Xbox 360 上部署游戏的内容 由于几乎所有为 PC 平台编写的代码都可以很容易地移植到上述平台上, 所以这本书将主要介绍 PC 平台上的 XNA 游戏开发 而前面提到的这两个章节将包括针对那些平台需要考虑的具体细节 总结 XNA 是一个功能强大的游戏开发框架, 可以提高在 PC 平台 Xbox 360 游戏主机和 Windows Phone 7 系列手机上进行游戏开发的效率 为了使用 XNA 开发游戏, 您需要安装 Visual Studio 2010 标准版或更高的版本, 或者是 Visual 13

30 C#2010 速成版 您还必须安装 XNA Game Studio 4.0 知识测试 : 问答 1. XNA Game Studio 4.0 允许您为哪些平台开发游戏? 2. 哪些版本的 Visual Studio 支持 XNA Game Studio 4.0? 14

31 第 3 章 与精灵同乐 在上一章中, 我提到过, 在您所创建的简单蓝幕游戏背后, 实际上有很多事情正在发生 让我们更深入地去了解代码看看到底发生了些什么 首先, 请打开您第 2 章创建的游戏项目 幕后一览 Program.cs 文件相当简单明了 在这个文件里, 您的 Main 方法创建了一个类型为 Game1 的新对象, 并且执行了它的 Run() 方法 您游戏的真正核心在 Game1.cs 文件中, 文件内容看起来应该像这样 : using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace Collision /// <summary> /// This is the main type for your game /// </summary> public class Game1 : Microsoft.Xna.Framework.Game GraphicsDeviceManager graphics; SpriteBatch spritebatch; public Game1() graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; /// <summary> /// Allows the game to perform any initialization it needs to before /// starting to run. This is where it can query for any required /// services and load any non-graphic-related content. Calling /// base.initialize will enumerate through any components /// and initialize them as well. /// </summary> protected override void Initialize() // TODO: Add your initialization logic here base.initialize(); 15

32 /// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() // Create a new SpriteBatch, which can be used to draw textures. spritebatch = new SpriteBatch(GraphicsDevice); // TODO: use this.content to load your game content here /// <summary> /// UnloadContent will be called once per game and is the place to unload /// all content. /// </summary> protected override void UnloadContent() // TODO: Unload any non-contentmanager content here /// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Update(GameTime gametime) // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.exit(); // TODO: Add your update logic here base.update(gametime); /// <summary> /// This is called when the game should draw itself. /// </summary> /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Draw(GameTime gametime) GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here base.draw(gametime); 在这段代码中您会注意到自动提供了几个类成员变量, 还有 Game1 的构造方法和其它五个方法 其中第 1 个类成员变量是 GraphicsDeviceManager 类的对象 这是一个非常重要的对象, 它为开发者提供了一种访问 PC Xbox 360 或者 Windows Phone 7 上的图形设备的途径 GraphicsDeviceManager 的 GraphicDevice 属性代表了机器上实际的图形设备 图形设备对象在 XNA 游戏和显卡 ( 或更准确的说, 显卡上的 GPU 10 ) 之间起中介作用,XNA 游戏在屏幕上做的任何事情都要通过这个对象来执行 译注 :GPU 英文全称 Graphics Processing Unit, 中文译作 图形处理器

33 第 2 个类成员变量是 SpriteBatch 类的实例, 这是一个您将用来绘制精灵 (Sprite) 的核心对象 在计算机图形学术语中, 精灵被定义为一张集成于大场景中的 2D 或 3D 11 图像 2D 游戏就是通过绘制场景中的多种精灵 ( 玩家精灵 敌人精灵和背景精灵, 等等 ) 来完成的 本章中, 您将使用到这个概念并且绘制属于自己的多种精灵 Initialize 方法被用来初始化变量和其它与 Game1 对象相关的对象 您的图形设备对象将在这里被实例化, 然后可以在 Initialize 方法中根据图形设备对象的设置来初始化其它对象 在后面的章节里, 您还将用这个方法来初始化分数值和其它类似的项目 LoadContent 方法在 Initialize 方法之后被调用, 另外在任何需要重新载入游戏图形内容的时候也会被调用 ( 例如, 因为玩家改变显示设置而重置了图形设备 ) 在 LoadContent 方法中, 将会载入游戏所需要的一切图形及其它内容, 包括图像 模型和音效等 因为目前的项目不会做什么令人激动的事, 所以这个方法中也不会有多少代码 当 LoadContent 方法调用完成后,Game1 对象将进入游戏循环 几乎所有的游戏, 不管它们是否用 XNA 写成, 都使用某种形式的游戏循环 这是游戏开发和常规应用程序开发不同的一个方面 对一些开发者来说需要一点时间来适应 本质上来说, 一个游戏循环由一系列的方法组成, 这些方法被反复调用直到游戏结束 在 XNA 中, 游戏循环只包含两个方法 :Update 方法和 Draw 方法 目前您可以这样理解游戏循环 : 所有影响游戏的逻辑都将在 Update 方法或 Draw 方法中完成 您应该设法在 Draw 方法中做最少的事情 游戏运行需要的所有东西 ( 最终涉及到移动物体 碰撞检测 更新分数 游戏结束检测逻辑等等 ) 应该放到 Update 方法中 游戏开发与轮询 另一个游戏开发和典型应用程序开发之间的关键差异是轮询和事件注册的概念 许多非游戏的应用程序都采用用户事件驱动的方式来处理逻辑 举个例子, 如果您要为某些系统写一个窗体组件命名模块, 您可能会创建一个窗口然后要求用户输入想要的名字, 窗口有一个确定按钮和一个取消按钮 不管这个程序用哪种编程语言写成, 直到用户点击确定按钮或取消按钮之前都不会做任何事 当用户点击其中一个按钮时, 系统将产生一个程序能够捕获的事件 换句话说, 应用程序只有在用户给它发送一个某个按钮被按下的事件标识后, 才会被唤醒并做一些处理 相比之下, 游戏程序由事件轮询 (polling for events) 驱动, 而不是等待并监听是否有事件被激发 相反, 游戏程序会主动询问系统鼠标是否被移动, 同时程序会一直运行, 不管有没有用户输入 假设您开发的一个游戏中有一个名叫吉米 (Jimmy) 的男巫 ( 相信我, 许多游戏都会把魔法师命名为吉米 ) 试图从恶魔珈蓝鸟 (pelican) 军团的掌握中逃离 您必须要解析用户事件, 比如玩家移动吉米到左边或发动了一个破坏珈蓝鸟翼的咒语 但是并不是由 XNA 来告诉您玩家进行了这些动作, 而是由您自己来轮询输入设备 ( 鼠标 键盘 手柄等等 ) 来获得输入的改变 11 译注 :2D 表示二维平面的 ;3D 表示三维立体的 后文中某些地方会使用到的 二维 和 三维 名词来表示它们 17

34 同时, 不管用户是否与系统进行交互, 游戏中的一切仍在进行 举个例子, 可能珈蓝鸟军正在追逐吉米, 而不管用户有没有激发任何事件, 这个都会发生, 并且游戏负责不断移动敌人的位置而不需要注册任何事件 这是需要游戏循环的主要原因 : 它提供了一种途径让游戏始终运行着而不管玩家在做什么 当然, 除了让敌人在屏幕上移动, 还可以做更多的事情 要是珈蓝鸟军能够在空中抛出抗魔法的炸弹会怎么样呢? 此时可能会有一个 两个 五个 五十个甚至更多的炸弹飞过空中, 那么它们都需要持续地被移动才行 ; 此外, 还必须不断地检查这些炸弹是否击中任何物体, 然后依此做出适当的回应 要是玩家一直不移动吉米, 让珈蓝鸟军抓住了吉米呢? 在这种情形下, 肯定会有些事情发生才对 或许您需要设置一个计时器, 让吉米必须在 3 分钟之内逃脱 这样一来, 您又得去追踪某些类型的计时器, 并且在计时器归零或吉米逃脱的时候会执行一些逻辑 总之, 在游戏开发中, 一直会有事情发生 ( 而且通常是很多事情 ), 并且您要持续不断地更新动画 移动物体 进行碰撞检测 更新分数 核对游戏结束逻辑等等 假如是在窗体组件程序中, 要做到持续检测非用户事件这一点有些困难, 但在 XNA 开发中, 这一点用游戏循环的形式整合进了应用程序框架 所有这些任务都在游戏循环的 Update 方法中被处理, 接着场景会在游戏循环的 Draw 方法中被绘制 事实上, 所有的应用程序都有和游戏循环功能相似的循环 Windows 本身使用一个消息和事件系统, 不断循环告知应用程序何时需要重绘它们自己和完成其它功能 对这些循环的访问通常是隐藏起来的, 不过, 大多数应用程序不需要访问这些非用户驱动事件 好了, 让我们回到之前看到的代码中 您会注意到在 Update 方法中有一些代码行在玩家按下手柄上的 返回 按钮时让游戏退出 : if(gamepad.getstate(playerindex.one).buttons.back == ButtonState.Pressed) this.exit(); 这是在使用 Xbox360 手柄时结束 Xbox360 或 Windows 游戏的方法 ( 否则, 您可以在 Windows 中点击游戏窗口红色的 X 按钮或按 Alt + F4 组合键去结束它 ) 就像之前提到的,Update 方法是更新和游戏有关的一切东西的地方 您能更新物体在屏幕中的位置 分数 动画序列等 您也能检查用户输入, 进行碰撞检测, 并且调整 AI 12 算法 在 Update 方法中对游戏中变化的检测和依照这些变化进行的行动通常都与游戏状态有关 游戏状态是一个非常重要的概念 : 这是一种让游戏知道当前游戏状况的方法 游戏一般有多种完全不同的状态, 比如启动画面 实际游戏画面和游戏结束画面 在同一状态下还会有些细微的变化, 例如玩家得到某种法宝使角色无敌一段时间或其它一些游戏行为的改变 这通常需要先在 Update 方法中改变游戏状态, 然后在 Draw 方法中使用这些状态来绘制不同的图像 场景或其它和特定状态相关的信息 Draw 方法中使用之前提到的图形设备对象, 把游戏中所有的物体绘制到屏幕上 在目前 12 译注 :AI 英文全称 Artificial Intelligence, 意为人工智能 18

35 的程序中,Draw 方法做的唯一件事就是清除屏幕并设置背景色为浅蓝色 ( 待会我们会深入讨论 ) 图 3 1 展示了一个 XNA 游戏的生命周期, 包括 Update 方法和 Draw 方法形成的一个游戏循环 图 3-1 一个 XNA 游戏的生命周期请注意 Update 方法的执行有两个可能的结果 : 要么在游戏循环中持续执行, 然后 Draw 方法被调用 ; 要么游戏结束, 退出游戏循环, 并调用 UnloadContent 方法 当您调用 Game 类的 Exit 方法时, 和您按下 Xbox 360 手柄上的 返回 按钮一样, 游戏循环将结束 游戏循环也会在您按下 Alt + F4 组合键或点击红色的 X 按钮关闭游戏窗口时退出 在您的游戏退出循环和结束游戏之间应该存在一些过程 比如说, 如果恶魔珈蓝鸟捉住了男巫吉米, 然后游戏直接退出并且游戏窗口就这么消失, 将使玩家觉得很郁闷 实际上大多数玩家将会把这种行为看作某种 Bug 为避免出现这种情况, 您通常需要使用某种游戏状态逻辑, 使 Draw 方法渲染游戏结束画面以接替游戏进行画面 然后在过了固定的时间之后, 或者游戏玩家按下了某些特定的按键, 游戏才会真正地退出 这些工作现在好像有些复杂而不容易理解, 但是请不要过分担心 因为本书至始至终都会涉及到这些, 很快您就能明白怎么实现它了 一旦游戏退出循环,UnloadContent 就会被调用 这个方法用来卸载所有在 LoadContent 方法里加载且需使用特殊手段进行卸载的内容 就像.NET 一样,XNA 也会自动进行垃圾回收 但如果您在处理某些需要特别处理的对象时修改了内存,UnloadContent 方法就可以让您进行一些特殊处理 修饰您的游戏 好, 讲得够多了, 您一定迫不及待地想要开始进行开发, 并准备放一些很酷的东西到您的游戏中了 让我们开始吧 先看一看 Draw 方法, 现在方法中包含以下代码 : protected override void Draw(GameTime gametime) GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here base.draw(gametime); 这里需要注意的第一件事是 Draw 方法接受的参数 这个参数是 GameTime 类型的, 用来 19

36 表示游戏中经过的时间 为什么您需要一个追踪时间的的变量呢? 因为并不是所有的计算机都以相同的速度运行 这个变量可以帮助您根据真实游戏时间而不是处理器速度来确定动画和其它事件发生的时机 gametime 将在整本书中用来度量诸如帧率 动画 声音和其它效果 同时这个参数也将会被传入 Update 方法, 因为很多控制那些效果的方法需要在 Update 方法而不是 Draw 方法中执行 在这个方法的末尾, 调用了 Game1 对象的 Draw 方法 这是为了在 GameComponents 和其它对象中级联调用 Draw 方法所必不可少的 可能现在您还不能理解, 但是您确实需要在代码中调用 base.draw 方法, 请不要移除它 最后, 让我们看看用图形设备对象 GraphicsDevice 属性来调用 Clear 方法 再次说明, 这个属性代表 PC Xbox 360 或 Windows Phone 7 上真实的图形设备并且允许您在屏幕上绘制各种物体 Clear 方法擦除屏幕上所有的物体, 然后用指定的颜色填充背景 ( 在这里是浅蓝色 ) 把颜色改变成如 Color.Red 之类然后通过选择 Debug Start Debugging 来运行游戏, 您将看到和之前相同的窗口, 不过现在窗口的背景被填充成了红色 记得我曾说过看起来无趣的蓝色背景下其实隐藏着许多细节吗? 这就是指我刚才谈到的 当您只看到一个乏味的蓝色 ( 或现在的红色 ) 背景时,XNA 已经做了许多工作来呈现它 它将游戏循环每秒种运行 60 次, 擦除屏幕上所有的东西, 然后填充为红色 另外还每秒调用 Update 方法 60 次, 并检测 Xbox 360 手柄上的 返回 按钮是否被按下 这看起来可能并不多, 但是 XNA 确实在工作 XNA 最棒的一点就是游戏的框架已经搭好, 让您很容易进行定制和扩展 那么, 如果游戏循环每秒运行 60 次并且调用 Update 方法和 Draw 方法, 又为什么要每次都清楚这个画面呢? 尽管您可能觉得每一帧都清除屏幕然后重画整个场景和所有物体会降低游戏运行效率, 但是这远比试图追踪场景中所有的东西, 在新位置绘制出它们, 然后绘制出之前被它们挡住的物体这样要高效得多 如果您移除了 Clear 调用,XNA 在每帧绘制前将不会擦除屏幕, 并会产生一些不可预期的结果 帧和帧率 什么是帧? 正如前面提到的, 默认情况下 XNA 会在每次 Draw 调用的时候清除屏幕并且重绘场景 一次 Draw 调用所产生的场景就被称为一帧 您可以把 XNA 中的 2D 游戏想象成卡通连环画, 您在一页中绘制一个角色, 在下一页稍稍移动一点的位置绘制同样的角色, 以此类推, 当您快速翻动书页的时候, 您就有角色在动的错觉 XNA 事实上也做同样的事情 每隔 16 毫秒 [1]( 或 60 次 / 秒 ), 屏幕被清除然后新场景被绘制, 当新场景中角色在稍微不同的位置时, 那将会产生角色在动的假象 多帧就形成了游戏中的动画, 每秒绘制的帧数即被称为游戏帧率 ( 例如,60fps=60 帧 / 秒 ) [1] 译注 :1 毫秒 =1/1000 秒 20

37 在项目中增加一个精灵 好了, 我就不多说了, 这一次我是认真的 让我们开始 您的项目到目前为止是令人乏味的 现在, 让我们绘制一副图像到您游戏的屏幕上 XNA 中所有的图形 声音 特效和其它东西都要通过一个称为内容管道的东西加载 本质上内容管道将诸如.jpg 文件.bmp 文件.png 文件和其它格式的文件在编译过程中转换成一种 XNA 很容易使用的内部格式 对于其它类型的资源也是如此, 比如声音文件 3D 模型和字体等等, 后面的章节将会深入地探讨 XNA 框架很大的一点好处就是不同文件类型对于 XNA 都是透明的 如果您在游戏中添加了一个图像文件, 内容管道在编译过程中能够识别它, 您不需要为图像格式而担心 ( 稍后的章节会更深入讨论到内容管道 ) 下载本章的源码到您的硬盘上 这样您就可以得到本章剩下部分需要用到的图像文件, 并把它们加入到您的项目中 打开 Visual Studio 的解决方案资源管理器 (Solution Explorer), 看看您的解决方案 您会看到您的解决方案中有两个项目 : 一个项目名为 Collision, 另一个名为 CollisionContent 您在游戏中使用的全部资源 ( 图形, 声音, 模型等 ) 都应该添加到 CollisionContent 项目中 因为我喜欢一切都井井有条, 所以我建议在 CollissionContent 项目中为每种内容类型创建一个子文件夹, 添加每种资源到合适的文件夹中 要做到这一点, 请用鼠标右键点击 CollissionContent 项目, 选择 Add New Folder 将新建的文件夹命名为 Images 然后在 CollisionContent\Images 文件夹上点击鼠标右键, 选泽 Add Existing Item( 如图 3 2) 图 3-2 添加一张图片到您的解决方案中 在打开的文件查找对话框中, 在您下载的本章源码文件夹内定位 logo.png 文件 此文件位 21

38 于 BasicSprite\Collision\CollisionConten\Images 文件夹下 选择此图像文件, 然后点击 Add( 添加 ) 按钮关闭对话框, 您选择的文件就会出现在解决方案资源管理器的 CollisionContent\Images 文件夹下, 同时文件也拷贝到您的项目的 CollisionContent\Images 文件夹中 现在生成您的项目, 点击 Build( 生成 ) Build Solution( 生成解决方案 ), 将使内容管道尝试编译您刚才添加的图像文件 如果没有生成错误的话, 就说明内容管道可以识别文件格式并能将它转换成 XNA 的内部格式, 而且 XNA 已经做好加载和使这些用图像文件的准备了 内容管道使用资源名称 (asset name) 来访问内容资源 另一种确认您的图像文件可以被内容管道识别的方法是查看新添加项目的属性, 右键点击解决方案资源管理器中刚才添加的图像文件, 选择属性, 如图 3 3 图 3-3 图像文件的属性如图所示, 在图 3 3 中, 您添加的 logo.png 文件默认的资源名是 logo, 或者说就是不包括扩展名的图像文件名, 默认情况下, 所有的资源名都是以没有扩展名的文件名来表示的 如果您可以在属性窗口中看到 Asset Name 属性, 就说明内容管道可以识别您的图像文件 当然您也可以改变资源名, 项目中的资源名要求是唯一的, 不过只有在同一个文件夹下才做这样的要求 这是在 CollissionContent 项目中使用子文件夹来组织资源的另一个好处 您可以让多个资源拥有同样的资源名, 只要它们存在于 CollissionContent 项目下不同的文件夹中 这似乎是个只会把事情搞复杂的坏主意, 但这实际上很常见而且很有用 举例来说, 您有一个字体文件 一个特效文件和一个图形文件, 都用于爆炸效果中, 那么如果把它们都命名为 explosion 并分别放到它们各自所属类型的文件夹下, 会让事情变得更简单 您也许还注意到了图 3 3 中 Asset Name 属性下面的两个属性 :Content Importer 和 Conten Processor, 它们被设置成 Texture-XNA Framework, 表明内容管道验证过您添加到项目中的图像文件 : 并且它们准备被内容管道作为纹理对象来使用 在计算机图形学中纹理指应用到 3D 物体表面的 2D 图像, 在本书的 3D 部分我们这样会做 不过现在我们只是直接 22

39 将这些纹理绘制到 2D 游戏的屏幕上 加载并绘制精灵 现在您的解决方案中加载了一幅图像并且能够被内容管道所识别, 已经准备好将它绘制到 屏幕上 不过在您能够在代码中访问它之前, 您需要将资源从内容管道加载到变量中以便操作它们 用来存储图像的默认对象是 Texture2D 在 Game1.cs 代码文件中的 GraphicDevice Manager 和 SpriteBatch 的变量声明下面添加一个 Texture2D 变量 : Texture2D texture; 现在, 您需要将实际的图像文件加载到 Texture2D 变量中 可以使用 Game 类的 Content 属性来访问内容管道中的数据 Content 属性是 ContentManager 类型, 可以用来访问所有加载到内容管道中的对象 ContentManager 类有一个 Load 方法可以让您将内容加载到不同类型的 XNA 对象中 就像之前说的那样, 所有图像 声音和其它内容资源的加载都在 LoadContent 方法中完成 添加以下代码到 LoadContent 方法中 : texture = Content.Load<Texture2D>(@"Images/logo"); 传入 Content.Load 方法的参数是图像文件的路径, 以解决方案资源管理器中的 Content 节点开始 符号表示逐字解释字符串, 忽略字符串中的转义序列, 所以以下两行代码将产生相同的字符串 : string str1 string str2 = "images\\logo"; 同样请注意参数中使用的是资源名而不是文件名 ContentManager 类的 Load 方法是一个泛型方法, 需要一个类型参数来指定您想要访问哪种类型的变量 目前的情况下, 您正在处理一个图像文件并且期望返回一个 Texture2D 对象 现在图像文件已经加载到 texture 变量中并可以使用了 XNA 中所有的绘制工作都要在 Draw 方法中完成, 因此请添加以下三行代码到 Draw 方法中, 位于 Clear 方法的调用之后 : spritebatch.begin(); spritebatch.draw(texture, Vector2.Zero, Color.White); spritebatch.end(); 这三行代码将图像绘制到屏幕的左上角 选择 Debug Start Debugging, 您将会看到类似图 3 4 的画面 让我们看看这三行代码, 首先需要注意的是三行代码都用到了一个 SpriteBatch 类的对象 (spritebatch) 这个变量在您创建项目的时候被声明, 然后在 LoadContent 方法中被初始化 本质上, 这里发生的事情就是 XNA 用 SpriteBatch 对象的 Begin 和 End 方法通知图形设备将要发送一个精灵 ( 或 2D 图像 ) 在 XNA 游戏过程中图形设备会接收大量的数据, 而且数据会有不同的格式和类型 无论何时您向图形设备输送数据, 都需要先让它知道数据类型, 以 23

40 便它能够正确地进行处理 因此, 您不能只是随意地多次调用 SpriteBatch.Draw, 您首先需要通过调用 SpriteBatch.Begin 来通知显卡精灵数据正在发送 Draw 方法有三个参数, 如表格 3 1 所述 尝试改变一下 Draw 调用的参数 具体的说是位置地染色颜色参数 在 2D 中,XNA 使用 Vector2 结构体来定义坐标 Vector2.Zero 是将 Vector2 的 X,Y 坐标置零的简化方式 ( 和 new Vector2(0, 0) 是一样的作用 ) 图 3-4 XNA LOGO 图像出现在屏幕的左上角 表 3-1 Draw 方法参数 参数 类型 描述 Texture Texture2D 您想要绘制的图像的 Texture2D 对象. Position Vector2 您想要开始绘制图像的位置 (2D 坐标 ). 通常图像从左上角开始绘制. Color Color 染色颜色. 指定为 White 将不会为图像染色, 否则将图像染色为指定颜色. 在 2D XNA 游戏中,X,Y 屏幕坐标 (0, 0) 是屏幕的左上角,X 轴正方向向右,Y 轴正方向向下 如果您想要使图像在游戏窗口中居中, 您需要找到窗口的中心点并且适当的偏移左上角坐 标 您可以通过访问 Game 类的 Window.ClientBounds 属性来获得窗口的大小 当游戏运 行于窗口模式时,Window.ClientBounds.X 和 Window.ClientBounds.Y 相当于游戏窗 口的左上角坐标, 而 Window.ClientBounds 的 Width 和 Height 值总是等于窗口的宽度和 高度, 在窗口或全屏模式下都是如此 在 Xbox 360 和 Windows Phone 7 上 Window.ClientBounds.X 和 Window.ClientBounds.Y 总是为 0, 而 Window.Client 24

41 Bounds 的 Width 属性和 Height 属性总是等于画面的宽和高 ( 因为 Windows Phone 7 和 Xbox 360 游戏总是以全屏模式运行 ) 将 Window.ClientBounds 的 Width 和 Height 值除以 2 将得到屏幕中心点的坐标 要准确地将图像居中, 需要将屏幕中心点坐标偏移图像宽和高的一半 因为传入 Draw 方法的 位置参数并不代表绘制图像的中心, 而是左上角 您可以通过 Texture2D 类的对象 (texture) 的 Width 和 Height 属性来获得图像的尺寸 用以下的代码替换 SpriteBatch.Draw 方法 的调用, 从而使图像居中 : spritebatch.draw(texture, new Vector2( (Window.ClientBounds.Width / 2) - (texture.width / 2), (Window.ClientBounds.Height / 2) - (texture.height / 2) ), Color.White); 透明度及其它选项 当往屏幕上绘制多个精灵的时候, 您可以 ( 而且也应该, 出于速度的考虑 ) 在 SpriteBatch.Begin 和 SpriteBatch.End 之间绘制尽可能多的精灵 实际上您应该做的是在游戏中用一个 SpriteBatch 对象然后在 Begin 和 End 之间绘制所有的 2D 图像 就像您在图 3 4 中看到的那样, 我们使用的 XNA LOGO 有很难看的白色背景, 如果它变为透明的话或许看起来要好很多 有两种方法可以使图像部分透明 : 要么图像文件本身有透明的背景, 要么将图像中您希望显示为透明的部分设置为洋红色 (255, 0, 255) XNA 会自动将洋红色渲染成透明的 透明度可以存储到某些文件格式中 ( 如.png 文件 ) 用作 alpha 13 通道 这种格式不仅仅包含 RGB 值, 每个像素还有一个额外的 alpha 通道 (RGBA 中的 A) 来确定像素的透明度 如果您有一个图像处理工具, 您可以用它来为您的图像创建透明背景 Paint.Net 是一个用.NET 编写的很棒的免费图像处理工具, 您可以从 获得它 接下来的例子中我将使用另一个带透明背景的 XNA LOGO, 也包含在本部分的源码中, 文件名是 logo_trans.png 用同样的方法将透明 XNA LOGO 图像文件添加到项目中 : 右键点击解决方案资源管理器中的 CollisionContent\Images 节点, 选择 Add Existing Item, 然后定位到第 3 章的源码的 BasicSprite 文件夹,logo_trans.png 在 BasicSprite\CollisionCollision\Content\Images 文件夹下 不要移除项目中的另一个 XNA LOGO 文件, 因为您还要用它做绘制多个图像的试验 将透明的 logo 加入到项目中之后, 需要为新的 logo 添加另一个类成员变量 Texture2D: Texture2D texturetransprent; 注意新加入的图像文件的资源名, 并用它来把图像文件加载到 texturetransparent 变量中 记住加载图像到变量中需要通过 Content.Load 方法来使用内容管道 在 LoadContent 方法中加入以下代码 : 13 译注 :alpha 是指一张图片的透明和半透明度,PNG 图片能存储透明度信息 25

42 texturetransparent = Content.Load<Texture2D>(@"Images/logo_trans"); 然后复制之前的 SpriteBatch.Draw, 另起一行粘贴, 将其改为使用 texturetransparent 变量, 改变位置坐标为屏幕中心点, 这样两个图像就交错在一起了 改变背景色为 Color.Black 使得透明效果比较突出 ( 这需要修改 Draw 方法中 Clear 调用的颜色参数 ) 现在 Game1 类看起来应该像这样 : using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace Collision /// <summary> /// This is the main type for your game /// </summary> public class Game1 : Microsoft.Xna.Framework.Game GraphicsDeviceManager graphics; SpriteBatch spritebatch; Texture2D texture; Texture2D texturetransparent; public Game1() graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; /// <summary> /// Allows the game to perform any initialization it needs to before /// starting to run. This is where it can query for any required services and /// load any non-graphic-related content. Calling base.initialize will /// enumerate through any components and initialize them as well. /// </summary> protected override void Initialize() // TODO: Add your initialization logic here base.initialize(); /// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() // Create a new SpriteBatch, which can be used to draw textures. spritebatch = new SpriteBatch(GraphicsDevice); texture = Content.Load<Texture2D>(@"Images/logo"); texturetransparent = Content.Load<Texture2D>(@"Images/logo_trans"); 26

43 /// <summary> /// UnloadContent will be called once per game and is the place to unload /// all content. /// </summary> protected override void UnloadContent() // TODO: Unload any non-contentmanager content here /// <summary> /// Allows the game to run logic such as updating the world, /// checking for collisions, gathering input, and playing audio. /// </summary> /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Update(GameTime gametime) // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.exit(); // TODO: Add your update logic here base.update(gametime); /// <summary> /// This is called when the game should draw itself. /// </summary> /// <param name="gametime">provides a snapshot of timing values.</param> protected override void Draw(GameTime gametime) GraphicsDevice.Clear(Color.CornflowerBlue); spritebatch.begin(); spritebatch.draw(texture, new Vector2( (Window.ClientBounds.Width / 2) - (texture.width / 2), (Window.ClientBounds.Height / 2) - (texture.height / 2)), Color.White); spritebatch.draw(texturetransparent, new Vector2(( Window.ClientBounds.Width / 2), (Window.ClientBounds.Height / 2)), Color.White); spritebatch.end(); base.draw(gametime); 编译并运行游戏 (Debug Start Debugging), 您将会看到两个图像重叠在一起 一个有透明的背景, 一个有白色的背景, 如图 3-5 所示 在这里, 还有一些其它的绘制选项值得一提 首先, 用一个重载的 SpriteBatch.Draw 方法可以很容易实现图像的翻转和缩放 为了试验这些选项, 将第二个 SpriteBatch.Draw 调用修改成这样 : spritebatch.draw(texturetransparent, new Vector2( 27

44 (Window.ClientBounds.Width / 2), (Window.ClientBounds.Height / 2)), null, Color.White, 0, Vector2.Zero, 1.5f, SpriteEffects.FlipHorizontally, 0); 重载方法的参数列在表 3 2 中 现在您修改了 Sprite.Draw 方法的第二个参数, 将图像放大到原始尺寸的 150%(1.0f = 100%) 您还使用 SpriteEffects.FlipHorizontally 将图像水平翻转 编译并运行程序, 您将会看到第二个 XNA LOGO 水平翻转过来并且比另一个 XNA LOGO 稍微大一点 ( 图 3 6) 图 3-5 两个精灵, 一个有透明背景, 另一个没有 表 3-2 重载 Draw 方法的参数 参数 类型 描述 Texture Texture2D 要绘制的纹理. Position Vector2 绘制图像的左上角坐标. SourceRectangle Rectangle 允许您绘制原始图像的一部分, 这里使用 null. Color Color 染色颜色. Rotation float 旋转图像, 现在使用 0. 28

45 Origin Vector2 指定旋转的参照点. 现在使用 Vector2.Zero. Scale float 缩放比例, 使用 1 代表按照原始尺寸绘制,1.5f 表示放大图像到 150%. Effects SpriteEffects 使用 SpriteEffects 枚举来垂直或水平翻转图像. LayerDepth float 允许您指定图像的层叠次序 ( 哪张图像在其它图像之上 ). 现在使用 0. 图 3-6 第二个 XNA LOGO 被翻转并放大 层深度 您可能注意到第二个 XNA LOGO 覆盖在原来的 LOGO 之上 默认情况下,XNA 会在之前绘制的图像上面绘制新的图像, 但是您可以改变图像在屏幕上的层叠次序 图像层叠的次序和图像 Z 次序有关, 或者说层深度 虽然您现在可能并不在意哪个 XNA LOGO 在上面, 但有时您需要某些图像总是在其它图像的上面 举个例子, 在大多数游戏中, 您希望角色在所有的背景图像之上移动 有一种方法是确保您想要放在顶层的图像总是最后绘制 这个方法可行, 但是随着游戏中图片的增多, 组织 29

46 Draw 调用以达到您想要的结果将会是件非常痛苦的事情 谢天谢地,XNA 可以让您为每个图像指定一个层深度, 使图像总是能有正确的 Z 次序 要 修改层深度, 您需要将两个 SpriteBatch.Draw 都换成之前例子中的重载版本 请将您的第 一个 Draw 调用改成下面这样 : spritebatch.draw(texture, new Vector2( (Window.ClientBounds.Width / 2) - (texture.width / 2), (Window.ClientBounds.Height / 2) - (texture.height / 2)), null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0); 这段代码将会用与修改之前相同的方式绘制第一个精灵, 因为您没有给额外的参数传递除了默认值外的任何值 不过, 这个重载方法的最后一个参数能够接受一个值作为层深度 层深度参数由一个 0~1 的浮点 (float) 值表示 0 相当于 Z 次序的最前面,1 表示 Z 次序的最后面 如果您改变了层深度参数然后运行程序, 会发现运行结果没有任何改变 这是因为您需要告诉 XNA 希望按照图像的层深度来绘制图像, 为了让 XNA 使用图像的层深度, 您需要使用 SpriteBatch.Begin 方法的另一个重载版本 到目前为止您使用的都是无参数的 SpriteBatch.Begin 版本 为了使用层深度对您的图像进行排序, 要使用带一个 SpriteSortMode 类型的参数的 SpriteBatch.Begin 方法 这里最好的选择是使用一个带两个参数的重载方法, 如表 3 3 所示 : 表 3-3 SpriteBatch.Begin 重载方法参数列表参数描述 SpriteSortMode 定义渲染精灵的排序模式, 有五个模式 : Deferred: 精灵不会被绘制直到 SpriteBatch.End 被调用. 然后 End 以它们被调用的次序送到图形设备中. 在这个模式下, 操作多个 SpriteBatch 对象时可以让 Draw 调用不会产生冲突. 这是默认模式. Immediate:Begin 调用会立即设置图形设备,Draw 调用会立即进行绘制. 同一时间只能有一个 SpriteBatch 对象被使用. 这是最快的模式. Texture: 和 Deferred 模式一样, 但是精灵在绘制之前按照纹理进行排序. BackToFront: 和 Deferred 模式一样, 不过精灵按照层深度参数从前往后排序. FrontToBack: 和 Deferred 模式一样, 不过精灵按照层深度从后往前排序. BlendState 决定精灵颜色怎样和背景色混合, 有三个模式 : 30

47 None: 不进行颜色混合. AlphaBlend: 使用 alpha 值进行混合. 这是默认模式, 并开启透明效果, 像之前提到的, 如果您有带透明背景的图像, 就应该使用 AlphaBlend. Additive: 将精灵颜色和背景颜色进行混合. 将 SpriteBatch.Begin 方法修改为为包含这两个参数的版本 设置第一个参数为 SpriteSortMode.FrontToBack 这个模式将根据它们在 Draw 调用中被指定的层深度来绘制交错的精灵, 层深度值接近 0 的精灵将排在层深度值接近 1 的精灵之上 因为这是一个浮点值, 您拥有大量可供选择的层深度值 ( 任何有效的在 0.0 和 1.0 之间的浮点数 ) 接着, 因为其中的一张图片带有透明度信息, 故设置第二个参数为 BlendState.AlphaBlend 您需要做的最后一件事情就是将两个 Draw 调用中的最后一个参数修改成不同的值, 记住只能使用 0~1 范围之内的浮点数 因为您的排序模式是 FrontToBack, 拥有较小深度值的物体会先绘制 保持第一个 Draw 中的最后一个参数值为 0, 然后修改第二个 Draw 调用中的最后一个参数值为 1 现在 Draw 方法看起来应该像这样 : protected override void Draw(GameTime gametime) GraphicsDevice.Clear(Color.Black); // Begin drawing all sprites spritebatch.begin( SpriteSortMode.FrontToBack, BlendSate.AlphaBlend); spritebatch.draw(texture, new Vector2( (Window.ClientBounds.Width / 2) - (texture.width / 2), (Window.ClientBounds.Height / 2) - (texture.height / 2)), null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0); spritebatch.draw(texturetransparent, new Vector2( (Window.ClientBounds.Width / 2), (Window.ClientBounds.Height / 2)), null, Color.White, 0, Vector2.Zero, 1.5f, SpriteEffects.FlipHorizontally, 1); spritebatch.end( ); base.draw(gametime); 运行您的程序, 透明背景的图像仍然在不透明的图像之前 下一步, 将两个图像的层深度值交换, 现在透明图像就会在不透明图像之后了 然后试试不同的排序模式和混合模式, 感受一下它们在不同的情况下所起的作用 31

48 让我们动起来 在不同的排序模式和层深度下绘图的确比较有趣, 但是确实不那么激动人心 现在, 我们让两幅图像动起来并在碰到屏幕边缘时反弹回来 要移动图像, 您需要改变图像绘制的位置, 而现在两幅图像的位置都是始终不变的, 一幅在窗口的正中, 另一幅在窗口正中稍稍往右下偏移的位置 本章这部分代码在随书源码的第 3 章名为 MovingSprite 文件 要在屏幕上移动物体, 您需要在帧与帧之间修改物体的位置 因为, 您要做的第一件事就是用一个位置变量来代替先前代码中的常量 为 Game1 类顶部添加两个 Vector2 类型的成员变量 ( 称为 pos1 和 pos2), 并初始化为 Vector2.Zero: Vector2 pos1 = Vector2.Zero; Vector2 pos2 = Vector2.Zero; 您还需要为每个精灵添加一个速度变量 这个变量用来决定每个精灵在帧间的移动距离 添加两个 float 型的变量 ( 称为 speed1 和 speed2) 到您刚刚添加的位置变量下 : float speed1 = 2f; float speed2 = 3f; 现在分别用 pos1 和 pos2 取代两个 Draw 方法中的位置常量 将第二个 Draw 调用中的 SpriteEffects 参数设为 SpriteEffects.None, 然后将缩放系数 ( 倒数第三个参数 ) 从 1.5f 改为 1.0f 这将移除先前的图像翻转和放大效果 现在两个 Draw 调用看起来应该像这样 : spritebatch.draw(texture, pos1, null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0); spritebatch.draw(texturetransparent, pos2, null, Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 1); 编译并运行程序, 现在两个精灵都被绘制到窗口的左上角, 其中一个在另一个的上面, 您需要做的就是让精灵动起来 当 Game1 类中的 Draw 方法负责绘制的时候, 所有物体的更新操作 ( 包括位置 速度 碰撞检测 人工智能算法等等 ) 都应该在 Update 方法中进行 32

49 为了更新物体的位置, 您需要修改 pos1 和 pos2 的值 用以下代码替换掉 Update 方法中的 TODO 注释 : pos1.x += speed1; if (pos1.x > Window.ClientBounds.Width - texture.width pos1.x < 0) speed1 *= -1; pos2.y += speed2; if (pos2.y > Window.ClientBounds.Height texturetransparent.height pos2.y < 0) speed2 *= -1; 这里没有什么太复杂的东西 您用 pos1.x 加上速度值更新了 X 坐标 接下来的 if 语句判断更新后的精灵位置是否处于屏幕的左边缘或右边缘之外, 如果是, 那么将 speed1 乘以 1 相乘的结果是使精灵反向移动 对另一个精灵也做同样的处理, 只不过在垂直方向上而不是水平方向上 编译并运行程序, 您将看到两个精灵都开始移动, 一个水平移动, 一个垂直移动, 当它们触及屏幕边缘时会反弹回来 如图 3 7 所示 : 图 3-7 没有什么比活动 弹跳的 XNA LOGO 更让人兴奋的了 动画 尽管坐下来欣赏 XNA 标志图像的移动和弹跳是件令人沉迷的事, 但这并不是您阅读这本书的真正目的 让我们来做点更有趣的事情 : 制作精灵动画 33

50 本章节的此部分代码需要用到第三章的源代码, 这部分的代码名称 叫做 AnimatedSprites 就像本章之前所探讨的那样,2D XNA 游戏中的动画的制作过程很像卡通手翻书 动画制作包含着大量的独立图像, 通过在一个周期内图像间的快速切换来使它们显示为动画 通常精灵动画存放在图片文件中, 您需要用某种顺序把图片上独立的图像提取出来, 然后绘制在屏幕上 本书把这些图片文件称为 精灵位图 (Sprite Sheet) 精灵位图的示例可以在本章的源代码中找到, 位于 AnimatedSprites\AnimatedSprites\AnimatedSpritesContent\Images 文件夹下, 文件名为 threerings.png, 如图 3 8 所示 在之前的每个示例中, 您都是将一张图像文件加载到 Texture2D 对象中然后绘制整张图像 如果使用精灵位图的话, 您需要能够将整张图片加载到 Texture2D 对象中, 然后在动画循环中取出单独的精灵帧来绘制动画 之前例子中您使用的 SpriteBatch.Draw 重载版本有一个允许您指定源矩阵的参数, 使原图只有这部分被绘制 到目前为止您都将该参数指定 null, 这会使 XNA 绘制完整的 Texture2D 图像 让我们新建一个项目来实现动画效果 (File New Project ), 在新建项目窗口中, 选择左边窗口中的 Visual C# XNA Game Studio 4.0 节点后, 在右边项目模板窗口选择 Windows Game 4.0, 将项目命名为 AnimatedSprites 创建完项目后, 就在解决方案资源管理器的 AnimatedSpritesContent 项目下通过右键单击项目名称并选择 Add New Folder 来创建一个子文件夹, 命名为 Images 下一步, 您需要通过在解决方案资源管理器中右键单击新建的 Content\Images 文件夹并选择 Add Existing Item 向您的项目中导入上文中图 3 8 的图像 目标文件指向之前下载的本书中第三章源代码附带的 thre erings.png( 图像文件位于 AnimatedSprites\AnimatedSprites\AnimatedSpritesContent\Images 文件夹下 ) 就像您之前载入其它的图像那样, 将此图像载入 Texture2D 对象 首先, 在您的 Game1 类中增加一个类成员变量 : Texture2D texture; 然后在 Game1 类的 LoadContent 方法中添加以下代码 : texture = Content.Load<Texture2D>(@"images\threerings"); 现在您已经将精灵位图加载到 Texture2D 对象中, 可以开始考虑如何在精灵位图上轮流获得独立的精灵帧了 为了编写这样的一个算法, 您需要了解以下信息 : 精灵位图中每个单独图像 ( 或称为帧 ) 的宽和高 (framesize) 精灵位图的行与列的总数 (sheetsize) 指示接下来精灵位图中将要绘制的精灵帧在精灵位图中所处的行与列的位置的索引 (currentframe) 34

51 图 3-8 精灵位图示例 (threerings.png) 在本例的精灵位图中, 长与宽都为 75 像素, 有 8 行 6 列, 而且您将从第一帧开始绘制 往 Game1 类中添加一些类成员变量来表示这些数据 : Point framesize = new Point(75, 75); Point currentframe = new Point(0, 0); Point sheetsize = new Point(6, 8); 对于这几个变量,Point 结构体都可以工作得很好, 因为它们都需要一种能表示 2D 坐标 (X 和 Y 位置 ) 的数据类型 现在您可以添加 SpriteBatch.Draw 调用了 您将使用与之前几个例子中相似的版本, 唯一的不同点是 : 不再向源矩阵传递 null 值, 而是为第三个参数传递一个基于 currentframe 35

52 和 framesize 的源矩形 以下代码可以实现这一点, 将它们添加到 Game1 类的 Draw 方法中, 位于 base.draw 之前 : spritebatch.begin(spritesortmode.fronttoback, BlendState.AlphaBlend); spritebatch.draw(texture, Vector2.Zero, new Rectangle(currentFrame.X * framesize.x, currentframe.y * framesize.y, framesize.x, framesize.y), Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0); spritebatch.end(); 如果您对构造源矩形的逻辑有些不清楚, 不妨以这样的方式进行思考 : 用一个基于 0 的当前帧 意味着您初始化 currentframe 为 (0, 0) 而不是 (1, 1), 换句话说, 精灵位图左上角的精灵索引表示为 (0, 0) 而不是 (1, 1) 当前帧的左上角 X 坐标总是等于当前帧索引的 X 值 (currentframe.x) 乘以当前帧的宽度 同样地, 当前帧左上角的 Y 坐标总是等于当前帧索引的 Y 值 (currentframe.y) 乘以当前帧的高度 在这里源矩形的宽度和高度值总是相同的, 所以您可以使用 framesize.x 和 framesize.y 代表源矩形的宽和高 接下来, 修改 Game1 类的 Draw 方法中的 GraphicsDevice.Clear 中的颜色值为 Color.White, 使背景填充色为白色 然后编译并运行程序, 您应可以看到精灵位图中的第一个精灵帧被绘制到了游戏窗口的左上角 精灵现在还没有动画效果, 因为您一直重复地绘制着精灵位图中的第一帧 为了产生动画, 您需要更新 currentframe 索引来循环遍历精灵位图中的每一帧 那么应该把从当前帧索引移动到下一帧的代码放到哪呢? 记住, 在 Draw 方法中完成绘制, 在 Update 方法中完成更新 因此请将下面代码添加到 Update 方法中, 位于在 base.update 的调用之前 : ++currentframe.x; if (currentframe.x >= sheetsize.x) currentframe.x = 0; ++currentframe.y; if (currentframe.y >= sheetsize.y) currentframe.y = 0; 这段代码所做的就是使 currentframe 索引的 X 值增加 1, 然后检查这个值是否大于等于精灵位图的列数, 如果大于列数, 就将值置零, 并使索引的 Y 值增加 1, 开始绘制下一行的精灵 最后, 如果 Y 值超过了精灵位图的行数, 将它置零使整个动画序列回到起点 编译并运行程序, 您应该可以看到三个圆环的图像在窗口的左上角旋转着, 如图 3 9 现在是时候瞧瞧您在 XNA 中努力的成果了 尽管旋转的环并不是下一个 伟大的 游戏, 但是它看起来真的不赖, 对吧? 并且您应该开始感觉到 XNA 是多么地易用和强大了 就像您看到的那样, 循环绘制精灵位图中的精灵帧可以很轻松地实现任何一种可以用精灵位图格式表现的动画 36

53 图 3-9 三个旋转的环 没有比这更棒的了! 调整帧率 尽管三环动画看起来相当不错, 但可能有时您会觉得动画的速度太快或者太慢而想要去改变它 前面我提到过帧率的概念, 这里还是简单地提示一下 : 帧率表示一秒钟游戏重绘整个场景的次数 在 XNA 中,PC 和 Xbox 360 游戏的默认帧率为 60fps, 而在 Windows Phone 7 游戏的默认帧率为 30fps 除非您在一台非常慢的机器上运行这个程序, 否则您很有可能看到动画以 60fps 绘制 还有一种不同类型的帧率, 和单独的动画相关, 这种帧率 ( 通常称为动画速度 ) 反映了给定动画帧序列绘制一次的速度, 或者说一秒钟绘制的动画帧数 目前您的动画的速度是 60fps, 因为您每次重绘场景 (60fps 一次 ) 都会从精灵位图中提取并绘制一个新的精灵帧 这里有几种方法可以改变这个三环动画的速度 XNA 的 Game 类有一个叫做 TargetElapsedTime 的属性, 用来告诉 XNA 在每次 Game.Update 调用之后等待了多久 本质上, 这个属性表示每一帧之间的时间间隔 默认情况下这个值被设为 1/60 秒, 也就是帧率为 60fps 37

54 要改变程序的帧率, 添加以下代码到 Game1 类构造方法的末尾 : TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 50); 这将告诉 XNA 每 50 微妙调用一次 Game.Update, 相当于帧率 20fps 编译并运行游戏, 您会发现动画以低得多的速度运行 在 TimeSpan 构造方法中尝试不同的值 ( 例如 1 毫秒 ) 来看看动画循环的速度 理想情况下, 您会希望将帧率保持在 60fps 左右, 就是说可以不用管默认帧数 为什么要以 60fps 作为标准呢? 因为这是显示器或电视机不会让人眼察觉到闪烁的最低刷新率 如果您将帧率调得太高,XNA 不保证您能获得期望的性能 显卡 GPU 的速度 电脑处理器的速度 耗的资源数量和代码的效率都等, 对于游戏是否拥有最佳性能, 都有着决定性的影响 幸运的是,XNA 提供了一种方法来检测您的游戏是否存在性能问题 Update 和 Draw 方法都有的 GameTime 对象参数, 有一个叫做 IsRunningSlow 的布尔类型的属性 您可以在任何时候在这两个方法中检查 IsRunningSlow 的值 ; 如果值为 true,xna 将不能跟上您指定的帧率 在这种情况下,XNA 会进行跳帧以努力达到您期望的速率 这或许不是您愿意在任何游戏中看到的结果 所以如果出现这样的情况, 您可能应该提醒用户他的机器配置很难运行您的游戏 调整动画速度 38 尽管调整游戏本身的帧率可以影响动画的速度, 但是这样做并不是理想的方法 为什么呢? 当您改变了游戏的帧率, 将会影响到所有精灵的动画速度, 比如移动物体的速度之类 如果您希望一个动画的速度为 60fps 而另一个为 30fps, 您就不应该通过改变整个游戏的帧率来实现 移除之前修改 TargetElapsedTime 的代码, 让我们尝试一种新的途径 当调整一个精灵动画的速度的时候, 一般您应该只针对该精灵做这样的调整 这可以通过只在指定时间过后才移动到精灵位图的下一帧的方法达到目的 要实现这种效果, 需要添加两个用来追踪动画帧之间时间间隔的成员变量 : int timesincelastframe = 0; int millisecondsperframe = 50; timesincelastframe 变量用来追踪自上一帧之后经过了多少时间 millisecondspverycdframe 变量用来指定在移动当前的帧索引之前您想要等待多长时间 实际的精灵帧的循环是在您的 Update 函数中产生的 因此, 下一步是检查精灵帧之间的消耗时间, 并且仅在预设的消耗时间达到时, 才执行移动当前帧的索引 修改您加在 Update 函数中的代码, 加入如下所示的 if 嵌套语句 ( 粗体字是修改的部分 ): timesincelastframe += gametime.elapsedgametime.milliseconds; if (timesincelastframe > millisecondsperframe) timesincelastframe-= millisecondsperframe; ++currentframe.x; if (currentframe.x >= sheetsize.x) currentframe.x = 0;

55 ++currentframe.y; if (currentframe.y >= sheetsize.y) currentframe.y = 0; 就像您看到的那样, 这里使用 gametime.elapsedgametime 属性来检测自上一帧之后经过了多少时间 这个属性表示上一次调用 Update 方法后经过的时间 您用 timesincelastframe 变量加上这个时间增量, 当变量的值大于您想要在帧间等待的时间后, 进入到 if 语句中, 用 timesincelastframe 减去 millisecondsperframe 来调整 timesincelastframe 的值, 然后移动到下一个动画帧 现在编译并运行游戏, 您将会看到三环动画速度变慢 这里值得注意的是三环动画的运行帧率 (20fps) 不同于游戏的帧率 (60fps) 用这个方法您可以使任意数量的动画在不同的帧率运行而不用牺牲游戏整体的帧率 您刚刚做了些什么 现在是时候稍作停留了, 因为您现在已经知道如何随意地在 XNA 中实现 2D 动画了! 让我们花几分钟回顾一下您在本章学习到的东西 : 您研究了 XNA 游戏场景的背后发生的事情, 包括 XNA 程序流程和 XNA 游戏循环 您在屏幕上绘制了第一个精灵 您学习了一些内容管道的知识并了解了它的用途 您在屏幕上移动了一个精灵 您接触到了精灵的透明度, 垂直翻转和其它一些操作 您使用基于层深度的不同的 Z 次序来绘制精灵 您使用精灵位图绘制了精灵动画 您调整了游戏的帧率 您调整了单独的精灵动画速度 总结 当您创建了一个 XNA 项目的时候, 它内置了一个游戏循环和程序流程 游戏循环由 Update/Draw 调用组成 程序流程包含初始化 (Initialize), 加载内容资源 (LoadContent) 和执行特殊的卸载操作 (UnloadContent) 几个步骤 要在屏幕上绘制一个精灵, 您需要一个 Texture2D 对象来在内存中保存精灵 内容管道在编译期将精灵编译成内部格式以便于绘制 然后您使用一个 SpriteBatch 对象将精灵绘制到屏幕上 所有的绘制操作都应该在 SpriteBatch.Begin 和 SpriteBatch.End 调用对之间完成 这些调用通知图形设备精灵信息正在送到显卡中 Begin 方法有些重载的版本让您能够改变处理透明度的方式和精灵的排序方式 精灵动画通常通过一个精灵位图来实现 ( 一个包含各种用卡通手翻书方式绘制的精灵帧的位图 ) 循环遍历并绘制这些图像使得精灵以动画方式显示 39

56 XNA 游戏默认的帧率是 60fps 改变这个值将会影响没有使用单独的计时器来决定动画速度的精灵动画的帧率以及整个游戏的帧率 为了改变单独的精灵动画速度, 您可以设置一个计数器来追踪自上一帧后经过的时间, 并仅在经过了 X 毫秒的时间后才更新帧 知识测试 : 问答 1. XNA 的游戏循环有哪些步骤? 2. 如果想要加载一个 Texture2D 对象, 您需要在哪个方法中做这件事? 3. 要把 XNA 游戏的帧率改为 20fps, 您应该使用什么样的代码? 4. 在加载一个 Texture2D 对象时, 您应该向 Content.Load 传递什么参数? 5. 真还是假 : 如果您添加到项目中的文件不能被内容管道解析, 它将会在编译期告诉您 6. 您绘制一个精灵, 并且想让背景透明, 需要哪些步骤? 7. 您有两个精灵 (A 和 B), 当它们重合时您希望 A 总是在 B 之上绘制, 您应该怎么做? 8. 在循环遍历一个精灵位图的时候, 您需要追踪哪些变量? 知识测试 : 练习 在本章中, 您开发了一个两个 XNA LOGO 在屏幕上移动并在边缘之间反弹的例子 现在把本章末尾的动画动画例子改写成和它一样的移动和反弹方式 不过这一次要让动画精灵同时沿着 X 轴和 Y 轴移动, 并且在屏幕的四个边缘之间反弹 40

57 第 4 章 用户输入和碰撞检测 虽然看到一组由您亲自实现的漂亮的旋转圆环是很酷的事情, 但在完全掌握 XNA 之前您依然有很长的一段路要走 尽管动画看起来很漂亮, 但是它没有干任何事情, 并且它并不受您的控制 一个和玩家没有交互的游戏有什么乐趣可言呢? 在这一章里, 我们会研究用户输入和碰撞检测来使您的游戏除了看起来很漂亮外再干点有意义的事情 这一章将会用到第 3 章末尾编写的代码 ( 三环动画 ), 本请打开项目并根据本章的说明进行改写 更多精灵 如果您想要有一个受用户控制的物体并且加入和其它物体之间的碰撞检测, 您至少还需要一个物体 让我们在项目中加入另一个精灵动画 我们将为第二个精灵动画使用一个不同的图像, 而非与之前相同的三环图像 在本章的源代码中的 Chapter2\AnimatedSprites\AnimatedSprites\Content\Images 文件夹下您可以找到一个名为 skullball.png( 印有骷髅图像的球 ) 的图片文件 像之前那样, 将图片添加到项目中 ( 鼠标右键点击解决方案资源管理器中的 Content\Image 文件夹, 选择 Add Existing Item, 然后找到 skullball.png 并把它导入到解决方案中 ) 接下来, 您需要创建大量的变量来为您的骷髅球精灵绘图和制作动画 这些变量您看起来应该似曾相识了, 因为它们和第 3 章中用来绘制三环动画的变量很相似 在 Game1 类的顶部添加这些成员变量 : Texture2D skulltexture; Point skullframesize = new Point(75, 75); Point skullcurrentframe = new Point(0, 0); Point skullsheetsize = new Point(6, 8); int skulltimesincelastframe = 0; const int skullmillisecondsperframe = 50; 骷髅球图像帧的尺寸是 像素, 在精灵位图中有 8 行 6 列 现在您应该改变绘制三环动画用到的变量名以免产生混淆, 为每个变量添加 rings 前缀, 并修改所有的变量引用 这会帮助您使事情变得有条理 圆环动画相关的变量声明现在应该是这样 : Texture2D ringstexture; Point ringsframesize = new Point(75, 75); Point ringscurrentframe = new Point(0, 0); Point ringssheetsize = new Point(6, 8); int ringstimesincelastframe = 0; int ringsmillisecondsperframe = 50; 编译项目以确保重命名变量没有引入任何编译错误 如果有错误, 记住变量名应该同之前的项目保持一致 ; 只不过您在每个变量名的前面增加了 rings 前缀 修正所有错误直到编 41

58 42 译正确 第 5 章将带您了解一些基本的面向对象设计原则来使精灵的添加变得更容易 不过目前您 只是想实现用户输入处理和碰撞检测, 所以让我们继续吧 与之前一样, 在 LoadContent 方法中将骷髅球图像加载到 skulltexture 变量中 : skulltexture = Content.Load<Texture2D>(@"images\skullball"); 接下来添加在精灵帧序列中移动索引的代码 记住这是在 Update 方法中完成的 因为之 前已经在三环动画里做过这些, 您可以直接将那段代码复制过来, 然后将变量名修改一下就可以了 : skulltimesincelastframe += gametime.elapsedgametime.milliseconds; if (skulltimesincelastframe > skullmillisecondsperframe) skulltimesincelastframe -= skullmillisecondsperframe; ++skullcurrentframe.x; if (skullcurrentframe.x >= skullsheetsize.x) skullcurrentframe.x = 0; ++skullcurrentframe.y; if (skullcurrentframe.y >= skullsheetsize.y) skullcurrentframe.y = 0; 最后, 您要将精灵绘制到屏幕上, 记住所有的绘制都在 Draw 方法中完成 同样地, 您已经有了绘制三环动画的代码, 将它复制过来, 修改一下变量名 为了不让这两种精灵重叠在一起, 修改骷髅球图像的 Draw 调用的第 2 个参数将图像绘制到 (100, 100) 而不是 (0, 0), 修改后的 Draw 方法看起来应该是这样 : spritebatch.draw(skulltexture, new Vector2(100, 100), new Rectangle(skullCurrentFrame.X * skullframesize.x, skullcurrentframe.y * skullframesize.y, skullframesize.x, skullframesize.y), Color.White, 0, Vector2.Zero, 1, SpriteEffects.None, 0); 现在编译运行程序, 您会看到两幅图像都有动画了 如图 4 1 还不赖! 在很短的时间里您就在游戏中加入了一个全新的动画精灵 软件开发时常带来令人兴奋和有成就感的时刻, 不过在游戏开发中因为视觉感官 ( 稍后还有听觉 ) 的引入, 使这种感觉放大了许多 这两个动画看起来相当酷, 不过有趣的事情才刚刚开始 现在您将要学习怎样控制屏幕上的物体并给您的程序提供一些用户交互 XNA 中的用户输入可以由多种设备组合而成 : 键盘 鼠标 Xbox 360 手柄 Xbox 360 周边设备和 Windows Phone 7 触摸屏和加速器 其中鼠标输入在 Xbox 360 和 Windows Phone 7 上不可用 在这一章里, 您将为游戏添加对键盘, 鼠标和 Xbox 360 手柄的支持 在之前的章节中, 我们讨论了轮询和事件注册 两者之间的不同在处理输入设备的时候最明显 传统的 Windows 程序员习惯于对事件进行注册, 比如某个键被按下或着鼠标移动 在这个编程模型中, 应用程序执行一些功能, 然后当它空闲时, 消息泵将消息送入应用程序并且事件被处理

59 图 4-1 两个干着自己的事的动画精灵在游戏开发中, 没有所谓的空闲时间, 所以允许开发者进行事件注册的开销过大 取而代之是由开发者对输入设备进行轮询以得知玩家是否对这些设备进行了操作 这是从一个稍微不同的角度看待输入和其它消息与事件的方式, 不过一旦您掌握了这种思维方式, 游戏的开发将会简单明了许多 键盘输入 键盘输入是通过 Microsoft.XNA.Framework.Input 命名空间中的 Keyboard 类来处理的 Keyboard 类有一个叫做 GetState 的静态方法, 用 KeyboardState 结构的形式返回键盘目前的状态 KeyboardState 结构中包含三个能够满足您大部分的功能需求的关键方法, 如表 4 1 所示 举个使用 Keyboard 类的例子, 如果您想要检查 A 键是否被按下, 需要使用如下代码 : 方法 表 4-1 KeyboardState 结构中的关键方法 描述 43

60 Keys[] GetPressedKeys() bool IsKeyDown(Keys key) bool IsKeyUp(Keys key) 返回一个在方法被调用时被按下的键的数组返回 true 或 false, 取决于方法调用时参数所代表的按键是否被按下返回 true 或 false, 取决于方法调用时参数所代表的按键是否被释放 if(keyboard.getstate( ).IsKeyDown(Keys.A)) // BAM!!! A is pressed! 在这个游戏中, 您要修改代码来使用户能够控制三环精灵, 使用方向键使精灵上下左右移动 目前三环精灵被硬编码绘制到 (0, 0), 想要在屏幕上移动它, 您要能够改变它绘制的位置 您需要一个 Vector2 变量来表示精灵当前的位置, 还需要一个表示精灵移动速度的变量 因为在游戏过程中精灵移动的速度不会变, 所以您可以将这个变量声明为常变量 在 Game1 类的顶部添加这些类成员变量 : Vector2 ringsposition = Vector2.Zero; const float ringsspeed = 6; 另外, 确定您修改了用来绘制三环精灵的 SpriteBatch.Draw 函数的第二个参数, 以使用您的新变量 ringposition 而不是 Vector2.Zero 标示的硬编码位置 Draw 函数的第二个参数代表了绘制精灵的位置 现在, 您需要添加代码来检查上 下 左或右键是否被按下, 如果任何一个被按下, 就通过改变 ringsposition 变量的值来移动精灵 您应该把检测输入的代码放在什么地方呢? 记住, 决定在什么地方放置逻辑到游戏循环中时, 只有两个地方可以选择 :Draw 方法, 用来绘制所有的物体 ; 以及 Update 方法, 用来做绘制之外的其它事情 ( 计算维护分数 移动物体 进行碰撞检测等等 ) 所以, 只管将以下代码添加到 Update 方法中, 位于 base.update 方法的调用之前 : KeyboardState keyboardstate = Keyboard.GetState( ); if (keyboardstate.iskeydown(keys.left)) ringsposition.x -= ringsspeed; if (keyboardstate.iskeydown(keys.right)) ringsposition.x += ringsspeed; if (keyboardstate.iskeydown(keys.up)) ringsposition.y -= ringsspeed; if (keyboardstate.iskeydown(keys.down)) ringsposition.y += ringsspeed; 这段代码怎么样呢 难道一个 if/else 语句不比 4 个 if 语句更有效率吗? 对, 的确是更有效率 但是一个 if/else 语句让您在同一时间只能向一个方向移动, 而用 4 个单独的 if 语句让您可以沿着对角方向移动 ( 例如, 同时按住上和左两个键 ) 还要注意您只在 Update 方法中调用了一次 Keyboard 的 GetState 方法, 然后在 if 语句中重复使用这次调用的结果, 而不是在每个 if 语句中调用 GetState 这是因为 GetState 方法调用的开销相当大, 用这种方式您可以减少调用这个方法的次数 编译并运行程序 您应该可以在屏幕上移动三环精灵了, 如图

Microsoft PowerPoint - Chap03.ppt [相容模式]

Microsoft PowerPoint - Chap03.ppt [相容模式] 本章目的 2D / 3D 遊戲程式設計入門使用 XNA 3.0 與 C# 探討 XNA 遊戲程式內部的基本架構與遊戲開發流程 示範如何完成一個簡單的 XNA 遊戲方案 第三章 XNA 遊戲程式基本架構 1 2 新增 XNA 專案 新增 XNA 專案 3 4 XNA 相關的命名空間 Game1.cs 程式中的六個函數 using Microsoft.Xna.Framework; // 和 XNA 架構相關的型別

More information

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1

Photoshop CS6 艺术设计案例教程 ( 第二版 ) 1.1 Photoshop 的应用领域 Photoshop,,, Photoshop Photoshop 的用途 Photoshop CIS ( ) ( ) 案例展现 ~ 1 Chapter 01 Photoshop CS6 的基本操作 本章内容 1.1 Photoshop 的应用领域 1.6 控制面板的显示与隐藏 1.2 位图和矢量图的特性 1.7 新建 打开与保存文件 1.3 像素和分辨率的关系 1.8 图像的缩放 1.4 色彩模式 1.9 屏幕显示模式 1.5 Photoshop CS6 界面 1.10 计算机图形图像常用的色彩模式 Photoshop CS6 艺术设计案例教程

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464>

<C8EBC3C5C6AAA3A8B5DA31D5C2A3A92E696E6464> 第 1 章 进入 Photoshop 的全新世界 本章导读 Photoshop 1 1.1 Photoshop CS6 Photoshop Photoshop 1.1.1 Photoshop POP 1-1 图 1-1 平面广告效果 1.1.2 Photoshop 1-2 Photoshop CS6 Photoshop CS6 Photoshop CS6 Extended 3D 3 Photoshop

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

* r p . 4 6 12 3 5 7 8 9bk bm btbsbrbqbp bo bn bl [ ] [ ] [ ] [ ] [SET] 1 2 3 4 5 6 7. cmcl ck 8 9 0 bk bl bm bn bo 1 2 1 2+ - bp bq 8 2 4 6 br r bs p bt ck cl cm 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

第四章 102 图 4唱16 基于图像渲染的理论基础 三张拍摄图像以及它们投影到球面上生成的球面图像 拼图的圆心是相同的 而拼图是由球面图像上的弧线图像组成的 因此我 们称之为同心球拼图 如图 4唱18 所示 这些拼图中半径最大的是圆 Ck 最小的是圆 C0 设圆 Ck 的半径为 r 虚拟相机水平视域为 θ 有 r R sin θ 2 4畅11 由此可见 构造同心球拼图的过程实际上就是对投影图像中的弧线图像

More information

遊戲內容介紹 : 全部都由四個方塊組成 開始時, 一個隨機的方塊會從區域上方開始緩慢繼續落下 落下期間, 玩家可以以 90 度為單位旋轉方塊, 以格子為單位左右移動方塊, 或讓方塊加速落下 當方塊下落到區域最下方或著落到其他方塊上無法再向下移動時, 就會固定在該處, 然後新的方塊出現在區域上方開始落

遊戲內容介紹 : 全部都由四個方塊組成 開始時, 一個隨機的方塊會從區域上方開始緩慢繼續落下 落下期間, 玩家可以以 90 度為單位旋轉方塊, 以格子為單位左右移動方塊, 或讓方塊加速落下 當方塊下落到區域最下方或著落到其他方塊上無法再向下移動時, 就會固定在該處, 然後新的方塊出現在區域上方開始落 Windows Phone 期末作業 遊戲名稱 : 俄羅斯方塊 班級 : 資工二乙 姓名 : 林益正 學號 :4A1G0003 第 1 頁 遊戲內容介紹 : 全部都由四個方塊組成 開始時, 一個隨機的方塊會從區域上方開始緩慢繼續落下 落下期間, 玩家可以以 90 度為單位旋轉方塊, 以格子為單位左右移動方塊, 或讓方塊加速落下 當方塊下落到區域最下方或著落到其他方塊上無法再向下移動時, 就會固定在該處,

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

IDEO_HCD_0716

IDEO_HCD_0716 IDEO HCD Toolkit Tencent CDC ...? Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC Tencent CDC

More information

Isis Unveiled Pdf Free Download chayanne downgrade london stage militar mapsource

Isis Unveiled Pdf Free Download chayanne downgrade london stage militar mapsource Isis Unveiled Pdf Free Download ->>> DOWNLOAD 1 / 5 2 / 5 全部播放听 Isis,,,,Unveiled 的人也听,,,,Urbana's,,,,Too,,,,Dark,,,,--,,,,Braid,,,, 在线试听,,,,...,,,,,,,,,,,,,,,,,,,,.op_sp_fanyi{font-size:1em;word-break:normal;},,,,,,,,,,,,,,,,.op_sp_fanyi,,,,.op_sp_fanyi_rea

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

-i-

-i- -i- -ii- -iii- -iv- -v- -vi- -vii- -viii- -ix- -x- -xi- -xii- 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9 1-10 1-11 1-12 1-13 1-14 1-15 1-16 1-17 1-18 1-19 1-20 1-21 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11

More information

Microsoft Word - 强迫性活动一览表.docx

Microsoft Word - 强迫性活动一览表.docx 1 1 - / 2 - / 3 - / 4 - / 5 - I. 1. / 2. / 3. 4. 5. 6. 7. 8. 9 10 11. 12. 2 13. 14. 15. 16. 17. 18. 19. 20 21. 22 23. 24. / / 25. 26. 27. 28. 29. 30. 31. II. 1. 2 3. 4 3 5. 6 7 8. 9 10 11 12 13 14. 15.

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

Microsoft PowerPoint - Chap04.ppt [相容模式]

Microsoft PowerPoint - Chap04.ppt [相容模式] 本章目的 2D / 3D 遊戲程式設計入門使用 XNA 3.0 與 C# 2D 圖形與字型的呈現 介紹 XNA 支援的 2D 圖形格式 介紹 2D 圖形的應用範圍 以多個範例來示範在 XNA 架構下 2D 圖形和字型的呈現方式 介紹 2D 圖形碰撞測試的演算法 1 2 2D 圖形的應用範圍 紋理圖展開的 UV 貼圖 紋理圖 (Texture) 精靈圖 (Sprite) 小張的背景拼圖 大張的背景圖

More information

眼病防治

眼病防治 ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...2...3...5...5...6...7...9... 11...13...14...15...17...18...19...20...21 I II...21...22...23...24...25...27...27...28...29...30...31...33...33...34...36...38...39...40...41...42...43...45

More information

中国南北特色风味名菜 _八)

中国南北特色风味名菜 _八) ( 20 010010) 7871092 1/32 356.25 4 760 2004 8 1 2004 8 1 11 000 ISBN 7-204-05943-3/Z102 1026.00 ( 18.00 ) ...1...2...2...4...6...7...8...9... 10... 11... 12... 13... 13... 14... 15... 17... 18... 19...

More information

「香港中學文言文課程的設計與教學」單元設計範本

「香港中學文言文課程的設計與教學」單元設計範本 1. 2. 3. (1) (6) ( 21-52 ) (7) (12) (13) (16) (17) (20) (21) (24) (25) (31) (32) (58) 1 2 2007-2018 7 () 3 (1070) (1019-1086) 4 () () () () 5 () () 6 21 1. 2. 3. 1. 2. 3. 4. 5. 6. 7. 8. 9. ( ) 7 1. 2.

More information

全唐诗28

全唐诗28 ... 1... 1... 1... 2... 2... 2... 3... 3... 4... 4... 4... 5... 5... 5... 5... 6... 6... 6... 6... 7... 7... 7... 7... 8... 8 I II... 8... 9... 9... 9...10...10...10...11...11...11...11...12...12...12...13...13...13...14...14...14...15...15...15...16...16...16...17...17

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

Microsoft Word - Entry-Level Occupational Competencies for TCM in Canada200910_ch _2_.doc

Microsoft Word - Entry-Level Occupational Competencies for TCM in Canada200910_ch _2_.doc 草 稿 致 省 級 管 理 單 位 之 推 薦 書 二 零 零 九 年 十 月 十 七 日 加 拿 大 中 醫 管 理 局 聯 盟 All rights reserved 序 言 加 拿 大 中 醫 管 理 局 聯 盟, 於 二 零 零 八 年 一 月 至 二 零 零 九 年 十 月 間, 擬 定 傳 統 中 醫 執 業 之 基 礎 文 件 由 臨 床 經 驗 豐 富 之 中 醫 師 教 育 者 及

More information

教学输入与学习者的语言输出 温晓虹 本文从三个方面探讨了语言的输入与输出的关系 首先从理论研究的角度讨 论了从语言输入到语言输出的习得过程 实验研究表明 输入的语言素材必须被学习者所接收 即使接收了的内容也并不会自动进入中介语的体系 而是需要进一步对输入语言进行 分解 归类等分析性与综合性的处理 在语言 内化 的基础上 学习者的中介语系统才能 够不断地得到重新组合 趋于目的语 另外 学习者在语言输出前和输出时需要调节

More information

图形图像处理 (Photoshop CS6) [ pixel ] % % % % dpi/inch dpi 150dpi 300dpi 002

图形图像处理 (Photoshop CS6) [ pixel ] % % % % dpi/inch dpi 150dpi 300dpi 002 第 1 章 初识 Photoshop CS6 本章学习要点 点阵图像的基本概念 常用图像格式的特性 Photoshop CS6 界面基本操作 图像的分辨率和像素 Photoshop 的应用领域 Photoshop 文件的管理 重点和难点 图像的像素和分辨率 Photoshop CS6 界面的基本操作 达成目标 理解像素和分辨率的关系 了解图像的常用格式及特点 掌握 Photoshop CS6 界面基本操作及对图像进行不同格式的保存管理

More information

II II

II II I I II II III 1. 2. 3. III 4. IV 5. 6. 8. 9. 10. 12. IV V V VI VI VII VII VIII VIII IX IX X X XI XI XII XII 1 1 2 2 3 3 4 33 35 4 5 5 6 6 7 ( ) 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17

More information

吉林大学学报 工学版 244 第 4 卷 复杂 鉴于本文篇幅所限 具体公式可详见参考文 献 7 每帧的动力学方程建立及其解算方法如图 3 所示 图4 滚转角速度与输入量 η 随时间的变化波形 Fig 4 Waveform of roll rate and input η with time changing 图5 Fig 5 滚转角随时间的变化波形 Waveform of roll angle with

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作

论文,,, ( &, ), 1 ( -, : - ), ; (, ), ; ;, ( &, ),,,,,, (, ),,,, (, ) (, ),,, :. : ( ), ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ), ( ),,,, 1 原译作 修补者, 但在英译版本中, 被译作 * 夏传玲 : 本文简要回顾了国内外定性研究在最近 多年的发展概况, 总结 了定性研究的六个发展趋势和分析策略上的三种流派 在上述两种背景下, 本文探讨了计算机辅助的定性分析给定性研究带来的机遇和挑战, 特别是它和手工操作对比时的优势和劣势, 以及应用这种定性分析技术所可能面临的困难 : 定性研究定性分析 文化差异,, (, ),,,, ( - ) ( - ) ( - ) ( - ) ( - ) (

More information

1 Flash 绘画概述 美术与绘画 电脑绘画 1-1 Flash Painter (a) (Flash) (b) (Painter) 1-1

1 Flash 绘画概述 美术与绘画 电脑绘画 1-1 Flash Painter (a) (Flash) (b) (Painter) 1-1 第 一 部分 绘画基础 俗话说 万丈高楼平地起 学习Flash绘画也一样 必须从美术基础学起掌握透 视 构图和色彩等基础知识 以及物体立体感的表现方法 是掌握Flash绘画的必备知识 也是进行动画设计的基础 1 Flash 1 1.1 绘画概述 1.1.1 美术与绘画 3 1.1.2 电脑绘画 1-1 Flash Painter (a) (Flash) (b) (Painter) 1-1 Flash

More information

untitled

untitled Ogre Rendering System http://antsam.blogone.net AntsamCGD@hotmail.com geometry systemmaterial systemshader systemrendering system API API DirectX OpenGL API Pipeline Abstraction API Pipeline Pipeline configurationpipeline

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

一、

一、 ... 1...24...58 - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - i. ii. iii. iv. i. ii. iii. iv. v. vi. vii. viii. ix. x. - 9 - xi. - 10 - - 11 - -12- -13- -14- -15- C. @ -16- @ -17- -18- -19- -20- -21- -22-

More information

>>ZIP>> Usmle Step 1 Question Books. place MotoGP Mogoda Lugar every arranque

>>ZIP>> Usmle Step 1 Question Books. place MotoGP Mogoda Lugar every arranque Usmle Step 1 Question Books ->->->-> DOWNLOAD 1 / 5 2 / 5 Buy...it,...read...it,...then...read......Step-Up...to...USMLE...Step...1...is...the...most...effective,...comp rehensive,...systems-...a...companion...website...features...a...sample...question...banknaheedy;...d

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information

心理障碍防治(下).doc

心理障碍防治(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...2...3...4...5...6...7...8...9...10... 11...12...13...15...16...17...19...21 I ...23...24...26...27...28...30...32...34...37...39...40...42...42...44...47...50...52...56...58...60...64...68

More information

509 (ii) (iii) (iv) (v) 200, , , , C 57

509 (ii) (iii) (iv) (v) 200, , , , C 57 59 (ii) (iii) (iv) (v) 500,000 500,000 59I 18 (ii) (iii) (iv) 200,000 56 509 (ii) (iii) (iv) (v) 200,000 200,000 200,000 500,000 57 43C 57 (ii) 60 90 14 5 50,000 43F 43C (ii) 282 24 40(1B) 24 40(1) 58

More information

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc 人 力 資 源 推 算 報 告 香 港 特 別 行 政 區 政 府 二 零 一 二 年 四 月 此 頁 刻 意 留 空 - 2 - 目 錄 頁 前 言 詞 彙 縮 寫 及 注 意 事 項 摘 要 第 一 章 : 第 二 章 : 第 三 章 : 第 四 章 : 附 件 一 : 附 件 二 : 附 件 三 : 附 件 四 : 附 件 五 : 附 件 六 : 附 件 七 : 引 言 及 技 術 大 綱 人

More information

南華大學數位論文

南華大學數位論文 1 i -------------------------------------------------- ii iii iv v vi vii 36~39 108 viii 15 108 ix 1 2 3 30 1 ~43 2 3 ~16 1 2 4 4 5 3 6 8 6 4 4 7 15 8 ----- 5 94 4 5 6 43 10 78 9 7 10 11 12 10 11 12 9137

More information

李天命的思考藝術

李天命的思考藝術 ii iii iv v vi vii viii ix x 3 1 2 3 4 4 5 6 7 8 9 5 10 1 2 11 6 12 13 7 8 14 15 16 17 18 9 19 20 21 22 10 23 24 23 11 25 26 7 27 28 12 13 29 30 31 28 32 14 33 34 35 36 5 15 3 1 2 3 4 5 6 7 8 9 10 11

More information

皮肤病防治.doc

皮肤病防治.doc ...1...1...2...3...4...5...6...7...7...9...10... 11...12...14...15...16...18...19...21 I ...22...22...24...25...26...27...27...29...30...31...32...33...34...34...36...36...37...38...40...41...41...42 II

More information

性病防治

性病防治 ...1...2...3...4...5...5...6...7...7...7...8...8...9...9...10...10... 11... 11 I ...12...12...12...13...14...14...15...17...20...20...21...22...23...23...25...27...33...34...34...35...35 II ...36...38...39...40...41...44...49...49...53...56...57...57...58...58...59...60...60...63...63...65...66

More information

中国南北特色风味名菜 _一)

中国南北特色风味名菜 _一) ...1...1...2...3...3...4...5...6...7...7...8...9... 10... 11... 13... 13... 14... 16... 17 I ... 18... 19... 20... 21... 22... 23... 24... 25... 27... 28... 29... 30... 32... 33... 34... 35... 36... 37...

More information

全唐诗24

全唐诗24 ... 1... 1... 2... 2... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 9... 9...10...10...10...11...12...12...12...13...13 I II...14...14...14...15...15...15...16...16...16...17...17...18...18...18...19...19...19...20...20...20...21...21...22...22...23...23...23...24

More information

江苏宁沪高速公路股份有限公司.PDF

江苏宁沪高速公路股份有限公司.PDF - 1 - - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - 33.33% ( ) ( ) ( ) 33.33% ( ) ( ) ( ) 1 1 1992 8 3200001100976 1997 6 27 H 12.22 2001 1 16 A 1.5 2001 12 3 503,774.75 14,914,399,845.00 13,445,370,274.00

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

1 2 6 8 15 36 48 55 58 65 67 74 76 150 152 1 3 1 2 4 2 2001 2000 1999 12 31 12 31 12 31 304,347 322,932 231,047 14,018 16,154 5,665 (i) 0.162 0.193 0.082 (ii) 0.165 0.227 0.082 (iii) 10.08 13.37 6.47 0.688

More information

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品

Autodesk Product Design Suite Standard 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品 Autodesk Product Design Suite Standard 20122 系统统需求 典型用户户和工作流 Autodesk Product Design Suite Standard 版本为为负责创建非凡凡产品的设计师师和工程师提供供基本方案设计和和制图工具, 以获得令人惊叹叹的产品设计 Autodesk Product Design Suite Standard 版本包包括以下软件产产品

More information

gta 5 serial key number pciker

gta 5 serial key number pciker Gta 5 Serial Key Number Pciker >>> http://shurll.com/7nott 1 / 5 2 / 5 Keep..rea... 2016 年 1 月 3 日 - download..gta..5..serial..number..of..the..most..exclusive..pageviews..selforganizing..ngos,..live..stories..and..easy..policies..regarding..to..containing..my...

More information

台北市立大安高工職業學校

台北市立大安高工職業學校 臺 北 市 立 大 安 高 工 職 業 學 校 資 訊 科 專 題 報 告 XNA 格 鬥 遊 戲 ( 塗 鴉 格 鬥 Fight) Doodle 學 生 組 長 : 鄧 皓 文 組 員 : 陳 卲 剛 組 員 : 徐 仲 廷 組 員 : 黃 詩 涵 指 導 老 師 : 陳 龍 昇 中 華 民 國 101 年 1 月 簡 介 與 動 機 與 組 員 看 到 目 前 的 小 遊 戲, 對 我 來 說,

More information

xforce keygen microsoft office 2013

xforce keygen microsoft office 2013 Xforce Keygen Microsoft Office 2013 ->->->-> http://shurll.com/78610 1 / 5 2 / 5 Generally, Autodesk,,Vault,,Office,,2016,,555H1,,Autodesk,,Vault,,Professional,,2016,,569H1,,Autode sk,,vault,,workgroup,,2016,,559h1,,autodesk,,vehicle,,tracking,,2016,,955h1,,autodesk,,vred...

More information

第 二 輯 目 錄.indd 2 目 錄 編 寫 說 明 附 : 香 港 中 學 文 憑 中 國 語 文 科 評 核 模 式 概 述 綜 合 能 力 考 核 考 試 簡 介 及 應 試 技 巧 常 用 實 用 文 文 體 格 式 及 寫 作 技 巧 綜 合 能 力 分 項 等 級 描 述 練 習 一

第 二 輯 目 錄.indd 2 目 錄 編 寫 說 明 附 : 香 港 中 學 文 憑 中 國 語 文 科 評 核 模 式 概 述 綜 合 能 力 考 核 考 試 簡 介 及 應 試 技 巧 常 用 實 用 文 文 體 格 式 及 寫 作 技 巧 綜 合 能 力 分 項 等 級 描 述 練 習 一 作 出 發 者 : 劉 梓 淩 版 : 精 工 出 版 社 行 : 精 工 印 書 局 香 港 銅 鑼 灣 道 168 號 電 話 :2571 1770 2554 1247 傳 真 :2806 0974 2873 2412 網 二 O 一 一 年 址 :http://www.jingkung.com 初 版 版 權 所 有, 翻 版 必 究 如 未 獲 得 本 公 司 同 意, 不 得 用 任 何

More information

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的 附 錄 美 國 國 家 兒 童 健 康 與 人 類 發 展 中 心 (NICHD) 偵 訊 指 導 手 冊 I. 開 場 白 1. 你 好, 我 的 名 字 是, 我 是 警 察 [ 介 紹 房 間 內 的 其 他 人, 不 過, 在 理 想 狀 態 下, 房 間 裡 不 該 有 其 他 人 ] 今 天 是 ( 年 月 日 ), 現 在 是 ( 幾 點 幾 分 ) 我 是 在 ( 地 點 ) 問 你

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

Microsoft Word - report final.doc

Microsoft Word - report final.doc 殘 疾 人 士 無 障 礙 運 輸 需 要 研 究 調 查 報 告 書 目 錄 I. 撮 要 II. III. IV. 前 言 調 查 目 的 文 獻 回 顧 V. 調 查 方 法 VI. 調 查 結 果 VII. 分 析 及 討 論 VIII. 建 議 IX. 鳴 謝 I. 撮 要 殘 疾 人 士 在 日 常 生 活 上 面 對 不 少 困 難 與 挑 戰, 健 全 人 士 未 必 可 以 身 同

More information

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx 立 法 會 發 展 事 務 委 員 會 二 零 一 六 年 施 政 報 告 及 施 政 綱 領 有 關 發 展 局 的 措 施 引 言 行 政 長 官 在 二 零 一 六 年 一 月 十 三 日 發 表 題 為 創 新 經 濟 改 善 民 生 促 進 和 諧 繁 榮 共 享 的 二 零 一 六 年 施 政 報 告 施 政 報 告 夾 附 施 政 綱 領, 臚 列 政 府 推 行 的 新 措 施 和

More information

_Chi.ps, page Preflight ( _Chi.indd )

_Chi.ps, page Preflight ( _Chi.indd ) on conviction3 5 1. / 2. 14 3. 2 2 3 4. 372 12 5. 6. 1 7. 1 2 i ii iii iv 8. 9. 1 12 2 2 i ii iii i ii iii 3 iv http://www.pcpd.org.hk v i ii iii 4 i ii i / ii 5 1. 2. 3. i ii iii iv v vi 4. 5. 6 6. 7.

More information

影視後製全攻略 Premiere Pro After Effects Encore 自序 Adobe Premiere Pro After Effects Encore 2008 Adobe CS Adobe CS5 Adobe CS4 Premiere Pro After Effect

影視後製全攻略 Premiere Pro After Effects Encore 自序 Adobe Premiere Pro After Effects Encore 2008 Adobe CS Adobe CS5 Adobe CS4 Premiere Pro After Effect 自序 Adobe Premiere Pro After Effects Encore 2008 Adobe CS3 2010 Adobe CS5 Adobe CS4 Premiere Pro After Effects Encore 18 ii Tony Cathy 2010/8 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 iii Premiere

More information

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63>

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63> 98 年 3 月 11 日 依 本 校 98 學 年 度 招 生 委 員 會 第 1 次 會 議 核 定 大 同 技 術 學 院 98 學 年 度 重 點 運 動 項 目 績 優 學 生 單 獨 招 生 簡 章 大 同 技 術 學 院 招 生 委 員 會 編 印 校 址 :600 嘉 義 市 彌 陀 路 253 號 電 話 :(05)2223124 轉 203 教 務 處 招 生 專 線 :(05)2223124

More information

Microsoft Word - install_manual-V _CN.docx

Microsoft Word - install_manual-V _CN.docx NO TASK Q-Sign Install Manual PAGE 1/28 Q-Sign INSTALL MANUAL Version 3.0 Server Manager Client Codec NO TASK Q-Sign Install Manual PAGE 2/28 History DATE Contents Name Ver. Remark 2009-02-11 Q-Sign Ver.

More information

中医疗法(下).doc

中医疗法(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...3...4...13...15...17...17...24...25...26...26...28...28...29...31...31...33...33

More information

穨學前教育課程指引.PDF

穨學前教育課程指引.PDF i 1 1.1 1 1.2 1 4 2.1 4 2.2 5 2.3 7 2.4 9 2.5 11 2.6 1 2 1 5 3.1 1 5 3.2 1 5 19 4.1 19 4.2 19 4.3 2 1 4.4 29 4.5 38 4.6 4 3 4.7 47 50 5.1 5 0 5.2 5 0 5.3 6 2 5.4 9 4 5.5 1 2 6 ( ) 1 2 7 ( ) 1 31 ( ) 1

More information

cgn

cgn 3654 ( 571 ) 88(4) 2014 3 31 10766 10778 2014 3 31 ( ) 2 21 ( ) 2014 3 31 10768 10778 6 9 1. ( ) 2. 3. 4. 5. 2014 6 3 ( ) 10768 10778 ( ) 2014 3 31 ( 622 ) 11 80 2014 3 31 2014 6 3 10 8 2014 3 31 ( ) 2014

More information

中医疗法(上).doc

中医疗法(上).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...1...2...4...5...7...13...15...17...18...19...21...23...24...24...26...26...27 I ...28...29...30...30...31...32...33...34...35...36...37...39...40...41...42...43...43...45...46...47...47...48

More information

39898.indb

39898.indb 1988 4 1998 12 1990 5 40 70.................................................. 40.............................................................. 70..............................................................

More information

穨ecr2_c.PDF

穨ecr2_c.PDF i ii iii iv v vi vii viii 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 26 27 2 28 29 30 31 32 33 34 35 36 37 38 39 40 3 4 41 42 43 5 44 45 46 6 47 48 49 50 51 52 1 53 2 54 55 3 56

More information

電腦相關罪行跨部門工作小組-報告書

電腦相關罪行跨部門工作小組-報告書 - ii - - iii - - iv - - v - - vi - - vii - - viii - (1) 2.1 (2) (3) 13.6 (4) 1.6 (5) 21 (6) (7) 210 (8) (9) (10) (11) ( ) ( 12) 20 60 16 (13) ( ) (

More information

i

i i ii iii iv v vi vii viii ===== 1 2 3 4 5 6 7 8 9 10 ==== 11 12 13 14 15 16 17 18 19 ==== ==== 20 .. ===== ===== ===== ===== ===== ======.. 21 22 ===== ===== ===== ===== 23 24 25 26 27 28 29 ==== ====

More information

发展党员工作手册

发展党员工作手册 发 展 党 员 工 作 问 答 目 录 一 总 论...9 1. 发 展 党 员 工 作 的 方 针 是 什 么? 如 何 正 确 理 解 这 个 方 针?... 9 2. 为 什 么 强 调 发 展 党 员 必 须 保 证 质 量?... 9 3. 如 何 做 到 慎 重 发 展?... 10 4. 如 何 处 理 好 发 展 党 员 工 作 中 的 重 点 与 一 般 的 关 系?...11 5.

More information

i

i 9 1 2 3 4 i 5 6 ii iii iv v vi vii viii 1 1 1 2 3 4 2 5 6 2 3 2.10 ( 2.11 ) ( 2.11 ) ( 2.9 ) 7 8 9 3 10 5% 2% 4 11 93% (2001 02 2003 04 ) ( ) 2,490 (100%) 5 12 25% (2.57% 25%) 6 (2001 02 2003 04 ) 13 100%

More information

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc 在 VMWare-5.5+RedHat-9 下建立 本机 QTopia-2.1.1 虚拟平台 张大海 2008-5-9 一 资源下载 1. 需要以下安装包 : tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2.tar.gz qt-x11-free-3.3.4.tar.gz

More information

國立中山大學學位論文典藏.PDF

國立中山大學學位論文典藏.PDF I II III IV V VI VII VIII IX X 苷 XI XII 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

More information

TD

TD *TD-000212-05* 20- 应用实例 4 本例显示的是使用两个亚低 音扬声器和多个顶箱的双声 道 立体声 设置 除了各声道都增加了一个顶 箱外 也可以增加更多的顶 箱 本例和例 3 的情况一 致 声道 2 或 右声道 声道 1 或 左声道 要接到更多的顶箱 将最后 一个顶箱的全幅线路输出接 头处的线缆接到下一个顶箱 的全幅线路输入接头 在不 降低信号质量的情况下 最

More information

VenomX_Setup_Instruction_ZH

VenomX_Setup_Instruction_ZH Tuact Corp. Ltd. TM Venom 鼠标手柄套装 X 设置软件使用说明 VenomXTM VenomXTM Venom XTM 简介 Tuact Venom-X -- Venom-X Venom-X www.tuact.com/support/downloads Venom-X 连接硬件设置 Venom XTM Venom-X Venom-X: 1. PC 2. Mini USB USB

More information

智力测试故事

智力测试故事 II 980.00 ... 1... 1... 1... 2... 2... 2... 3... 3... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 8... 9... 9...10...10...10 I II...11...11...11...12...13...13...13...14...14...14...15...15...15...16...16...17...17...18...18...19...19...19...19...20...20...21...21...21

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

目 录 院 领 导 职 责... 1 院 长 职 责... 1 医 疗 副 院 长 职 责... 1 教 学 副 院 长 职 责... 2 科 研 副 院 长 职 责... 2 后 勤 副 院 长 职 责... 3 主 管 南 院 区 副 院 长 职 责... 3 党 委 书 记 职 责... 4

目 录 院 领 导 职 责... 1 院 长 职 责... 1 医 疗 副 院 长 职 责... 1 教 学 副 院 长 职 责... 2 科 研 副 院 长 职 责... 2 后 勤 副 院 长 职 责... 3 主 管 南 院 区 副 院 长 职 责... 3 党 委 书 记 职 责... 4 目 录 院 领 导 职 责... 1 院 长 职 责... 1 医 疗 副 院 长 职 责... 1 教 学 副 院 长 职 责... 2 科 研 副 院 长 职 责... 2 后 勤 副 院 长 职 责... 3 主 管 南 院 区 副 院 长 职 责... 3 党 委 书 记 职 责... 4 纪 委 书 记 职 责... 5 院 长 办 公 室... 6 院 长 办 公 室 工 作 职 责...

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

More information

(b) 3 (a) (b) 7 (a) (i) (ii) (iii) (iv) (v) (vi) (vii) 57

(b) 3 (a) (b) 7 (a) (i) (ii) (iii) (iv) (v) (vi) (vii) 57 (i) (ii) (iii) A. 123 2 3(1) (2) (i) 41 (ii) (iii) 121 4(3) (i) (ii) (iii) 123A 3 (a) 56 (b) 3 (a) (b) 7 (a) (i) (ii) (iii) (iv) (v) (vi) (vii) 57 (viii) (ix) (x) 4B(2)(d) (e) (f) (xi) (xii) (b) (a) (i)

More information

Microsoft Word - CX1000-HMI_程序开发_PLC通讯

Microsoft Word - CX1000-HMI_程序开发_PLC通讯 用 VB.Net 开发 CX1000 的 HMI 第二部分和 TwinCAT PLC 通讯 一 TwinCAT 动态库 TwinCAT.Ads.dll The TwinCAT.Ads.dll 是一个.NET 类库, 它提供和 ADS 设备通讯的类 如果 TwinCAT PLC 运行在 IPC 上, 则需要添加的类库是路径 \TwinCAT\ADS Api\.NET\v1.1.4322 下的 TwinCAT.Ads.dll

More information

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (xi) 60.99%39.01%

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (xi) 60.99%39.01% 48.55% 1998 19986 30%20086 2009 2009 200 (i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (xi) 60.99%39.01% 200820092010 772 928960200820092010 1512928 201 1. 20091222(2009)7267 20042008 16,980,954.02

More information

奇闻怪录

奇闻怪录 ... 1... 1... 2... 3... 3... 4... 4... 5... 5... 6... 8... 9... 10... 10... 11... 11... 13... 13... 14... 14... 15... 16... 17... 21 I ... 22... 23... 23... 24... 25... 25... 26... 27... 28... 29 UFO...

More information

<4D6963726F736F667420576F7264202D205B345DB5D8AE4CACD732303135AECAAFC5C1C9C1DCBDD0AB48A4CEB3F8A657AAED>

<4D6963726F736F667420576F7264202D205B345DB5D8AE4CACD732303135AECAAFC5C1C9C1DCBDD0AB48A4CEB3F8A657AAED> 華 夏 盃 全 國 全 國 數 學 奧 林 匹 克 邀 請 賽 ( 華 南 賽 區 ) 晉 級 賽 比 賽 詳 情 : 一 比 賽 對 象 : 小 學 一 至 六 年 級 中 學 一 二 年 級 二 比 賽 日 期 及 時 間 : 年 2 月 15 日 ( 星 期 日 ) 小 學 組 小 一 級 小 二 級 小 三 級 小 四 級 小 五 級 小 六 級 時 間 13:10~1:20 13:10~1:20

More information

master the boards step 2 ck pdf free download

master the boards step 2 ck pdf free download 1 / 5 2 / 5 Now,,,designed,,,to,,,work,,,with... A,,,.jpg,,,image,,,Barnes,,&,,Noble,,Spend,,... Files/Master,,The,,Bo ards,,usmle,,step,,2,,ck,,sanskrit,,documents,,list:,,links,,3,,scriptures,,,caresource,,provider,,manu

More information

摘 要 本 校 多 媒 體 設 計 系 與 上 海 戲 劇 學 院 創 意 學 院 在 多 次 聯 繫 交 流 之 下, 已 簽 署 合 作 備 忘 錄, 積 極 尋 求 兩 校 合 作 教 學 與 共 同 創 作 之 機 會 藉 由 本 系 學 生 作 品 腦 殘 公 寓 入 圍 第 五 屆 中

摘 要 本 校 多 媒 體 設 計 系 與 上 海 戲 劇 學 院 創 意 學 院 在 多 次 聯 繫 交 流 之 下, 已 簽 署 合 作 備 忘 錄, 積 極 尋 求 兩 校 合 作 教 學 與 共 同 創 作 之 機 會 藉 由 本 系 學 生 作 品 腦 殘 公 寓 入 圍 第 五 屆 中 出 國 報 告 ( 出 國 類 別 : 其 他 - 國 際 競 賽 ) 中 國 獨 立 遊 戲 節 國 際 學 生 競 賽 及 上 海 戲 劇 學 院 合 作 洽 談 服 務 機 關 : 國 立 臺 中 科 技 大 學 多 媒 體 設 計 系 姓 名 職 稱 : 金 啟 平 專 案 講 師 派 赴 國 家 : 中 國 出 國 期 間 :102.9.14 102.9.17 報 告 日 期 :102.11.20

More information

前 言 根 据 澳 门 特 别 行 政 区 第 11/1999 号 法 律 第 三 条 规 定, 审 计 长 执 行 其 职 责, 已 经 对 财 政 局 提 交 的 2011 年 度 澳 门 特 别 行 政 区 总 帐 目 ( 总 帐 目 ) 进 行 了 审 计 与 2010 年 度 相 同, 本 年 度 的 总 帐 目 由 政 府 一 般 综 合 帐 目 及 特 定 机 构 汇 总 帐 目, 两

More information

Microsoft Word - QTP测试Flex.doc

Microsoft Word - QTP测试Flex.doc TIB 自动化测试工作室 http://www.cnblogs.com/testware 使用 QTP 进行 Flex 自动化测试 自动化测试工具与 Flex 应用程序之间是通过代理 (Agent) 来交互的, 如图所示 : 这也就是为什么后面在使用 QTP 进行 Flex 自动化测试之前要先安装 Flex 插件 配置和编译 Flex 程序的原因 前提条件 在使用 QTP 进行 Flex 4 的测试之前,

More information

群科課程綱要總體課程計畫書

群科課程綱要總體課程計畫書 核 准 文 號 :102 年 4 月 22 日 臺 教 國 署 高 字 第 1020036237 號 國 立 曾 文 高 級 農 工 職 業 學 校 群 科 課 程 綱 要 總 體 課 程 計 畫 書 (102 學 年 度 入 學 學 生 適 用 ) 中 華 民 國 102 年 04 月 22 日 國 立 曾 文 高 級 農 工 職 業 學 校 群 科 課 程 綱 要 總 體 課 程 計 畫 書 核

More information

Acer E 15 Graphics Driver Download. Mexico motor Picture redes original Jorge montana

Acer E 15 Graphics Driver Download. Mexico motor Picture redes original Jorge montana Acer E 15 Graphics Driver Download >>> DOWNLOAD 1 / 5 2 / 5 Get...all...the...data...for...your...required...driver...including...models,...availability...and...OS..... Drivers...for...direct...download...are...uploaded...daily...and...rated...by...our...usersWorld'

More information

骨头的故事

骨头的故事 头 1 图 206 33 7 12 5 5 4 12 2 54 10 200-400 3 500 图 类 图 图 动 节 4 5 图 发 图 节 180 Youtube 180 [1] 7 2 7 6 9 270 6 图 树懒 块颈 13-25 14 17 25 7 图 扭头 头鹰 鹅 8 图 红 为 关节 绿 为 关节 9 图 类 10 图 类 11 图 盘 动 类 图 阴 犸 艺 你可能会以为图

More information

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch6 [相容模式] UiBinder wzyang@asia.edu.tw UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner

More information

X713_CS_Book.book

X713_CS_Book.book / / /USB ) ; ; C D ; ; B B 1 >> 2 3 B 1 ( > > ) 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 GSM GPS ( ) 手机已连接到 GSM 网络 指示条越多, 接收质量越好 GPS 2 ...........................4.............................. 4 Micro SD (

More information