package se.rhel.model.component; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.physics.bullet.collision.ClosestRayResultCallback; import com.badlogic.gdx.physics.bullet.collision.btCollisionObject; import com.badlogic.gdx.physics.bullet.collision.btCollisionWorld; /** * Created by rkh on 2014-04-27. */ public class GravityComponent implements IGravity, IComponent, IUpdateable { //RayCasts private ClosestRayResultCallback rayTestCB; private Vector3 fromBottom = new Vector3(); private Vector3 toGround = new Vector3(); private boolean mOnGround = false; private float mGravity = 0f; private float mGravityPower = 15f; private float mCastRayLength = 0.2f; private IPhysics mPhysics; private btCollisionWorld mCollisionWorld; public GravityComponent(btCollisionWorld collisionWorld, IPhysics physiccomponent, float gravityPower) { mCollisionWorld = collisionWorld; mPhysics = physiccomponent; mGravityPower = gravityPower; } private void checkOnGround(Vector3 bottomPosition) { mOnGround = false; //0.1f bias since bottom position can sometimes be "under" the ground and therefore never trigger a collision fromBottom.set(new Vector3(bottomPosition.x, bottomPosition.y + 0.1f, bottomPosition.z)); toGround.set(new Vector3(fromBottom.x, fromBottom.y - mCastRayLength, fromBottom.z)); ClosestRayResultCallback cb = new ClosestRayResultCallback(fromBottom, toGround); cb.setCollisionObject(null); mCollisionWorld.rayTest(fromBottom, toGround, cb); if(cb.hasHit()) { final btCollisionObject obj = cb.getCollisionObject(); if (obj.isStaticObject()) { mOnGround = true; } } } public void update(float delta) { mPhysics.getBody().setGravity(Vector3.Zero); checkOnGround(mPhysics.getBottomPosition()); if(!mOnGround) { mGravity -= mGravityPower * delta; } else { if (mGravity < -10) mGravity = -10; mGravity += mGravityPower * delta; if (mGravity > 0) mGravity = 0; } } public float getGravity() { return mGravity; } @Override public boolean isGrounded() { return mOnGround; } @Override public void setGravity(float gravity) { mGravity = gravity; } }