示例#1
0
  /** Thread for simulation */
  @Override
  public void run() {
    final ArrayList<PhysicBody> bodies = mOnSceneBodies;
    long lastTime = System.currentTimeMillis();
    long time;
    final Vector2D force = new Vector2D();

    for (; !mDoKill; ) {
      try {
        mSimulationMutex.acquire();
      } catch (InterruptedException e2) {
        e2.printStackTrace();
      }

      /* Compute time */
      time = System.currentTimeMillis() - lastTime;
      lastTime = System.currentTimeMillis();

      /* We need a semaphore here */
      try {
        mLockOnSceneBodys.acquire();
      } catch (InterruptedException e1) {
        e1.printStackTrace();
      }
      /* Apply gravity impulse */
      for (PhysicBody body : bodies) {
        force.set(mGravity);
        body.applyImpulse(force.mul(body.getBodyMass() * (float) time / 1000f));
      }
      mLockOnSceneBodys.release();

      /* Then apply collisions forces */
      mArbiter.checkCollisions();

      try {
        mLockOnSceneBodys.acquire();
      } catch (InterruptedException e1) {
        e1.printStackTrace();
      }
      /* Last update body */
      for (PhysicBody body : bodies) body.onUpdateBody((float) time / 1000f);

      mLockOnSceneBodys.release();

      mSimulationMutex.release();
      /* Keep max frame-rate */
      try {
        if (time < 40) Thread.sleep(40 - time);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    mDoKill = false;
  }
示例#2
0
 /**
  * Adds physical object
  *
  * @param object object to be added
  */
 public void add(final PhysicBody body) {
   try {
     mLockOnSceneBodys.acquire();
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
   mOnSceneBodies.add(body);
   mArbiter.add(body.getCollider());
   mLockOnSceneBodys.release();
 }
示例#3
0
 public boolean remove(final PhysicBody body) {
   try {
     mLockOnSceneBodys.acquire();
   } catch (InterruptedException e) {
     e.printStackTrace();
   }
   boolean removed = mOnSceneBodies.remove(body);
   mLockOnSceneBodys.release();
   removed &= mArbiter.remove(body.getCollider());
   return removed;
 }