android 游戏开发之物理小球的应用

游戏开发不同于应用,一切都是自定义,所以对于控件什么的也没有什么好讲的,下面简单作一个案例,其实也是书本上的,最近在学习,顺便总结下.

首先我们要开发对象.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
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值