×
超值优惠券
¥50
100可用 有效期2天

全场图书通用(淘书团除外)

关闭
暂无评论
图文详情
  • ISBN:9787302564997
  • 装帧:一般胶版纸
  • 册数:暂无
  • 重量:暂无
  • 开本:大16开
  • 页数:453
  • 出版时间:2021-02-01
  • 条形码:9787302564997 ; 978-7-302-56499-7

本书特色

《Android 3D游戏程序设计》通过Java和OpenGL ES开发Android平台上的3D游戏。开发过程中将使用安装了Android开发工具(ADT)插件的Eclipse集成开发环境(IDE)。本书并不是一本简单的参考书,而是通过示例和学习用例展示游戏开发中的关键概念。

内容简介

《Android 3D游戏程序设计》详细阐述了与Android 3D游戏设计相关的解决方案,主要包括Android简介、Android中的Java语言、3D数学知识、基于OpenGL ES的3D图形学、运动和碰撞、游戏环境、创建玩家角色、创建敌方角色、用户界面、*终的Drone Grid游戏、Android原生开发包(NDK)、游戏的发布和市场化运作等内容。此外,本书还提供了丰富的示例和代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学教材和参考手册。

目录

第1章 Android简介 1

1.1 Android概述 1

1.2 Android SDK 1

1.2.1 Android软件开发工具包(SDK)的需求条件 1

1.2.2 Android SDK组件 2

1.2.3 配置开发环境 5

1.2.4 Android开发工具集成开发环境 6

1.3 “Hello World”示例程序 11

1.3.1 创建新的Android项目 11

1.3.2 Android模拟器 16

1.3.3 真实的Android设备 18

1.3.4 主源代码 19

1.3.5 图形布局 20

1.3.6 实际的“Hello World”数据 22

1.4 本章小结 22

第2章 Android中的Java语言 23

2.1 Java语言概述 23

2.2 Java注释 23

2.3 Java基本数据类型 24

2.3.1 数组 24

2.3.2 数据修饰符 24

2.4 Java运算符 25

2.4.1 算术运算符 25

2.4.2 一元运算符 26

2.4.3 条件运算符 26

2.4.4 位运算符和移位运算符 26

2.5 Java流控制语句 27

2.6 Java类 28

2.6.1 包和类 28

2.6.2 访问包中的类 28

2.6.3 Java接口 29

2.6.4 访问类变量和函数 29

2.7 Java函数 30

2.8 基本的Android Java程序框架 31

2.8.1 Activity类的生命周期 31

2.8.2 Activity类生命周期的关键点 32

2.8.3 查看Activity的生命周期 32

2.9 基本的Android Java OpenGL框架 34

2.9.1 单视图OpenGL ES应用程序 34

2.9.2 OpenGL ES多视图应用程序 37

2.10 3D OpenGL“Hello Droid”示例 40

2.10.1 将项目示例导入Eclipse中 40

2.10.2 MainActivity和MyGLSurfaceView类 40

2.10.3 MyGLRenderer类 42

2.10.4 类概述 46

2.10.5 体验“Hello Droid”示例程序 47

2.11 本章小结 49

第3章 3D数学知识 51

3.1 向量和向量操作 51

3.1.1 向量的含义 51

3.1.2 Vector类 54

3.1.3 向量的模 54

3.1.4 向量的标准化 55

3.1.5 向量加法 55

3.1.6 向量乘法 56

3.1.7 向量逆置 57

3.1.8 直角三角形 58

3.1.9 向量点积 58

3.2 矩阵和矩阵操作 60

3.2.1 矩阵的含义 60

3.2.2 Android内建Matrix类 61

3.2.3 单位矩阵 61

3.2.4 矩阵转置 61

3.2.5 矩阵乘法 62

3.2.6 逆矩阵 63

3.2.7 齐次坐标 63

3.2.8 使用矩阵平移对象 63

3.2.9 使用矩阵旋转对象 64

3.2.10 使用矩阵缩放对象 65

3.2.11 组合矩阵 65

3.3 操控3D空间中的对象 66

3.3.1 构建3D对象的模型矩阵 66

3.3.2 向对象中添加旋转行为 68

3.3.3 在3D空间中移动对象 69

3.3.4 缩放对象 71

3.4 本章小结 72

第4章 基于OpenGL ES的3D图形学 73

4.1 Android上的OpenGL ES 73

4.1.1 OpenGL对象渲染 73

4.1.2 渲染过程 74

4.2 OpenGL ES着色语言 80

4.2.1 基本数据类型 80

4.2.2 向量分量 81

4.2.3 运算符和表达式 81

4.2.4 程序流控制语句 82

4.2.5 存储限定符 83

4.2.6 保留变量 84

4.2.7 内置函数 84

4.3 顶点着色器 85

4.4 片元或像素着色器 86

4.5 Shader类 87

4.6 相机 94

4.7 3D对象网格 100

4.7.1 网格顶点数据 100

4.7.2 MeshEx类 101

4.8 光照机制 107

4.8.1 光照机制概述 107

4.8.2 PointLight类 108

4.8.3 构建法线矩阵 111

4.8.4 顶点着色器中的光照 112

4.8.5 片元着色器光照 115

4.9 材质 116

4.9.1 Material类 117

4.9.2 片元着色器中的材质 117

4.10 纹理 118

4.10.1 纹理放大和缩小 118

4.10.2 纹理剪裁和重复 119

4.10.3 Texture类 120

4.10.4 顶点着色器中的纹理 122

4.10.5 片元着色器中的纹理 123

4.11 本章小结 123

第5章 运动和碰撞 125

5.1 运动行为概述 125

5.1.1 线性速度和角加速度 125

5.1.2 牛顿运动定律 126

5.1.3 重力 127

5.1.4 角速度和角加速度 127

5.1.5 旋转作用力 128

5.2 Physics类 129

5.3 基于作用力的线性运动和角运动示例 135

5.3.1 创建4面纹理立方体 135

5.3.2 调整Object3d类 136

5.3.3 调整MyGLRenderer类 137

5.4 碰撞行为概述 139

5.4.1 碰撞检测 139

5.4.2 调整MeshEx类 140

5.4.3 调整Object3d类 143

5.4.4 碰撞类型 144

5.4.5 调整Physics类 145

5.4.6 碰撞计算 149

5.4.7 *终的Physics类 150

5.5 碰撞计算示例 151

5.5.1 调整MyGLRenderer类 151

5.5.2 牛顿万有引力定律 154

5.6 使用顶点着色器创建重力网格 155

5.6.1 修改Physics类 155

5.6.2 修改MeshEx类 155

5.6.3 GravityGridEx类 156

5.6.4 创建新的顶点着色器 167

5.6.5 调整MyGLRenderer类 170

5.7 本章小结 175

第6章 游戏环境 177

6.1 Android中的声音 177

6.1.1 Sound类 177

6.1.2 调整Object3d类 178

6.2 音效示例 180

6.3 HUD概述 184

6.3.1 HUD 184

6.3.2 创建BillBoard类 185

6.3.3 创建BillBoardFont类 188

6.3.4 调整Texture类 189

6.3.5 创建BillBoardCharacterSet类 189

6.3.6 创建HUDItem类 194

6.3.7 创建HUD类 196

6.3.8 调整Object3d类 202

6.4 HUD创建示例 203

6.5 数据持久化 212

6.5.1 调整Orientation类 213

6.5.2 调整Physics类 214

6.5.3 调整Object3d类 214

6.6 保存持久化数据 214

6.6.1 调整MyGLRenderer类 214

6.6.2 调整MyGLSurfaceView类 216

6.6.3 调整MainActivity类 217

6.7 本章小结 217

第7章 创建玩家角色 219

7.1 创建玩家图形 219

7.1.1 创建Mesh类 219

7.1.2 调整Object3d类 220

7.1.3 调整使用Object3d类的其他类 222

7.1.4 创建Pyramid类 223

7.1.5 创建PowerPyramid类 224

7.2 创建玩家的视点和输入 225

7.2.1 调整MyGLRenderer类 226

7.2.2 调整MyGLSurfaceView类 228

7.3 创建玩家的武器和弹药 229

7.4 创建爆炸效果 239

7.4.1 创建PolyParticleEx类 239

7.4.2 创建SphericalPolygonExplosion类 244

7.4.3 调整Object3d类 252

7.5 生成游戏对象的统计数据 253

7.5.1 创建Stats类 253

7.5.2 调整Object3d类 255

7.6 射击目标 256

7.6.1 创建玩家的武器系统 259

7.6.2 处理碰撞问题 263

7.6.3 调整onDrawFrame()函数 265

7.7 本章小结 268

第8章 创建敌方角色 269

8.1 创建Arena对象 269

8.2 人工智能概述 273

8.3 创建坦克敌方角色 275

8.3.1 创建坦克图形 275

8.3.2 创建坦克状态 276

8.3.3 创建车辆命令 278

8.3.4 创建坦克状态并处理命令 284

8.3.5 创建车辆的转向类 286

8.3.6 创建坦克的巡逻/攻击状态 288

8.3.7 创建坦克对象的有限状态机 299

8.3.7 创建坦克对象的Driver类 303

