书籍详情
《Android 3D游戏程序设计》[46M]百度网盘|亲测有效|pdf下载
  • Android 3D游戏程序设计

  • 出版社:鑫晴文化专营店
  • 作者:[美] 罗伯特·秦 著
  • 出版时间:2021-03-01
  • 热度:9815
  • 上架时间:2025-01-04 08:18:29
  • 价格:0.0
书籍下载
书籍预览
免责声明

本站支持尊重有效期内的版权/著作权,所有的资源均来自于互联网网友分享或网盘资源,一旦发现资源涉及侵权,将立即删除。希望所有用户一同监督并反馈问题,如有侵权请联系站长或发送邮件到ebook666@outlook.com,本站将立马改正

内容介绍

基本信息

  • 商品名:Android 3D游戏程序设计
  • ISBN:9787302564997
  • 定价:149
  • 出版社:清华大学出版社
  • 作者:[美]罗伯特·秦

参考信息(以实物为准)

  • 出版时间:2021-03-01
  • 印刷时间:2021-03-01
  • 版次:1
  • 印次:1
  • 包装:平装
  • 开本:16开
  • 用纸:胶版纸
  • 页数:453
  • 字数:587000

编辑推荐

《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)、游戏的发布和市场化运作等内容。此外,本书还提供了丰富的示例和代码,以帮助读者进一步理解相关方案的实现过程。

    本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学教材和参考手册。


前言序言

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

    第1章整体讲述Android、Android SDK、如何针对开发环境设置计算机,以及简单的“Hello World”示例。

    第2章介绍Java语言、基本的Android Java程序框架和与Java OpenGL ES框架相关基本信息。

    第3章讨论3D数学、向量、矩阵和向量-矩阵操作。

    第4章阐述Android上的OpenGL ES、3D网格、光照机制、材质、纹理、持久化数据存储,以及如何利用顶点和片元着色器创建重力网格。

    第5章探讨碰撞和牛顿力学。

    第6章讨论声音和平视(head-up)显示。

    第7章考查如何创建玩家角色,包括 Drone Grid游戏中与玩家角色关联的元素,如武器、弹药和玩家的HUD。

    第8章详细介绍如何创建Drone Grid游戏中的敌方角色,其中包括Arena对象和坦克对象。相比较而言,Arena对象其行为相对简单,而坦克对象则是一类较为复杂的角色,涉及复杂的人工智能技术。

    第9章介绍Drone Grid游戏中的用户界面,包括菜单系统、高分表的创建以及高分输入菜单。

    第10章将前述章节内容整合至最终的Drone Grid游戏中,最完整的工作游戏集成了前述章节中的全部元素,如菜单、HUD,以及Arena对象和坦克对象这一类敌方角色。

    第11章讨论Android本地开发工具包和Java本地接口(JNI)。

    第12章介绍如何发布Android游戏,其中包含一个Android市场列表,并以此上传游戏发行文件、支持Android广告网络列表,以及一个审查Android游戏的游戏网站列表。


目录

第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_ZMinBoundary)

        {

            Vector3 v = GetObjectPhysics().GetVelocity();

            if (v.z < 0)

            {

                v.z = -v.z;

            }

        }

 

        // Check bounds for X

        if (m_Orientation.GetPosition().x >= 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对象示例。另外,本章后续示例还将使用该对象。