Exemplo n.º 1
0
        public override void Update()
        {
            base.Update();

            // Static bodies need not update any of their physics, as they are immune to all forces
            if (!flagBodyType.HasFlag(PhysicsEngine.BodyType.STATIC))
            {
                velocity_last = velocity;
                position_last = transform.parent.Position;

                // If a body has been established to operate according to world forces
                if (flagBodyType.HasFlag(PhysicsEngine.BodyType.WORLDFORCE))
                {
                    force += PhysicsEngine.PhysicsSettings.WORLD_FORCE;
                }

                // Simple bodies do not have no rotational motion
                if (!flagBodyType.HasFlag(PhysicsEngine.BodyType.SIMPLE))
                {
                    // TODO Implement Rotational Motion
                }

                // Use of mass_i saves having to do the more expensive / operator, in favour of doing it once whenever mass is set/changed
                acceleration = force * mass_i;
                // TODO Implement Verlet Integration technique for motion (mabs)
                velocity = velocity + 0.5f * acceleration * Time.DeltaTime * Time.DeltaTime;
                transform.parent.Position += velocity;

                force = Vector3.Zero;

                PhysicsEngine.AddPhysicsBody(this);
            }

            List <PhysicsBody2D> collisionTests = PhysicsEngine.GetCollisionPass(this);

            List <PhysicsBody2D> checkedAlready = new List <PhysicsBody2D>();

            foreach (PhysicsBody2D collider in collisionTests)
            {
                if (!checkedAlready.Contains(collider) && collider != this)
                {
                    Collision2D possibleCollision = Collision2D.Evaluate(this, collider);
                    if (possibleCollision != null && !collisions.Contains(possibleCollision))
                    {
                        collisions.Add(possibleCollision);
                        collider.collisions.Add(possibleCollision);
                    }

                    checkedAlready.Add(collider);
                }
            }

            foreach (Collision2D collision in collisions)
            {
                if (collision.BodyA == this)
                {
                    collision.Resolve();
                }
            }

            foreach (Collision2D collision in collisions_dead)
            {
                collisions.Remove(collision);
            }

            collisions_dead = new List <Collision2D>();
        }