本文感谢鸿洋先生的博客
本文基于以上博客,利用鸿洋先生的创意改编而成。
正题,本例子想做到的效果:
1.不断上升的地板条
2.小人,踩到地板会跟着上升,否则自然下坠
3.小人上升过屏幕顶或者下降到屏幕底部外则判定为死亡,地板停止,小人自然下坠
最终效果截图:
本例子所用素材来自游戏:涂鸦跳跃
好了,开工。
1.首先,回顾下SurfaceView的一般用法,直接上鸿洋的干货
package com.zhy.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class GameFlabbyBird extends SurfaceView implements Callback, Runnable
{
private SurfaceHolder mHolder;
/**
* 与SurfaceHolder绑定的Canvas
*/
private Canvas mCanvas;
/**
* 用于绘制的线程
*/
private Thread t;
/**
* 线程的控制开关
*/
private boolean isRunning;
public GameFlabbyBird(Context context)
{
this(context, null);
}
public GameFlabbyBird(Context context, AttributeSet attrs)
{
super(context, attrs);
mHolder = getHolder();
mHolder.addCallback(this);
setZOrderOnTop(true);// 设置画布 背景透明
mHolder.setFormat(PixelFormat.TRANSLUCENT);
// 设置可获得焦点
setFocusable(true);
setFocusableInTouchMode(true);
// 设置常亮
this.setKeepScreenOn(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// 开启线程
isRunning = true;
t = new Thread(this);
t.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// 通知关闭线程
isRunning = false;
}
@Override
public void run()
{
while (isRunning)
{
long start = System.currentTimeMillis();
draw();
long end = System.currentTimeMillis();
try
{
if (end - start < 50)
{
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
private void draw()
{
try
{
// 获得canvas
mCanvas = mHolder.lockCanvas();
if (mCanvas != null)
{
// drawSomething..
}
} catch (Exception e)
{
} finally
{
if (mCanvas != null)
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}
SurfaceView的优点就在此,给予开发者很大的便利,可以直接开普通线程更改UI,
上面的关键就在继承SurfaceView,并拿到holder,在主线程中开一个循环线程,循环绘制得到的画布;
接下来干啥?当然要有背景
2.背景
这里我封装成了一个类,便于以后停止游戏等操作:
public class Background {
Bitmap bitmap;
RectF rectf;
int gameHeight;
int gameWidth;
public Background(Bitmap bitmap, RectF rectf) {
this.bitmap = bitmap;