android游戏之flabby bird(上)

1.写在前面的话:

一次无意中在csdn上找到一个资源《android高仿flappy bird源码》,下载下来运行一下,效果非常不错,再进去一看代码,乖乖,好东西啊,整个游戏的框架非常的nice,这其实是一个非常好的游戏框架,对于一般的游戏,我们都是可以直接使用噢。但是,唯一的遗憾是这位android高手,不知道为什么只有源码,没有好好的写一个博文详细的介绍一下自己的这个游戏。

2. flappy bird游戏效果:

3.flappy bird游戏的关键类:

1.游戏的一些工具类:

(1)FileManager类----此类主要是为了保存游戏的最高成绩

(2)SoundPlayer类----音乐播放类

(3)Constants类-------程序中的常量集合类,主要是处理一些不变的常量

(4)Config类-------------配置类,主要是程序中的一些可以配置的变量,这个非常重要,因为许多重要的配置参数,如游戏的渠道变量,都可以在这个类中配置。

2.游戏的基本元素的类:

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())

3. 游戏的场景类-----BaseView

flabby bird游戏的场景包括加载场景(LoadingView)主游戏场景(MainView),所有的场景都有场景基类(BaseView),下面详细介绍一下BaseView(后面会附源码):

对于游戏场景,第一个是游戏背景的比例缩放(scaleX,scaleY),这个主要是处理游戏背景。初始化图片的方法(initBitmap()),释放资源方法(release()),绘制场景的方法(drawSelf()),还有一个关键的线程(Thread)运行的方法(run())---此方法主要是线程执行动态操作。由于游戏场景类是继承自SurfaceView类,在surfaceCreated方法中,我们一般执行初始化和启动线程的操作,在surfaceDestroyed方法中,我们一般执行资源释放操作。

附1----GameObject类:

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;
	}
}

附2----BaseView类:

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;
	}
}

源码下载地址:

参考资料:

1. android高仿flappy bird源码

http://download.csdn.net/detail/qiang66666ok/7175747

时间: 2024-08-09 11:01:35

android游戏之flabby bird(上)的相关文章

Android SurfaceView实战 带你玩转flabby bird (上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Android SurfaceView实战 打造抽奖转盘 , 同属于SurfaceView系列,基本可以从这篇博文中学习到SurfaceView的用法,以及利用SurfaceView做抽奖转盘.但是其中缺少一部分的知识点,就是与用户交互时界面的改变,所以今天给大家再带来本篇博文教大家如何做flabby bir

Android SurfaceView实战 带你玩转flabby bird (下)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android SurfaceView实战 带你玩转flabby bird (上)中,我们完成了在游戏所需的所有的元素的绘制,包括 Bird鸟. Floor地板.Pipe 管道 .背景图以及分数等. 本篇博客将在上篇的基本上,继续带领大家向我们的目标进发,那么问题来了,我们的目标是: 就是这个效果图了. 首先我们明确下,当然

我的小游戏之2048

八月初心血来潮,花了一天时间写了一个控制台版的2048.代码很烂,玩到后面会有延迟现象.先做下记录,以后有时间把移动和合并的代码再优化下. 代码如下: 1 #include<iostream> 2 #include <iomanip> 3 #include<cstring> 4 #include<cstdlib> 5 #include<ctime> 6 using namespace std; 7 8 class Board { 9 public

狮城五日穷游攻略(上)

原文链接:http://chengyuanlaodao.com/chatter/狮城五日穷游攻略_上/ 前几天有个朋友来新加坡玩,让我帮他安排一下行程.他刚工作不久,预算不太充裕,所以帮他做了这篇穷游攻略.高富帅不差钱的请自觉点右上角的红叉叉. 首先列出最后的花销列表(两人),单位是软妹币:签证 300机票 3700 (酷航南京往返)住宿五晚 1200各类门票 1290 (包含环球影城 动物园 摩天轮 海洋馆 时光之翼)交通费+手机费+吃喝 1000 签证新加坡现在不允许个人游客自己去办旅游签证

Android:解决客户端从服务器上获取数据乱码的方法

向服务器发送HTTP请求,接收到的JSON包为response,用String content = EntityUtils.toString(response.getEntity(),"utf-8");解码还是出现了中文乱码,在后面加了 String name = new String(response.getBytes("iso-8859-1"), "UTF-8"); 也无济于事.想到服务器好像是用URLENCODER编了码的,怀着试一试的态度

android内存优化大全_上

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). 内存简介: RAM(random acc

Android数据库信息显示在listview上

Key Points: 1.使用SimpleCursorAdapter将Android数据库信息显示在listview上 adapter = new SimpleCursorAdapter(this, R.layout.user_list_cell, null, new String[]{"name","sex"}, new int[]{R.id.tvName, R.id.tvSex}); 2.长按listview弹出对话框删除信息.顺带学习了AlertDialog

Android百度地图 - 在地图上标注已知GPS纬度经度值的一个或一组覆盖物 - OPEN 开发经验库 - 360安全浏览器 8.1

首页   代码   文档   问答   资讯   经验   GitHub日报 登录   注册 www.open-open.com/libOPEN经验 投稿 全部经验分类  Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim C++ C# JSON Ruby Linux Nginx Docker 所有分类  >  开发语言与工具  >  移动开发  

Android电源管理简介(上)

文章转载自:http://blog.csdn.net/hzdysymbol/archive/2009/03/19/4004791.aspx Android Power Management 总体上来说Android的电源管理还是比较简单的, 主要就是通过锁和定时器来切换系统的状态,使系统的功耗降至最低,整个系统的电源管理架构图如下: (注该图来自Steve Guo) 接下来我们从Java应用层面, Android framework层面, Linux内核层面分别进行详细的讨论: 应用层的使用: