- 3
- 0
- 约 15页
- 2016-08-15 发布于重庆
- 举报
Andriod游戏开发第七章精灵帧动画与碰撞检测
从零开始Android游戏编程(第二版) 第七章 精灵、帧动画与碰撞检测 收藏第七章 精灵、帧动画与碰撞检测经过前几章的学习,大 家对使用位图、接受用户控制应该已经有了初步的概念,也可以运用这些知识完成简单的小游戏。这一章中,我们会为游戏中最重要的部分——图形处理建立一个基 本的框架,这还不是游戏引擎,但是其中很多方法可以为读者以后创建自己的游戏引擎提供借鉴。这一章的涉及的内容比较多,既有2D游戏的基础理论,又有复杂 的代码。尤其是代码部分,如果详细讲解,恐怕会占用很大的篇幅。所以我们只对关键的函数进行讲解,以方便读者今后灵活运用这些代码(所有的源代码都与本章 节内容一同提供下载)。这个框架是完全依照MIDP中javax.microedition.lcdui.game包设计的:Classes GameCanvasLayerLayerManagerSpriteTiledLayergame 包中有5个类,其中Layer(层)是一个抽象类,对图形显示作了基本的定义。以我们的目标游戏《坦克大战》为例,在游戏中有这样一些图形元素:我方和敌 方的坦克、坦克发出的子弹、地面、墙体、水域掩体等。这些元素虽然外观不同,但是本质上却非常相似:都是在特定位置以特定尺寸显示一个或一组位图,有些位 图位置还会变动,Layer就定义了位置,尺寸,显示等相关的功能。之所以叫做Layer,与游戏中分层地图的概念有关,先让我们了解一下什么是分层地图:还是说坦克大战,当我们的坦克行驶在普通地面上时,坦克的图像肯定是覆盖了地面的图像,这样我们能看到坦克。当坦克行驶到掩体时,我们会发现,掩体的图像覆盖了坦克的图像,如图所示:实 际上,我们在程序中,只要首先显示地面的图像,然后显示坦克的图像,最后显示掩体的图像(掩体图片是镂空的),就能达到这种效果,这就是分层地图。通常我 们把最下面的叫做地面层,中间的叫做物件层,最上面的叫做天空层。关于地图我们就讲这么多,这里只介绍图形意义上的分层,是为了帮助大家理解Layer一 词的意义。关于地图的详细内容我们在第十章会深入讲解。首先让我们看一下抽象类Layer的定义:package mon;import android.graphics.Canvas;publicabstractclass Layer {int x = 0; // Layer的横坐标int y = 0; // Layer的纵坐标int width = 0; // Layer的宽度int height = 0; // Layer的高度boolean visible = true; // Layer是否可见Layer(int width, int height) {setWidthImpl(width);setHeightImpl(height);}/*** 设定Layer的显示位置* * @param x* 横坐标* @param y* 纵坐标*/publicvoid setPosition(int x, int y) {this.x = x;this.y = y;}/*** 相对于当前的位置移动Layer* * @param dx* 横坐标变化量* @param dy* 纵坐标变化量*/publicvoid move(int dx, int dy) {x += dx;y += dy;}/*** 取得Layer的横坐标* * @return 横坐标值*/publicfinalint getX() {return x;}/*** 取得Layer的纵坐标* * @return 纵坐标值*/publicfinalint getY() {return y;}/*** 取得Layer的宽度* * @return 宽度值*/publicfinalint getWidth() {return width;}/*** 取得Layer的高度* * @return 高度值*/publicfinalint getHeight() {return height;}/*** 设置Layer是否可见* * @param visible* true Layer可见,false Layer不可见*/publicvoid setVisible(boolean visible) {this.visible = visible;}/*** 检测Layer是否可见* * @return true Layer可见,false Layer不可见*/publicfinalboolean isVisible() {return visible;}/*** 绘制Layer,必须被重载* * @param c*/publicabstractvoid paint(Canvas c);/*** 设置Layer的宽度*
原创力文档

文档评论(0)