package com.tszy.jbox2d.testbed.framework;
import org.jbox2d.callbacks.DebugDraw;
import org.jbox2d.callbacks.QueryCallback;
import org.jbox2d.collision.AABB;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.BodyType;
import org.jbox2d.dynamics.Fixture;
import org.jbox2d.dynamics.World;
import org.jbox2d.dynamics.joints.Joint;
import org.jbox2d.dynamics.joints.MouseJoint;
import org.jbox2d.dynamics.joints.MouseJointDef;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
/**
* 测试基类
*
* @author JianbinZhu
*
*/
public abstract class TestbedView extends SurfaceView implements Callback, Runnable {
public static final int GAME_HEART = 1000 / 30; // 每秒刷新30次
public static final float RATE = 30.0f; // 比例尺
public static int screenW, screenH;
private Thread thread;
private SurfaceHolder holder;
protected Paint paint;
protected World world;
protected MouseJointDef mouseJointDef;
protected MouseJoint mouseJoint;
protected Body m_ground;
private MyDebugDraw debugDraw; //调试绘图
private float dt = 1.0f/30.0f; //模拟频率
private int velIter = 8; //速度迭代次数
private int posIter = 3; //位置迭代次数
public TestbedView(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}
/////////////////////////////////////////////////////////////////////////
private void init() {
holder = getHolder();
holder.addCallback(this);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);// 无锯齿
paint.setStyle(Style.FILL); // 填充样式
paint.setTextSize(12); // 字体大小
}
private void initWorld() {
Vec2 gravity = new Vec2(0, -10f);
world = new World(gravity, true);
BodyDef bodyDef = new BodyDef();
m_ground = world.createBody(bodyDef);
mouseJointDef = new MouseJointDef();
debugDraw = new MyDebugDraw(this);//DebugDraw.e_aabbBit |
debugDraw.setFlags( DebugDraw.e_shapeBit
| DebugDraw.e_jointBit
| DebugDraw.e_centerOfMassBit);
world.setDebugDraw(debugDraw);
}
private void destoryWorld(){
Body body = world.getBodyList();
for(int i=0; i<world.getBodyCount(); ++i){
if(body != null)
world.destroyBody(body);
body = body.getNext();
}
Joint joint = world.getJointList();
for(int i=0; i<world.getJointCount(); ++i){
if(joint != null)
world.destroyJoint(joint);
joint = joint.getNext();
}
world = null;
debugDraw = null;
mouseJointDef = null;
m_ground = null;
}
public World getWorld() {
return world;
}
////////////////////////////////////////////////////////////////////////////////
/**
* 执行游戏逻辑方法
*/
public void _update() {
world.step(dt, velIter, posIter);
}
private Rect rect = new Rect();
public void drawDeclare(Canvas canvas) {
String text = "天使之翼的示例Demo";
// 获取文本宽高
paint.getTextBounds(text, 0, text.length(), rect);
// 在屏幕中央位置显示文本
paint.setColor(0xfff000f0); // 注意最高两位 ff 代表画笔透明度,不设置的画就是完全透明了,看不到任何效果
canvas.drawText(text,
(screenW - rect.width()) / 2, screenH / 2 + rect.height() / 2,
paint);
}
/**
* 设置画笔颜色
* @param color
*/
public void setColor(int color) {
int red = (color & 0xff0000) >> 16;
int green = (color & 0x00ff00) >> 8;
int blue = (color & 0x0000ff);
paint.setColor(Color.rgb(red, green, blue));
}
/**
* 绘制FPS
* @param canvas
*/
private void drawFPS(Canvas canvas) {
setColor(0x00ff00);
if (useTime > 0){
canvas.drawText("FPS:" + (1000 / useTime),
3, 3 + paint.getTextSize(),
paint);
}
}
/**
* BOX2D 调试绘图
* @param canvas
*/
public void worldDraw(Canvas canvas) {
debugDraw.draw(canvas);
world.drawDebugData();
}
/**
* 画鼠标关节
*/
private Vec2 v1 = new Vec2();
private Vec2 v2 = new Vec2();
private void mouseJointDraw(Canvas canvas) {
// 画鼠标关节
if (mouseJoint != null) {
paint.setColor(0xff00ff00);
mouseJoint.getAnchorA(v1);
//转换成视角中的位置
debugDraw.getWorldToScreenToOut(v1, v1);
mouseJoint.getAnchorB(v2);
//转换成视角中的位置
debugDraw.getWorldToScreenToOut(v2, v2);
canvas.drawLine(v1.x, v1.y, v2.x, v2.y, paint);
}
}
/**
* 执行游戏绘制
*/
public void _draw(Canvas canvas) {
canvas.drawColor(Color.BLACK);
worldDraw(canvas);
mouseJointDraw(canvas);
drawFPS(canvas);
//drawDeclare(canvas);
}
public abstract void initTest();
public abstract String getName();
////////////////////////////////////////////////////////////////////////////////
/**
* 世界位置转为屏幕位置
* @param p
* @return
*/
public static Vec2 world2Scn(Vec2 p) {
Vec2 out = new Vec2();
world2ScnOut(p, out);
return out;
}
public static void world2ScnOut(Vec2 p, Vec2 out) {
out.set(p.x*RATE, p.y*RATE);
}
/**
* 屏幕位置转为世界位置
* @param p
* @return
*/
public static Vec2 scn2wrold(Vec2 p) {
Vec2 out = new Vec2();
scn2wroldOut(p, out);
return out;
}
public static void scn2wroldOut(Vec2 p, Vec2 out) {
out.set(p.x/RATE, p.y/RATE);
}
///////////////////////////////////////////////////////////////////////////////
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
boolean b = false;
b = mouseJointEvent(event);
if(!b)
b = debugDraw.onTouchEvent(event);
if(!b)
return super.onTouchEvent(event);
return b;
}
//点击查询
private final AABB queryAABB = new AABB();
private final TestQueryCallback callback = new TestQueryCallback();
private Body mouseDragBody; //当前鼠标拽住的物体
private final Vec2 mouseDownPoint = new Vec2(0, 0);
private boolean mouseJointEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
// mouseDownPoint.set(event.getX(), event.getY());
// scn2wroldOut(mouseDownPoint, mouseDownPoint);
//视角中的位置
debugDraw.getScreenToWorldToOut(x, y, mouseDownPoint);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN : {
if (mouseJoint != null) {
world.destroyJoint(mouseJoint);
mouseJoint = null;
mouseDragBody = null;
}
//得转化为在世界中的位置,因为点击的位置只是看到的相对位置而已
queryAABB.lowerBound.set(mouseDownPoint.x - 3/RATE, mouseDownPoint.y - 3/RATE);
queryAABB.upperBound.set(mouseDownPoint.x + 3/RATE, mouseDownPoint.y + 3/RATE);
world.queryAABB(callback, queryAABB);
if (mouseDragBody != null) {
mouseJointDef.bodyA = m_ground;
mouseJointDef.bodyB = mouseDragBody;
mouseJointDef.target.set(mouseDownPoint); // 目的点
mouseJointDef.maxForce = 1000f * mouseDragBody.getMass(); // 最大拉力
mouseJoint = (MouseJoint) world.createJoint(mouseJointDef); // 鼠标关节
mouseDragBody.setAwake(true); // 唤醒body
return true;
}
break;
}
case MotionEvent.ACTION_MOVE : {
if (mouseJoint != null) {
mouseJoint.setTarget(mouseDownPoint);
return true;
}
break;
}
case MotionEvent.ACTION_UP : {
if (mouseJoint != null) {
world.destroyJoint(mouseJoint);
mouseJoint = null;
mouseDragBody = null;
return true;
}
break;
}
}
return false;
}
//查询回调
class TestQueryCallback implements QueryCallback {
/**
* 报告查询结果,返回false终止查询
*/
@Override
public boolean reportFixture(Fi
没有合适的资源?快使用搜索试试~ 我知道了~
Android移植Jbox2D testbed
共47个文件
class:18个
java:10个
png:6个
5星 · 超过95%的资源 需积分: 9 16 下载量 198 浏览量
2012-05-06
14:45:37
上传
评论
收藏 504KB ZIP 举报
温馨提示
本项目是移植java版 jbox2d 测试项目到android平台上的完整源码,我实现了其中四个比较典型的例子,其他的暂时没做。 大家可以通过此案例掌握 box2d DebugDraw 用法 及box2d 各种入门提高
资源推荐
资源详情
资源评论
收起资源包目录
Jbox2DTestbed.zip (47个子文件)
Jbox2DTestbed
.project 849B
project.properties 361B
proguard.cfg 1KB
src
com
tszy
jbox2d
testbed
Jbox2DTestbedActivity.java 3KB
TestActivity.java 1KB
tests
VaryingRestitution.java 2KB
Domino.java 2KB
VaryingFriction.java 3KB
SliderCrankTest.java 3KB
framework
MyDebugDraw.java 6KB
TestbedView.java 10KB
AndroidManifest.xml 962B
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 3KB
layout
list_item.xml 349B
main.xml 484B
values
strings.xml 192B
assets
gen
com
tszy
jbox2d
testbed
BuildConfig.java 165B
R.java 860B
libs
JBox2d4Android_2.1.2.jar 217KB
.classpath 364B
bin
resources.ap_ 12KB
Jbox2DTestbed.apk 122KB
classes
com
tszy
jbox2d
testbed
R$layout.class 442B
BuildConfig.class 355B
R$drawable.class 422B
R$attr.class 355B
Jbox2DTestbedActivity.class 1KB
TestActivity.class 2KB
R$id.class 435B
Jbox2DTestbedActivity$MyAdapter.class 2KB
R.class 566B
R$string.class 442B
tests
SliderCrankTest.class 3KB
VaryingFriction.class 3KB
VaryingRestitution.class 2KB
Domino.class 2KB
framework
TestbedView$TestQueryCallback.class 2KB
TestbedView.class 10KB
MyDebugDraw.class 7KB
Jbox2DTestbedActivity$1.class 2KB
jarlist.cache 119B
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 3KB
classes.dex 251KB
共 47 条
- 1
资源评论
- hadi_ran2014-09-28非常棒,希望有空再把car例子改一下。
天使之翼
- 粉丝: 152
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功