8.3.9 调整Physics类 307

8.3.10 调整Object3d类 309

8.3.11 创建坦克对象 310

8.4 ArenaObject3d类和Tank类 318

8.5 本章小结 326

第9章 用户界面 327

9.1 创建主菜单系统 327

9.1.1 MenuItem类 327

9.1.2 MainMenu类 329

9.2 创建高分榜 332

9.2.1 HighScoreEntry类 332

9.2.2 HighScoreTable类 334

9.3 创建高分输入系统 342

9.4 用户界面示例 350

9.5 本章小结 360

第10章 *终的Drone Grid游戏 361

10.1 组织和控制敌方角色分组 361

10.1.1 ArenaObjectSet类 361

10.1.2 TankFleet类 372

10.2 GamePlayController类 376

10.3 保存和加载游戏状态 385

10.3.1 调整MainActivity类 386

10.3.2 调整MyGLRenderer类 386

10.4 根据游戏结束状态添加游戏 388

10.5 Drone Grid游戏示例 392

10.6 本章小结 404

第11章 Android原生开发工具包(NDK) 405

11.1 NDK概述 405

11.2 NDK系统需求条件 405

11.3 Android平台兼容性 406

11.4 安装Android NDK 406

11.5 Android NDK的使用方式 407

11.6 Java本地接口概述 407

11.6.1 Java接口指针 408

11.6.2 加载和链接本地C/C++方法 408

11.6.3 命名的本地函数 409

11.6.4 本地函数参数 409

11.6.5 C/C++本地函数格式 410

11.6.6 本地类型 410

11.6.7 引用类型 410

11.6.8 JNI签名类型 411

11.6.9 调用Java中的本地代码并访问本地代码中的Java方法 412

11.6.10 JNI函数 413

11.7 Android JNI Makefile 414

11.8 基于JNI和本地代码的“Hello World”示例 415

11.9 向Drone Grid游戏中添加本地函数 419

11.9.1 计算本地代码中的重力 419

11.9.2 从本地代码中旋转对象 420

11.9.3 从本地代码中计算碰撞的反作用力 424

11.10 本章小结 428

第12章 游戏的发布和市场化运作 429

12.1 创建*终的发布文件 429

12.2 测试.apk发布文件 432

12.3 Android市场和策略列表 435

12.3.1 Google Play 435

12.3.2 Amazon Appstore 435

12.3.3 Samsung Apps Store 436

12.3.4 Aptoide 436

12.3.5 Appitalism 436

12.3.6 GetJar 437

12.3.7 SlideMe 437

12.3.8 Soc.Io Mall 437

12.3.9 用户自己的网站 437

12.4 Android广告网络列表 438

12.4.1 AppFlood 438

12.4.2 Appwiz 439

12.4.3 LeadBolt 439

12.4.4 AppBucks 440

12.4.5 AdMob 441

12.4.6 StartApp 442

12.4.7 其他广告网络和营销公司 444

12.5 Android游戏评论网站 447

12.6 其他有用的网站 452

12.7 本章小结 452

展开全部

节选

