Andriod游戏开发第七章精灵、帧动画与碰撞检测

从零开始Android游戏编程(第二版)第七章精灵、帧动画与碰撞检测收藏第七章精灵、帧动画与碰撞检测经过前几章的学习,大家对使用位图、接受用户控制应该已经有了初步的概念,也可以运用这些知识完成简单的小游戏。这一章中,我们会为游戏中最重要的部分——图形处理建立一个基本的框架,这还不是游戏引擎,但是其中很多方法可以为读者以后创建自己的游戏引擎提供借鉴。这一章的涉及的内容比较多,既有2D游戏的基础理论,又有复杂的代码。尤其是代码部分,如果详细讲解,恐怕会占用很大的篇幅。所以我们只对关键的函数进行讲解,以方便读者今后灵活运用这些代码(所有的源代码都与本章节内容一同提供下载)。这个框架是完全依照MIDP中javax.microedition.lcdui.game包设计的:ClassesGameCanvasLayerLayerManagerSpriteTiledLayergame包中有5个类,其中Layer(层)是一个抽象类,对图形显示作了基本的定义。以我们的目标游戏《坦克大战》为例,在游戏中有这样一些图形元素:我方和敌方的坦克、坦克发出的子弹、地面、墙体、水域掩体等。这些元素虽然外观不同,但是本质上却非常相似:都是在特定位置以特定尺寸显示一个或一组位图,有些位图位置还会变动,Layer就定义了位置,尺寸,显示等相关的功能。之所以叫做Layer,与游戏中分层地图的概念有关,先让我们了解一下什么是分层地图:还是说坦克大战,当我们的坦克行驶在普通地面上时,坦克的图像肯定是覆盖了地面的图像,这样我们能看到坦克。当坦克行驶到掩体时,我们会发现,掩体的图像覆盖了坦克的图像,如图所示:实际上,我们在程序中,只要首先显示地面的图像,然后显示坦克的图像,最后显示掩体的图像(掩体图片是镂空的),就能达到这种效果,这就是分层地图。通常我们把最下面的叫做地面层,中间的叫做物件层,最上面的叫做天空层。关于地图我们就讲这么多,这里只介绍图形意义上的分层,是为了帮助大家理解Layer一词的意义。关于地图的详细内容我们在第十章会深入讲解。首先让我们看一下抽象类Layer的定义:packageorg.yexing.android.gamesmon;importandroid.graphics.Canvas;publicabstractclassLayer{intx=0;//Layer的横坐标inty=0;//Layer的纵坐标intwidth=0;//Layer的宽度intheight=0;//Layer的高度booleanvisible=true;//Layer是否可见Layer(intwidth,intheight){setWidthImpl(width);setHeightImpl(height);}/***设定Layer的显示位置**@paramx*横坐标*@paramy*纵坐标*/publicvoidsetPosition(intx,inty){this.x=x;this.y=y;}/***相对于当前的位置移动Layer**@paramdx*横坐标变化量*@paramdy*纵坐标变化量*/publicvoidmove(intdx,intdy){x+=dx;y+=dy;}/***取得Layer的横坐标**@return横坐标值*/publicfinalintgetX(){returnx;}/***取得Layer的纵坐标**@return纵坐标值*/publicfinalintgetY(){returny;}/***取得Layer的宽度**@return宽度值*/publicfinalintgetWidth(){returnwidth;}/***取得Layer的高度**@return高度值*/publicfinalintgetHeight(){returnheight;}/***设置Layer是否可见**@paramvisible*trueLayer可见,falseLayer不可见*/publicvoidsetVisible(booleanvisible){this.visible=visible;}/***检测Layer是否可见**@returntrueLayer可见,falseLayer不可见*/publicfinalbooleanisVisible(){returnvisible;}/***绘制Layer,必须被重载**@paramc*/publicabstractvoidpaint(Canvasc);/***设置Layer的宽度**@paramwidth*/voidsetWidthImpl(intwidth){if(width<0){thrownewIllegalArgumentException();}this.width=width;}/***设置Layer的高度**@paramheight*/voidsetHeightImpl(intheight){if(height<0){thrownewIllegalArgumentException();}this.height=height;}}Layer的代码不多,根据函数名称就可以知道它的功能,主要是Layer尺寸、位置的设定和获取。其中最重要的方法paint是虚方法,Layer图像就是通过这个方法显示出来的。因此继承自Layer的所有类都要实现这个方法。Sprite(精灵)继承自Layer,同时又增加了帧动画,图形变换和碰撞检测的功能。Sprite是我们这一章重点介绍的内容。首先让我们了解一...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

确认删除?