一次无意中在csdn上找到一个资源《android高仿flappy bird源码》,下载下来运行一下,效果非常不错,再进去一看代码,乖乖,好东西啊,整个游戏的框架非常的nice,这其实是一个非常好的游戏框架,对于一般的游戏,我们都是可以直接使用噢。但是,唯一的遗憾是这位android高手,不知道为什么只有源码,没有好好的写一个博文详细的介绍一下自己的这个游戏。
(1)FileManager类----此类主要是为了保存游戏的最高成绩
(2)SoundPlayer类----音乐播放类
(3)Constants类-------程序中的常量集合类,主要是处理一些不变的常量
(4)Config类-------------配置类,主要是程序中的一些可以配置的变量,这个非常重要,因为许多重要的配置参数,如游戏的渠道变量,都可以在这个类中配置。
flabby bird游戏的基本元素包括地板(Ground),小鸟(Bird),障碍物(Column)。他们都有一个基类(GameObject),下面详细介绍一下GameObject(后面会附源码):
对下游戏元素,首先是他的宽(obj_width),高(obj_height),显示位置(obj_x,obj_y,obj_mid_x,obj_mid_y),对于带有动画的元素,还有一个参数就是当前图片(currentFrame),初始化图片的方法(initBitmap()),释放资源方法(release()),显示自己的方法(drawSelf(Canvas canvas)),还有一个关键的动态步进改变的方法(step())。
flabby bird游戏的场景包括加载场景(LoadingView)和主游戏场景(MainView),所有的场景都有场景基类(BaseView),下面详细介绍一下BaseView(后面会附源码):
对于游戏场景,第一个是游戏背景的比例缩放(scaleX,scaleY),这个主要是处理游戏背景。初始化图片的方法(initBitmap()),释放资源方法(release()),绘制场景的方法(drawSelf()),还有一个关键的线程(Thread)运行的方法(run())---此方法主要是线程执行动态操作。由于游戏场景类是继承自SurfaceView类,在surfaceCreated方法中,我们一般执行初始化和启动线程的操作,在surfaceDestroyed方法中,我们一般执行资源释放操作。
import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; public abstract class GameObject { protected int currentFrame;//当前动画帧 protected float obj_x;//对象左上角坐标 protected float obj_y; protected float obj_mid_x;//对象中心横坐标 protected float obj_mid_y;//对象中心纵坐标 protected float obj_width;//对象宽度 protected float obj_height;//对象高度 protected Resources resources; protected Paint paint; public GameObject(Resources resources) { this.resources = resources; paint = new Paint(); } //对象运动逻辑 public abstract void step(); //绘图方法 public abstract void drawSelf(Canvas canvas); //初始化如片资源 public abstract void initBitmap(); //释放图片资源 public abstract void release(); public void setObjX(float x) { this.obj_x = x; } public float getObjX() { return this.obj_x; } public void setObjY(float y) { this.obj_y = y; } public float getObjY() { return this.obj_y; } public void setObjMidX(float x) { this.obj_mid_x = x; } public float getObjMidX() { return this.obj_mid_x; } public void setObjMidY(float y) { this.obj_mid_y = y; } public float getObjMidY() { return this.obj_mid_y; } public void setObjWidth(float w) { this.obj_width = w; } public float getObjWidth() { return this.obj_width; } public void setObjHeight(float h) { this.obj_height = h; } public float getObjHeight() { return this.obj_height; } }
import liqiang.flybird.MainActivity; import liqiang.flybird.config.Constants; import liqiang.flybird.util.SoundPlayer; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; public class BaseView extends SurfaceView implements Callback, Runnable { protected float scaleX;//背景图片缩放比例 protected float scaleY; protected MainActivity mainActivity; protected SoundPlayer soundPlayer; protected Canvas canvas;//画布对象 protected Paint paint;//画笔对象 protected SurfaceHolder sfh; protected Thread thread;//绘画线程 protected boolean threadFlag;//标记线程运行 //构造函数 public BaseView(Context context, SoundPlayer soundPlayer) { super(context); this.mainActivity = (MainActivity) context; this.soundPlayer = soundPlayer; this.sfh = this.getHolder(); this.sfh.addCallback(this); this.paint = new Paint(); } //线程运行的方法 @Override public void run() {} //初始化图片资源 public void initBitmap() {} //释放图片资源 public void release() {} //绘图方法 public void drawSelf() {} //视图改变的方法 @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {} //视图创建的方法 @Override public void surfaceCreated(SurfaceHolder arg0) { Constants.SCREEN_WIDTH = this.getWidth(); Constants.SCREEN_HEIGHT = this.getHeight(); this.threadFlag = true; } //视图销毁的方法 @Override public void surfaceDestroyed(SurfaceHolder arg0) { this.threadFlag = false; } public void setThreadFlag(boolean threadFlag) { this.threadFlag = threadFlag; } }
http://download.csdn.net/detail/qiang66666ok/7175747
原文地址:http://blog.csdn.net/hfreeman2008/article/details/43231709