我这边找个网上的案例改造了一下,结果动画都没了,只能看到静止的几个物体。想来想去不知道到底错在什么地方。悲剧了。请大家帮我看下我到底问题出在什么地方?
package xg.box2d.Test;
import java.util.ArrayList;
import org.jbox2d.collision.AABB;
import org.jbox2d.collision.CircleDef;
import org.jbox2d.collision.PolygonDef;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.World;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class Box2DTestActivity extends Activity {
private final static int RATE = 10;//屏幕到现实世界的比例 10px:1m;
private AABB worldAABB;//创建 一个管理碰撞的世界
private World world;
private float timeStep = 1/60;//模拟的的频率
private int iterations = 10;//迭代越大,模拟约精确,但性能越低
private ArrayList<Body> circleArray;
private ArrayList<Body> boxArray;
private float friction=0.8f;
private float restitution=0.3f;
private MyView myView;
private Handler mHandler;
private DisplayMetrics dm;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
WindowManager.LayoutParams. FLAG_FULLSCREEN);
dm=new DisplayMetrics();
boxArray=new ArrayList<Body>();
circleArray=new ArrayList<Body>();
createWorld();
createGroundBox();
createBody();
myView = new MyView(this);
setContentView(myView);
mHandler = new Handler();
mHandler.post(update);
}
private void createWorld() {
worldAABB = new AABB();
//上下界,以屏幕的左上方为 原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟
worldAABB.lowerBound.set(-100f,-100f);
worldAABB.upperBound.set(100f, 100f);//注意这里使用的是现实世界的单位
Vec2 gravity = new Vec2(0.0f,10.0f);
boolean doSleep = true;
world = new World(worldAABB, gravity, doSleep);//创建世界
} private void createGroundBox() {
PolygonDef shape = new PolygonDef();
shape.density = 0;
shape.friction = friction;
shape.restitution = restitution;
shape.setAsBox(160/RATE, 10/RATE);
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(160/RATE, 470/RATE);
Body body1= world.createBody(bodyDef);
body1.createShape(shape);
body1.setMassFromShapes();
}
private void createBody() {
createBox(160, 470, 160, 10, true);
createBox(160, 150, 160, 10, true);
createCircle(160, 100, 10);
createCircle(150, 60, 10);
} private Runnable update = new Runnable() {
public void run() {
world.step(timeStep, iterations);//开始模拟
myView.update();
mHandler.postDelayed(update, (long)timeStep*1000);
}
};
public void createCircle(float x,float y,float radius){
CircleDef shape = new CircleDef();
shape.density = 7;
shape.friction = 0.2f;
shape.radius = radius/RATE;
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x/RATE, y/RATE);
Body body2 = world.createBody(bodyDef);
body2.createShape(shape);
body2.setMassFromShapes();
circleArray.add(body2);
}
public void createBox(float x,float y,float half_width,float half_height,
boolean isStatic){
PolygonDef shape = new PolygonDef();
if(isStatic){shape.density = 7;}
else{shape.density = 2.0f;}
shape.friction = 0.3f;
shape.setAsBox(half_width/RATE, half_height/RATE);
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x/RATE, y/RATE);
Body body= world.createBody(bodyDef);
body.createShape(shape);
body.setMassFromShapes();
boxArray.add(body);
}
class MyView extends View{
Canvas canvas;
public MyView(Context context) {
super(context);
}
public void drawBox(){
Paint mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.RED);
for(int i=0;i<boxArray.size();i++){
Body bd=boxArray.get(i);
Vec2 vec=bd.getPosition();
canvas.drawRect(vec.x*RATE-20, vec.y*RATE-20, vec.x*RATE+20, vec.y*RATE+20, mPaint);
}
}
public void drawCircle(){
Paint mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.GREEN);
for(int i=0;i<circleArray.size();i++){
Body bd=circleArray.get(i);
Vec2 vec=bd.getPosition();
canvas.drawCircle(vec.x*RATE, vec.y*RATE,30, mPaint);
}
}
public void update(){
postInvalidate();
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.canvas = canvas;
drawBox();
drawCircle();
}
}
}
package xg.box2d.Test;
import java.util.ArrayList;
import org.jbox2d.collision.AABB;
import org.jbox2d.collision.CircleDef;
import org.jbox2d.collision.PolygonDef;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.World;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class Box2DTestActivity extends Activity {
private final static int RATE = 10;//屏幕到现实世界的比例 10px:1m;
private AABB worldAABB;//创建 一个管理碰撞的世界
private World world;
private float timeStep = 1/60;//模拟的的频率
private int iterations = 10;//迭代越大,模拟约精确,但性能越低
private ArrayList<Body> circleArray;
private ArrayList<Body> boxArray;
private float friction=0.8f;
private float restitution=0.3f;
private MyView myView;
private Handler mHandler;
private DisplayMetrics dm;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
WindowManager.LayoutParams. FLAG_FULLSCREEN);
dm=new DisplayMetrics();
boxArray=new ArrayList<Body>();
circleArray=new ArrayList<Body>();
createWorld();
createGroundBox();
createBody();
myView = new MyView(this);
setContentView(myView);
mHandler = new Handler();
mHandler.post(update);
}
private void createWorld() {
worldAABB = new AABB();
//上下界,以屏幕的左上方为 原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟
worldAABB.lowerBound.set(-100f,-100f);
worldAABB.upperBound.set(100f, 100f);//注意这里使用的是现实世界的单位
Vec2 gravity = new Vec2(0.0f,10.0f);
boolean doSleep = true;
world = new World(worldAABB, gravity, doSleep);//创建世界
} private void createGroundBox() {
PolygonDef shape = new PolygonDef();
shape.density = 0;
shape.friction = friction;
shape.restitution = restitution;
shape.setAsBox(160/RATE, 10/RATE);
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(160/RATE, 470/RATE);
Body body1= world.createBody(bodyDef);
body1.createShape(shape);
body1.setMassFromShapes();
}
private void createBody() {
createBox(160, 470, 160, 10, true);
createBox(160, 150, 160, 10, true);
createCircle(160, 100, 10);
createCircle(150, 60, 10);
} private Runnable update = new Runnable() {
public void run() {
world.step(timeStep, iterations);//开始模拟
myView.update();
mHandler.postDelayed(update, (long)timeStep*1000);
}
};
public void createCircle(float x,float y,float radius){
CircleDef shape = new CircleDef();
shape.density = 7;
shape.friction = 0.2f;
shape.radius = radius/RATE;
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x/RATE, y/RATE);
Body body2 = world.createBody(bodyDef);
body2.createShape(shape);
body2.setMassFromShapes();
circleArray.add(body2);
}
public void createBox(float x,float y,float half_width,float half_height,
boolean isStatic){
PolygonDef shape = new PolygonDef();
if(isStatic){shape.density = 7;}
else{shape.density = 2.0f;}
shape.friction = 0.3f;
shape.setAsBox(half_width/RATE, half_height/RATE);
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x/RATE, y/RATE);
Body body= world.createBody(bodyDef);
body.createShape(shape);
body.setMassFromShapes();
boxArray.add(body);
}
class MyView extends View{
Canvas canvas;
public MyView(Context context) {
super(context);
}
public void drawBox(){
Paint mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.RED);
for(int i=0;i<boxArray.size();i++){
Body bd=boxArray.get(i);
Vec2 vec=bd.getPosition();
canvas.drawRect(vec.x*RATE-20, vec.y*RATE-20, vec.x*RATE+20, vec.y*RATE+20, mPaint);
}
}
public void drawCircle(){
Paint mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.GREEN);
for(int i=0;i<circleArray.size();i++){
Body bd=circleArray.get(i);
Vec2 vec=bd.getPosition();
canvas.drawCircle(vec.x*RATE, vec.y*RATE,30, mPaint);
}
}
public void update(){
postInvalidate();
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.canvas = canvas;
drawBox();
drawCircle();
}
}
}
解决方案 »
- Android 如何把图片的rgb原始数据转为yuv原始数据
- android中关于webview播放网页视频的问题
- 做一个校园导航系统,有几个问题 求助高手
- 关于Android WIFI接受数据报问题。。。
- NDK编译cocosd-x下的adroid项目报错target pattern contains no '%'。 停止。
- android谷歌地图问题
- android图片轮放效果
- Android布局问题
- android 百度地图SDK使用 老是出错
- 求助关于OKHTTP3的问题
- 关于asp返回true或者false给android手机客户端的问题,客户端只用什么方法接受到返回的true或者false,请教!
- listview分页
否则timestep的值为0,当然无法循环出正确的结果。