Note that there are some explanatory texts on larger screens.

plurals
  1. POjBox2d android drawing dynamic bodies
    text
    copied!<p>I started off with the tutorial <a href="http://www.4feets.com/2009/03/2d-physics-on-android-using-box2d/" rel="nofollow">here</a> 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)?</p> <pre><code>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 &lt; 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); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload