box2d吧 关注:69贴子:295
  • 2回复贴,共1
这不科学→_→


IP属地:江苏来自Android客户端1楼2015-06-04 21:16回复
    package com.tianyun.myworld;
    import org.jbox2d.collision.AABB;
    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.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.util.Log;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.SurfaceHolder.Callback;
    public class MySurfaceView extends SurfaceView implements Callback, Runnable {
    private Thread th;
    private SurfaceHolder sfh;
    private Canvas canvas;
    private Paint paint;
    private boolean flag;
    // ---添加物理世界----->>
    final float RATE = 30;
    World world;
    AABB aabb;
    Vec2 gravity;
    float timeStep = 1f / 60f;
    final int iterations = 10;
    // ----在物理世界中添加一个多边形--->>
    Body body;// 声明物体对象
    float polygonX = 5;// 声明矩形X坐标
    float polygonY = 10;// 声明矩形Y坐标
    float polygonWidth = 50;// 声明矩形宽度
    float polygonHeight = 50;// 声明矩形高度
    // ----在物理世界中添加一个多边形--->>
    Body body2;// 声明物体对象
    float polygonX2 = 5;// 声明矩形X坐标
    float polygonY2 = 800;// 声明矩形Y坐标
    float polygonWidth2 = 50;// 声明矩形宽度
    float polygonHeight2 = 50;// 声明矩形高度
    public MySurfaceView(Context context) {
    super(context);
    this.setKeepScreenOn(true);
    sfh = this.getHolder();
    sfh.addCallback(this);
    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setStyle(Style.STROKE);
    setFocusable(true);
    // ---添加物理世界-->>
    aabb = new AABB();
    gravity = new Vec2(0f, 10f);
    aabb.lowerBound.set(-1000f, -1000f);
    aabb.upperBound.set(1000f, 1000f);
    world = new World(aabb, gravity, true);
    // ----在物理世界中添加一个多边形--->>
    body = createPolygon(polygonX, polygonY, polygonWidth, polygonHeight,
    false);// 创建一个多边形
    // ----在物理世界中添加一个多边形--->>
    body2 = createPolygon(polygonX2, polygonY2, polygonWidth2,
    polygonHeight2, true);// 创建一个多边形
    }
    public void surfaceCreated(SurfaceHolder holder) {
    flag = true;
    th = new Thread(this);
    th.start();
    }
    public Body createPolygon(float x, float y, float width, float height,
    boolean isStatic) {
    // ---创建多边形皮肤
    PolygonDef pd = new PolygonDef(); // 实例一个多边形的皮肤
    if (isStatic) {
    pd.density = 0; // 设置多边形为静态
    } else {
    pd.density = 1; // 设置多边形的质量
    }
    pd.friction = 0.8f; // 设置多边形的摩擦力
    pd.restitution = 0.3f; // 设置多边形的恢复力
    // 设置多边形快捷成盒子(矩形)
    // 两个参数为多边形宽高的一半
    pd.setAsBox(width / 2 / RATE, height / 2 / RATE);
    // ---创建刚体
    BodyDef bd = new BodyDef(); // 实例一个刚体对象
    bd.position.set((x + width / 2) / RATE, (y + height / 2) / RATE);// 设置刚体的坐标
    // ---创建Body(物体)
    Body body = world.createBody(bd); // 物理世界创建物体
    body.createShape(pd); // 为Body添加皮肤
    body.setMassFromShapes(); // 将整个物体计算打包
    return body;
    }
    public void myDraw() {
    try {
    canvas = sfh.lockCanvas();
    if (canvas != null) {
    canvas.drawColor(Color.WHITE);
    canvas.drawRect(polygonX, polygonY, polygonX + polygonWidth,
    polygonY + polygonHeight, paint);// 绘画矩形
    canvas.drawRect(polygonX2, polygonY2,
    polygonX2 + polygonWidth2, polygonY2 + polygonHeight2,
    paint);// 绘画矩形
    }
    } catch (Exception e) {
    Log.e("Himi", "myDraw is Error!");
    } finally {
    if (canvas != null)
    sfh.unlockCanvasAndPost(canvas);
    }
    }
    public void Logic() {
    // ----物理世界进行模拟
    world.step(timeStep, iterations);
    Vec2 position = body.getPosition();
    polygonX = position.x * RATE - polygonWidth / 2;
    polygonY = position.y * RATE - polygonHeight / 2;
    Vec2 position2 = body2.getPosition();
    polygonX2 = position2.x * RATE - polygonWidth2 / 2;
    polygonY2 = position2.y * RATE - polygonHeight2 / 2;
    }
    public void run() {
    while (flag) {
    myDraw();
    Logic();
    try {
    Thread.sleep((long) timeStep * 1000);
    } catch (Exception ex) {
    Log.e("Himi", "Thread is Error!");
    }
    }
    }
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
    }
    public void surfaceDestroyed(SurfaceHolder holder) {
    flag = false;
    }
    }


    IP属地:江苏来自Android客户端2楼2015-06-04 21:16
    回复

      ====祝top gear早日回归====


      来自Android客户端3楼2015-06-06 19:24
      回复