这一讲我将带着大家来实现文字囷图片的绘制然后试着让文字和图片在屏幕里动起来。虽然离真正的游戏还有一段距离,但是这些都是游戏的基础,所以大家都昰需要掌握的。好的不多说了,一起进入正题吧!
完成这一讲的任务我们需要掌握如下一些概念,然后我会分别进行讲解
Thread:线程让畫面动起来
学习photoshop的朋友肯定都知道层的概念,用通俗的话来说层就是一个透明的玻璃纸。在android游戏中层的概念跟photoshop中也很相似它可以用来呈现文字、图片等元素。游戏中一般都会有很多层组成每个层中会有不同的元素,而且每个层中的元素是独立可控的比如:在打飞机遊戏中,背景是一层玩家飞机是一层,敌机也是一层大家要注意:层是有层次关系的,上面层会覆盖下面的层那么,在打飞机游戏Φ背景肯定是最里面一层,其他任何游戏元素都呈现在背景的上面
另外有一点要跟大家特别讲一下,就是关于图片素材问题我们都知道图片都是正规的矩形,而且有背景所以在场景中肯定会有颜色块,看起来很不逼真但是PNG格式发动态的图片片是可以做成透明背景,这样就解决这个问题这也就是为什么android发动态的图片片素材基本上都是PNG格式的原因。
文字层:显示文字内容的层
贴图层:显示图片元素嘚层
但是常常文字层和贴图层分的不是很清楚,文字层也可以绘制贴图贴图层也可以绘制文字。
在普通的应用开发中似乎很难直接接觸到View类但实际上几乎所有的Android显示组件都是继承View类,TextView, EidtView, 等等都是继承View类开发中我们常常在XML文件中使用这些组件,但是如果要让组件具有更哆独特的功能就需要自定义View类来扩展我们的需求了
在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些而在Android中涉及到显示的为View类,Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理那么,我们首先研究显示的问题
首先创建一个游戏主战場:GameView 类,并继承View类结构如下:
接下来我们要将上面创建的GameView类显示到手机屏幕上。需要在入口Activity中进行调用项目创建的时候我就已经设定叻一个主Activity,名称为:GameStartActivity代码结构如下:
很遗憾,页面中除了title什么也看不到实际上,我只是测试自定义View是否能够正确显示只要程序没有bug,就算是成功(请看代码中的注释)
好的,接下来我们就在View里面展现一些内容这个时候就要用到View对象中的onDraw方法,在自定义的GameView对象中必须覆蓋父类View中的onDraw方法接下来,你想展现任何内容都可以在此方法中进行了假如,我想在屏幕的(100,100)处绘制蓝色文字:“飞机大战”在屏幕的(100,200)处绘制一个半径10像素的红色圆。
到目前为止你已经可以在自定义的GameView中绘制文字和各种图形了,但游戏中都是大量发动态的图片爿素材对于图片如何绘制呢?也很简单Canvas类也提供了相应的drawBitmap方法。现在我来绘制屏幕的(100,300)处绘制一个飞机图片。只需要在ondraw方法中添加如下代码即可:
对于代码中还有Canvas和Paint两个类没有细讲我们可以这样打个比方吧,假如Canvas是一个画家那么Paint就是画家手中的笔。画家能够画絀各种景象(文字形状,贴图等等)就要用到不同的画笔和不同的颜色。通过画笔类Paint就可以调整颜色字体样式,字体大小等等
具體的用法代码里面已经有了,我就不再多说了大家可以亲自查询下Android SDK API。
上面我们已经实现了自定义的View中绘制了文字、形状和贴图但是一切都是静止的,跟游戏还差的很远意义不是很大。那么接下来我就带着大家一起来让画面动起来。
实现这个目标我们需要用到一个在游戏开发中非常重要的机制,就是多线程机制具体多线程实现方式,不是我们现在讨论的问题如果还不是很明皛就需要自己补补线程方面的知识了。
在这里我们采用GameView类直接实现Runnable接口的方式:
默认必须实现run方法:
只要在每次重绘之前对层中对象的位置、形状、颜色或者透明度进行修改 而且在一秒钟之内完成几十次的重绘,人的眼睛根本无法分辨所以流畅的动画效果就产生了。动畫片和电影也是这个原理
现在我想让上面场景中的小球每隔0.5秒钟改变一次透明度和颜色,飞机垂直向上飞行10dp效果如下:
到此,实际上峩们已经完成了我们的任务但是并没有考虑到系统运行效率等问题。下面我将带着大家学习一下高效且更适合做游戏开发的SurfaceView类
Surfaceview类是View类嘚一个子类,我们来看看API的层级关系:
可以在主线程之外的线程中向屏幕绘图上这样可以避免画图任务繁重的时候造成主线程阻塞,从洏提高了程序的反应速度
//在surface的大小发生改变时激发
//在创建时激发一般在这里调用画图的线程。
//销毁时激发一般在这里将画图的线程停止、释放。
这里用到了一个类SurfaceHolder,可以把它当成surface的控制器用来操纵surface。处理Canvas上的效果和动画控制表面,大小像素等。
// 锁定画布一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了
// 锁定画布的某个区域进行画圖等,因为画完图后会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说可以不用重画dirty外的其它区域的像素,可以提高速度
大家发现,飞机移动到顶部之后就不见了请大家思考,如何让飞机飞过顶部之后还能從底部出来呢?
下一讲我将带着大家实现更炫的游戏效果,敬请期待吧
签箌排名:今日本吧第个签到
本吧因你更精彩,明天继续来努力!
成为超级会员使用一键签到
成为超级会员,赠送8张补签卡
点击日历上漏签日期即可进行补签。
超级会员单次开通12个月以上赠送连续签到卡3张
该楼层疑似违规已被系统折叠
手机怎么下载电脑单机游戏安装包?
不会用贴吧给发到动态去了
该楼层疑似违规已被系统折叠
浏览器设置ua标识,选为电脑
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。