views:

25

answers:

0

Hi,

I started off with the tutorial here and added drawing code for a view (covering the entire screen). The scene appears static and not dynamic even though I'm calling world.step(,). How does one make the scene dynamic and is my drawing the right implementation or is there a better way (using jBox2d functions)?

private class PhysicsView extends View {

        Paint mPaint;

        public PhysicsView(Context context) {
            super(context);
            mPaint = new Paint();
            mPaint.setColor(Color.BLUE);
            mPaint.setStyle(Style.FILL_AND_STROKE);
        }

        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            synchronized (canvas) {
                Body[] b = mWorld.bodies;
                for (int i = 0; i < b.length; i++) {
                    if (b[i] != null) {

                        Float mass = b[i].getMass();
                        Vec2 v = b[i].getPosition();
                        canvas.drawCircle(v.x, v.y, 15, mPaint);
                    }
                }
                Paint p2 = new Paint(mPaint);
                p2.setColor(Color.GREEN);
                Vec2 base = mWorld.groundBody.getPosition();
                canvas.drawRect(new RectF((float) base.x - 25.0f,
                        (float) base.y - 10.0f, (float) base.x + 25.0f,
                        (float) base.y + 10.0f), p2);

                canvas.drawLine(0.0f, 0.0f,
                        mWorld.world.getWorldAABB().upperBound.x, mWorld.world
                                .getWorldAABB().upperBound.y, p2);
            }
        }
    }


public class PhysicsWorld {

    public int targetFPS = 40;
    public int timeStep = (1000 / targetFPS);
    public int iterations = 5;

    public Body[] bodies = new Body[50];
    public Body groundBody;
    private int count = 0;

    private AABB worldAABB;
    public World world;
    private BodyDef groundBodyDef;
    private PolygonDef groundShapeDef;

    private Vec2 screenDimensions;

    public void create(Vec2 dimens) {

        screenDimensions = dimens;

        worldAABB = new AABB();
        worldAABB.lowerBound.set(new Vec2((float) -1*dimens.x, (float) -1*dimens.y));
        worldAABB.upperBound.set(new Vec2((float) dimens.x, (float) dimens.y));

        Vec2 gravity = new Vec2((float) 0.0, (float) 0.0);
        boolean doSleep = true;
        world = new World(worldAABB, gravity, doSleep);

        groundBodyDef = new BodyDef();
        groundBodyDef.position.set(new Vec2((float) dimens.x/2, (float) dimens.y - 10.0f));
        groundBody = world.createBody(groundBodyDef);
        groundBody.m_mass = 200.0f;

        groundShapeDef = new PolygonDef();
        groundShapeDef.setAsBox((float) 50.0, (float) 10.0);
        groundShapeDef.density = 1.0f;
        groundShapeDef.friction = 0.3f;
        groundBody.createShape(groundShapeDef);

    }

    public void addBall() {

        float x = (float) Math.random() * screenDimensions.x;
        float y = (float) Math.random() * screenDimensions.y;

        BodyDef bodyDef = new BodyDef();
        bodyDef.position.set(new Vec2((float) x, (float) y));
        bodyDef.massData.mass = 20.0f;
        bodies[count] = world.createBody(bodyDef);
        bodies[count].m_type = Body.e_dynamicType;
        bodies[count].m_linearVelocity = new Vec2(1.0f, 2.0f);

        CircleDef circle = new CircleDef();
        circle.radius = (float) 1.8;
        circle.density = (float) 1.0;
        circle.type = ShapeType.CIRCLE_SHAPE;

        bodies[count].createShape(circle);

        count++;
    }

    public void update() {
        world.step(timeStep, iterations);

    }

    public void changeGravity(Vec2 gravity) {
        world.setGravity(gravity);
    }
}