这家80岁的游戏厂商,给了入行新人一份开发培训教材
当前位置 :首页>产业新闻>返回
时间:2020-06-02 编辑: 来源:游戏葡萄

  半个月前,虚幻5引擎的亮相在游戏行业引发了广泛讨论,同时也点燃了一部分人的游戏开发热情。

  对于初学者而言,学习游戏开发难免会陷入一种无从下手的困局,怎么去建立起一套知识体系来更好地掌握这门技能?从最近出版的一本书中,葡萄君一定程度上找到了这个参考答案。

  这本书名为《游戏开发:世嘉新人培训教材》,作者是平山尚,曾在世嘉参与《电脑战机》(PS2)、《超级网球大奖赛3》(AC、PS3)的开发。

  世嘉在游戏行业的地位无需赘述,它曾与任天堂、索尼、微软并列四大家用游戏机制造商,是业内知名的游戏开发公司。本书推出后很快受到世嘉内部新人欢迎,并荣获游戏开发者奥斯卡CEDEC AWARDS 2009著作奖,称得上一本经典书。

  15.jpg

  2012年夏天,本书译者、拥有15年游戏开发经验的资深工程师罗水东在东京的书店里发现此书,并被其吸引,不过因为版权的问题,翻译一事被搁浅。

  随着图灵引进该书中文版权,翻译工作正式启动。值得一提的是,为了确保翻译的精准,罗水东将原著反复读了3次。要知道,这本书多达27个章节、676页,能全篇通读下来就已经很不容易了,而在翻译出来的同时,他还将本书的可读性尽可能提高了不少。

  这本书写了什么?

  《游戏开发:世嘉新人培训教材》一书可分为三部分:2D游戏、3D游戏和通往商业游戏之路,而这种层层铺垫、由浅及深的知识体系也比较适合新人来阅读(文末附目录)。

  在2D游戏的开始,作者率先开发了经典的推箱子游戏。在他看来,这款仅200行代码就能运行的游戏,做起来并不是想象中的小菜一碟,需要考虑的东西是相当多的。

  16.jpeg

  拿“移动”来举例,游戏中不存在玩家和箱子分开移动的情况,因此移动处理就是判断玩家朝上下左右哪个方向移动。而在此之前,首先要判断移动位置是否处于允许范围之内;编写代码时,开头第一个if语句检测要移动的位置是否为空,如果为空则移动到该处。

  17.jpeg

  部分代码展示

  当然,这个所谓的空可能有“空白”和“目的地”两种情况,所以代码会有些复杂。如果将“是否是目的地”的信息存储在别处,因为该数据固定而且不会被修改,所以代码写起来可能会更简单。

  接下来则是对代码的进一步改善,如数据容量、处理速度、代码可读性和可拓展性等等。

  完成核心模块后,作者下一步开始引导游戏更好地朝商业化发展,从像素到图片素材,再到动画、文本绘制、声音等角度深入开发,来输出成品。

  而在3D游戏部分,你可以学着自制动作游戏《机甲大战》,过程中涵盖计算机运算(3D碰撞处理)、计算机图形学(角色动画)、编程等知识细节。

  18.jpg

  19.jpeg

  举一个《机甲大战》自动跟踪的例子。更好的设计应当是玩家可以在导弹即将击中自己的瞬间,通过跳跃或者横向闪避来躲开导弹,而且此时的导弹不允许突然掉头袭击,不然就算作弊了。因此,代码只要让导弹飞行过程中每帧都朝着敌人的方向改变一定角度,让导弹沿着头部的朝向移动,然后逐渐改变它的方向。

  角度的调整通过上下角(绕x轴旋转)与方向角(绕y轴旋转)实现。绕z轴旋转意味着导弹沿着其自身的轴心旋转,这只起到一个装饰的作用,所以绘制时再去思考就可以了。每帧计算出当前敌人所处的方位,并设置以上两个角度变量使其接近该值。这种方法虽然不完美,但在具备重力的环境近距离作战时并不会有什么问题。

  接下来用角度的补间方法使其绕x轴旋转即可。不过,绕x轴的旋转角的范围要控制在-90°至90°,超过90°意味着导弹的上下两面发生了反转。这一点并不难理解。我们抬起头一直往后仰,最终就会看到地面出现在我们的“上方”。任何朝向都可以通过一个-90°到90°的绕x轴的旋转角与一个-180°到180°的绕y轴的旋转角来表示,所以这种设计是没问题的。就好比我们想欣赏身后的风景时不必仰头反转,只要旋转身体就可以了。

  20.jpeg

  当掌握了3D游戏开发的基础知识,能够独立地开发一款产品后,接下来的考验就集中在商业化之前的这段优化过程上,比如如何缩短加载时间?如何预防和处理bug?

  以代码为例,书中提到,在项目中要求统一风格的情况下,如果有程序员不愿意改变自己的风格,可能就会起冲突。但事实上,每个人都应该接受好的代码规范,做到“不复杂、不繁琐、有必要”。

  21.jpeg

  在本书最后笔者坦言,“虽然写了这样厚厚的一本书,但初入游戏公司时连书的十分之一都没未掌握”。在他看来,以前只要有兴趣,一个人也能开发一款游戏,但参考当下游戏规模的技术复杂程度,一己之力很难开发像样的游戏了。因此,这样一本教材或许能体现出它的价值。

  更为普适的一本开发书籍

  其实,进入游戏行业的新人往往存在对专业书籍的诉求,而市面上多数游戏开发书籍很难兼顾专业性和可读性,又以可读性的缺失最为明显。这便导致读者阅读门槛提高,有可能无法坚持看完一本书。

  《游戏开发:世嘉新人培训教材》则针对性地解决了这个问题。它以开发游戏demo、梳理设计知识为轴,尝试穿插了不少私货,让读者知道“怎么做”的同时,明白“为什么”这么做,甚至跟策划扯皮的过程也夹带进来,显得更接地气。

  另一方面,虽然书名提到“新人培训教材”,但受众并不限于新人。Unity User Group意见领袖、UVP价值专家宣雨松MOMO评价称:

  它远远超过了新人培训,甚至适合工作多年的老手。现在市面上有很多好用的商业游戏引擎,它们将大量原理部分的知识隐藏起来,暴露给程序员的都是简单易用的接口。时间久了很多程序员虽然能开发游戏,但已经浑然不知背后的原理知识了。

  如果对原理不了解,就意味着无法更好地和硬件打交道,无法更好地优化自己的游戏。这本书从无到有一点点揭秘游戏开发的原理,由浅入深,很容易理解,确实是一本不可不读的好书。

  22.jpg

  《游戏开发:世嘉新人培训教材》开头提到了这样一句话,“本书就像一条从山脚蜿蜒而上的山路,虽漫长但不陡峭,让读者一路欣赏风景直至顶峰,不会半途而弃。这也是导致本书页数超级多的原因。这些风景就是当下游戏编程中最常见的内容。”

  在众多游戏开发书籍中,这或许就是本书的最大竞争力。

  (目前该书已在“游戏葡萄”公众号的“葡萄书房”上架,长按下方图片扫码进入小程序即可购买。)

  23.jpeg

  长按此图扫码进入小程序即可购买

  附本书目录:

  第 1部分 2D 游戏.1

  第 1章 第 一个游戏2

  1.1 开发一个益智游戏 .3

  1.2 示例代码解说 7

  1.3 添加读取场景数据的功能 16

  1.4 C 课堂 21

  1.5 补充内容:标志位和位运算26

  1.6 补充内容:指针和内存 34

  1.7 补充内容:引用 41

  1.8 本章小结 46

  第 2章 从像素开始学习2D 图形处理 .47

  2.1 什么是2D 图形处理 48

  2.2 准备工作 50

  2.3 打印一个点 54

  2.4 移植《箱子搬运工》 .55

  2.5 补充内容:结束处理 .58

  2.6 本章小结 60

  第3章 使用图片素材 61

  3.1 读取图片文件 .62

  3.2 带图片的《箱子搬运工》的示例代码72

  3.3 使用透明通道 .75

  3.4 头文件包含关系的组织策略 .82

  3.5 补充内容:透明混合的性能优化 86

  3.6 补充内容:加法混合 .88

  3.7 本章小结 90

  第4章 实时游戏 91

  4.1 什么是实时游戏 92

  4.2 运行动画 95

  4.3 带动画的《箱子搬运工》.96

  4.4 获得游戏的帧率 .101

  4.5 解决帧率差异 103

  4.6 补充内容:根据帧率变化动态改变游戏运行速度 105

  4.7 补充内容:影像撕裂现象 110

  4.8 本章小结 .111

  第5章 简单的状态迁移 113

  5.1 往类库追加功能 .114

  5.2 相对直接的做法 .117

  5.3 试着增加状态 119

  5.4 代码审查 .122

  5.5 示例代码解说 128

  5.6 本章小结 .136

  第6章 文本绘制方法 .137

  6.1 字体图片 .138

  6.2 文本绘制函数 138

  6.3 一些改进 .140

  6.4 成果验证 .142

  6.5 示例代码解说 143

  6.6 注意著作权 147

  6.7 示例类库的功能 .147

  6.8 本章小结 .148

  第7章 动作游戏初体验 149

  7.1 用到的类库 150

  7.2 开发《炸弹人》 .151

  7.3 示例代码解说 152

  7.4 添加背景显示 157

  7.5 配置移动的对象 .164

  7.6 游戏的改进方向 .169

  7.7 本章小结 .170

  第8章 2D 平面内的碰撞处理 171

  8.1 碰撞检测 .172

  8.2 碰撞响应 .174

  8.3 发生多个碰撞时的问题 .179

  8.4 碰撞响应与操作性 180

  8.5 移动的物体相互碰撞 184

  8.6 《炸弹人》的碰撞处理 .184

  8.7 本章小结 .186

  第9章 各种输入设备 .187

  9.1 获取输入设备实例 188

  9.2 键盘 189

  9.3 鼠标 189

  9.4 手柄 190

  9.5 在《炸弹人》游戏中使用手柄 .191

  9.6 本章小结 .193

  第 10章 状态迁移详解 194

  10.1 问题定位 195

  10.2 使用继承 195

  10.3 实际运用 198

  10.4 补充内容:简化状态迁移的代码 .201

  10.5 补充内容:跨层级的状态迁移处理的改进 204

  10.6 补充内容:继承的原理 208

  10.7 本章小结 213

  第 11章 播放声音 .215

  11.1 关于音频类库 216

  11.2 补充内容:计算机如何播放声音 .218

  11.3 补充内容:音高和音量 219

  11.4 补充内容:音色 220

  11.5 补充内容:声音的叠加 221

  11.6 补充内容:do、re、mi 的原理 222

  11.7 补充内容:演奏乐谱 223

  11.8 补充内容:读取WAV 音频文件 225

  11.9 补充内容:使用Sound 模块来合成声波 .226

  11.10 本章小结 226

  第 12章 旋转、缩放与平移 227

  12.1 旋转 .228

  12.2 引入向量和矩阵 241

  12.3 利用顶点来实现 246

  12.4 缩放 .253

  12.5 在缩放的同时进行旋转.255

  12.6 矩阵的力量 .256

  12.7 补充内容:旋转公式的由来 263

  12.8 补充内容:更为实用的旋转处理方法 266

  12.9 补充内容:数学中的矩阵 .267

  12.10 本章小结 271

  第 13章 显卡的力量 272

  13.1 关于使用的类库 273

  13.2 使用显卡绘制三角形 273

  13.3 将图像贴到三角形中 275

  13.4 混合模式 278

  13.5 旋转、缩放和移动 .278

  13.6 移植《炸弹人》 281

  13.7 本章小结 284

  第 2部分 3D 游戏285

  第 14章 绘制立体物体 286

  14.1 关于类库 287

  14.2 开始制作3D 动作游戏《机甲大战》 .287

  14.3 绘制三角形 .289

  14.4 按位置前后绘制物体 290

  14.5 将远处的物体绘制得小一些 294

  14.6 坐标变换 303

  14.7 用矩阵表示透视变换 316

  14.8 开始制作《机甲大战》 322

  14.9 补充内容:Z 缓存的精度问题 335

  14.10 本章小结 338

  第 15章 类库的封装方法 .340

  15.1 整体设计 341

  15.2 资源的详细内容 342

  15.3 试运行 350

  15.4 从文件载入 .352

  15.5 补充内容:将类库从游戏中分离 .354

  15.6 本章小结 363

  第 16章 伪XML 文件的读取 364

  16.1 确定文件格式 365

  16.2 创建前的准备 366

  16.3 处理流程 368

  16.4 字符串解析 .371

  16.5 编写代码 373

  16.6 运用 .375

  16.7 示例代码解说 378

  16.8 补充内容:生成数据文件382

  16.9 本章小结 385

  第 17章 编写高性能的代码 386

  17.1 算法与时间复杂度 .387

  17.2 数据结构基础 390

  17.3 吞吐量与延迟 402

  17.4 并行处理 404

  17.5 内存问题 404

  17.6 STL 和数据结构 411

  17.7 性能瓶颈分析 416

  17.8 补充内容:函数调用的开销 417

  17.9 补充内容:高效运算与低效运算 .420

  17.10 本章小结 422

  第 18章 3D 碰撞处理 .423

  18.1 长方体的碰撞处理 .424

  18.2 使用浮点数的碰撞检测 427

  18.3 三角形和线段的相交检测 .436

  18.4 实用性 445

  18.5 其他问题 447

  18.6 本章小结 448

  第 19章 《机甲大战》的设计 450

  19.1 状态迁移 451

  19.2 操作 .451

  19.3 发射导弹 454

  19.4 将功能整合到一起 .457

  19.5 前端展现 461

  19.6 不足之处 463

  19.7 本章小结 464

  第 20章 光照 465

  20.1 看见物体的过程 466

  20.2 光的衰减过程 469

  20.3 尝试计算 473

  20.4 整合到《机甲大战》中.479

  20.5 补充内容:性能优化 480

  20.6 补充内容:更好的绘制效果 483

  20.7 本章小结 484

  第 21章 角色动画 .485

  21.1 相对运动 486

  21.2 层级Model 类 492

  21.3 自动构建树结构 495

  21.4 将动画数据化 500

  21.5 补间方法 506

  21.6 引入到《机甲大战》中.518

  21.7 补充内容:联立方程组vs 斜率指定法 519

  21.8 补充内容:不足之处 520

  21.9 本章小结 523

  第3部分 通往商业游戏之路525

  第 22章 高效的碰撞检测 .526

  22.1 低效的循环判断方法 527

  22.2 性能改善的基本思路 528

  22.3 基于排序的方法 531

  22.4 依靠分割实现的方法 539

  22.5 补充内容:改进等分切割法545

  22.6 补充内容:空间分割的高级技巧 .548

  22.7 本章小结 552

  第 23章 数据加载 .554

  23.1 为何加载时间越来越长.555

  23.2 文件加载类 .556

  23.3 通过合并文件提升性能.562

  23.4 通过压缩提升性能 .571

  23.5 补充内容:多线程异步处理579

  23.6 补充内容:编码技术 590

  23.7 补充内容:用于加密的合并与压缩 591

  23.8 本章小结 592

  第 24章 float 的用法 593

  24.1 位数限制 594

  24.2 float 的实现 594

  24.3 位数截断带来的误差 596

  24.4 误差程度 597

  24.5 减小误差的方法 600

  24.6 特别的数 606

  24.7 本章小结 608

  第 25章 随书类库概要 609

  25.1 类库中的类 .610

  25.2 启动设定 611

  25.3 Framework 模块 613

  25.4 WindowCreator 模块 614

  25.5 FileIO 模块 614

  25.6 Base 模块 615

  25.7 Math 模块 616

  25.8 Threading 模块 618

  25.9 Input 模块 .620

  25.10 Sound 模块 620

  25.11 PseudoXml 模块 621

  25.12 Graphics 模块 621

  25.13 Scene 模块 628

  25.14 抗锯齿处理 630

  25.15 将《机甲大战》改用最终版类库实现 631

  25.16 X 文件 .633

  25.17 本章小结 634

  第 26章 bug 的应对方法 .635

  26.1 防火与灭火 .636

  26.2 bug 的种类 .636

  26.3 bug 的预防 .641

  26.4 bug 的处理 .654

  26.5 《机甲大战》的处理 656

  26.6 补充内容:如何检测内存溢出 657

  26.7 本章小结 660

  第 27章 进阶方向 .662

  27.1 应该学习什么 663

  27.2 工具开发 664

  27.3 AI 667

  27.4 网络 .667

  27.5 shader 668

  27.6 参考文献 669

  27.7 一些期待的书 672

  后记 .675

  致谢 .676


国内11家游戏厂商财报汇总

星际手游给玩家带来的乐趣

西游题材出了多少新花样?

健康游戏忠告:抵制不良游戏 拒绝盗版游戏 注意自我保护 谨防上当受骗 适度游戏益脑 沉迷游戏伤身 合理安排时间 享受健康生活

京ICP备15024595号-1

游戏客栈 游戏客栈