第8章 创建敌方角色 本章讨论Drone Grid游戏中敌方角色的创建,包括Arena对象和坦克角色,其复杂程度也随之上升。为了理解敌方角色的行为,我们需要考查与有限状态机相关的基本概念及其相关类(由计算机控制的坦克角色)。随后,本章将探讨实现坦克角色的其他类。*后,我们还将通过示例展示相关类的应用方式。8.1 创建Arena对象 Arena对象是一类简单的敌方角色对象,并可在重力网格区域内行进。此类角色在重力网格内以直线方式移动,直至到达网格边界或与玩家金字塔碰撞。在到达网格边界或与金字塔碰撞后,该对象将以相反的方向运动,并保持相同的速度。 ArenaObject3d类继承自Object3d类,如下所示。 public class ArenaObject3d extends Object3d m_ArenaObjectID变量可加载一个字符串,用以标识游戏场景中的个体对象,如下所示。 private String m_ArenaObjectID = "None"; m_XmaxBoundary和m_XminBoundary变量分别加载游戏网格或游戏场景中沿x轴的*大和*小边界值,如下所示。 private float m_XMaxBoundary = 1; private float m_XMinBoundary = 0; m_ZmaxBoundary和m_ZminBoundary变量分别加载游戏场景中沿z轴的*大和*小边界值,如下所示。 private float m_ZMaxBoundary = 1; private float m_ZMinBoundary = 0; 当Arena对象与地面碰撞时,m_HitGroundSFXIndex变量加载播放音效的句柄(如果存在),如下所示。 private int m_HitGroundSFXIndex = -1; 当Arena对象爆炸时,m_ExplosionSFXIndex变量加载播放音效的句柄,如下所示。 private int m_ExplosionSFXIndex = -1; ArenaObject3d()构造函数调用Object3d类的构造函数,随后针对Arena对象设置游戏场景边界,如代码清单8.1所示。代码清单8.1 ArenaObject3d()构造函数 ArenaObject3d(Context iContext, Mesh iMesh, MeshEx iMeshEx, Texture[] iTextures, Material iMaterial,Shader iShader, float XMaxBoundary,float XMinBoundary,float ZMaxBoundary,float ZMinBoundary) { super(iContext, iMesh, iMeshEx, iTextures, iMaterial, iShader); m_XMaxBoundary = XMaxBoundary; m_XMinBoundary = XMinBoundary; m_ZMaxBoundary = ZMaxBoundary; m_ZMinBoundary = ZMinBoundary; } 通过创建声音的资源ID和加载该声音的声音池并调用Object3d类中的AddSound()函数,CreateExplosionSFX()函数创建一个新的爆炸音效。相应地,m_ExplosionSFXIndex变量加载新创建声音的索引,如代码清单8.2所示。代码清单8.2 创建爆炸音效 void CreateExplosionSFX(SoundPool Pool, int ResourceID) { m_ExplosionSFXIndex = AddSound(Pool, ResourceID); } PlayExplosionSFX()函数播放爆炸的音效(如果存在),也就是说,利用爆炸音效索引调用Object3d类中的PlaySound()函数,如代码清单8.3所示。代码清单8.3 播放爆炸音效 void PlayExplosionSFX() { if (m_ExplosionSFXIndex >= 0) { PlaySound(m_ExplosionSFXIndex); } } 通过音效的资源ID和该声音所存储的声音池并调用Object3d类中的AddSound()函数,CreateHitGroundSFX()函数创建一个新的音效。随后,新创建的声音索引被返回并被置于m_HitGroundSFXIndex中,如代码清单8.4所示。代码清单8.4 创建撞击地面的音效 void CreateHitGroundSFX(SoundPool Pool, int ResourceID) { m_HitGroundSFXIndex = AddSound(Pool, ResourceID); } PlayHitGoundSFX()函数针对Arena对象撞击地面播放其音效,如代码清单8.5所示。代码清单8.5 播放撞击地面的音效 void PlayHitGoundSFX() { if (m_HitGroundSFXIndex >= 0) { PlaySound(m_HitGroundSFXIndex); } } RenderArenaObject()函数负责将Arena对象绘制至屏幕上。此外还测试对象是否刚好撞击地面。若是,则播放撞击地面的音效,并重置Physics类中的撞击地面的状态,如代码清单8.6所示。代码清单8.6 渲染Arena对象 void RenderArenaObject(Camera Cam, PointLight light) { // Object hits ground boolean ShakeCamera = GetObjectPhysics().GetHitGroundStatus(); if (ShakeCamera) { GetObjectPhysics().ClearHitGroundStatus(); PlayHitGoundSFX(); } DrawObject(Cam, light); } UpdateArenaObject()函数负责更新Arena敌方角色对象,如代码清单8.7所示。代码清单8.7 更新Arena对象 void UpdateArenaObject() { if (IsVisible() == true) { // Check Bounds for Z if (m_Orientation.GetPosition().z >= m_ZMaxBoundary) { Vector3 v = GetObjectPhysics().GetVelocity(); if (v.z > 0) { v.z = -v.z; } } else if (m_Orientation.GetPosition().z = m_XMaxBoundary) { Vector3 v = GetObjectPhysics().GetVelocity(); if (v.x > 0) { v.x = -v.x; } } if (m_Orientation.GetPosition().x <= m_XMinBoundary) { Vector3 v = GetObjectPhysics().GetVelocity(); if (v.x < 0) { v.x = -v.x; } } } // Update Physics for this object UpdateObject3d(); } UpdateArenaObject()函数执行下列各项操作。 (1)如果对象处于可见状态,则UpdateArenaObject()函数持续更新操作;否则该函数将返回。 (2)检查*大z边界,以查看对象是否位于其外部,若是且远离边界,则逆置对象速度的z分量。随后检查*小z边界,以查看对象是否位于外部,若是且远离边界,则逆置对象速度的z分量。 (3)针对x边界,重复步骤(2),并逆置对象速度的x分量,而非z分量。 图8.1显示了当前Arena对象示例。另外,本章后续示例还将使用该对象。

预估到手价 ×

预估到手价是按参与促销活动、以最优惠的购买方案计算出的价格(不含优惠券部分),仅供参考,未必等同于实际到手价。

确定
快速
导航