游戏开发不同于应用,一切都是自定义,所以对于控件什么的也没有什么好讲的,下面简单作一个案例,其实也是书本上的,最近在学习,顺便总结下.
首先我们要开发对象.Movable.java
package com.jj.ball;
import android.graphics.Bitmap;
import android.graphics.Canvas;
/***
* 小球对象
*
* @author zhangjia
*
*/
public class Moveable {
int startX = 0;// 初始X坐标
int startY = 0;// 初始Y坐标
int x;// 时时X,
int y;// 时时Y
float startVX = 0f;// 初始竖直方向的速度
float startVY = 0f;// 初始水平方向的速度
float v_x = 0f;// 时时竖直方向速度
float v_y = 0f;// 时时水平方向速度
int r;// 半径
double timeX;// 水平运动时间
double timeY;// 竖直运动时间
Bitmap bitmap = null;// 小球
BallThread bt = null;
boolean bFall = false;// 小球是否已经从木板下落
float impactFactor = 0.25f;// 小球撞地后速度的损失系数.
/***
* 构造方法
*
* @param x
* @param y
* @param r
* @param bitmap
*/
public Moveable(int x, int y, int r, Bitmap bitmap) {
super();
this.x = x;
this.startX = x;
this.startY = y;
this.y = y;
this.r = r;
this.bitmap = bitmap;
timeX = System.nanoTime();
this.v_x = BallView.V_MIN
+ (int) ((BallView.V_MAX - BallView.V_MIN) * Math.random());// 初始水平速度
bt = new BallThread(this);// 创建并启动BallThread
bt.start();
}
/***
* 绘画
*/
public void drawSelf(Canvas canvas) {
canvas.drawBitmap(bitmap, x, y, null);
}
}
这里面无外乎就是一些小球的属性,涉及到了BallThread物理引擎,下面接着介绍.
首先你要明白:
微妙,纳秒,秒之间的换算
微秒,时间单位,符号μs
1,000,000 微秒 = 1秒
纳秒,时间单位,符号ns
1,000,000,000纳秒=1秒
另外你要明白:一些物理公式:比如说如何求:竖直方向的距离,水平方向移动距离,以及移动过程中的水平,竖直的速度等等,这些都是我们高一的物理知识,虽说我们N年没有触碰过了,但是现在回忆起来还是瞒不错的.在这里我感慨一下:中国教育课程五花八门,真正现实中我们用得到的又有几个?NND,坑爹青春啊.
还有一点:就是小球在撞击地面和上升到最高处都是极端位置,然后再次进行运动的话,都是一次新的运动.不过想大家都明白的,只是我看后感慨游戏确实比应用好多了,起码逻辑思维是应用不能媲美的.
package com.jj.ball; /*** * 小球物理引擎 * * @author zhangjia * */ public class BallThread extends Thread { private Moveable moveable;// 小球对象 private boolean flag = false;// 线程标识 private int sleepSpan = 30;// 休眠时间 private float g = 200;// 重力加速度 private double currentTime;// 记录当前事件 /*** * 构造方法 * * @param moveable */ public BallThread(Moveable moveable) { super(); this.moveable = moveable; this.flag = true; } @Override public void run() { while (flag) { currentTime = System.nanoTime();// 获取当前时间,单位为纳秒 double timeSpanX = (double) ((currentTime - moveable.timeX) / 1000 / 1000 / 1000);// 获取从玩家开始到现在水平方向走过的时间 // 处理水平方向上的运动 moveable.x = (int) (moveable.startX + moveable.v_x * timeSpanX); // 处理竖直方向上的运动 if (moveable.bFall) { double timeSpanY = (double) ((currentTime - moveable.timeY) / 1000 / 1