Ejemplo n.º 1
0
        private void CheckIfCollide()
        {
            var currentVec = Instance.GetLinearVelocity();

            if (currentVec.Length() - m_lastVelocity.Length() <= -6 ||
                MathExtension.Diff(Instance.GetAngle(), m_lastAngle) >= MathExtension.OneDeg * 3 ||
                TotalDistanceTraveled >= 15 && currentVec.Length() <= 1)
            {
                TargetedObject = Game.GetObjectsByArea(Instance.GetAABB())
                                 .Where(o => o.UniqueID != Instance.UniqueID && ScriptHelper.IsInteractiveObject(o))
                                 .FirstOrDefault();

                if (TargetedObject != null)
                {
                    m_timeElasped  = Game.TotalElapsedGameTime;
                    TargetedPlayer = ScriptHelper.CastPlayer(TargetedObject);

                    if (TargetedPlayer != null)
                    {
                        Instance.SetBodyType(BodyType.Static);
                        m_relPlayerPosition = TargetedPlayer.GetWorldPosition() - Instance.GetWorldPosition();
                    }
                    else
                    {
                        m_weldJoint = (IObjectWeldJoint)Game.CreateObject("WeldJoint");
                        m_weldJoint.SetWorldPosition(Instance.GetWorldPosition());
                        m_weldJoint.SetTargetObjects(new List <IObject>()
                        {
                            Instance, TargetedObject
                        });
                    }
                }
            }

            m_lastVelocity = currentVec;
            m_lastAngle    = Instance.GetAngle();
        }
Ejemplo n.º 2
0
        protected override void Update(float elapsed)
        {
            base.Update(elapsed);

            if (TargetedObject == null)
            {
                CheckIfCollide();
            }

            if (TargetedObject != null)
            {
                Game.DrawArea(TargetedObject.GetAABB(), Color.Red);
            }
            if (TargetedPlayer != null)
            {
                if (TargetedPlayer.IsOnGround)
                {
                    if (m_weldJoint != null)
                    {
                        Instance.SetBodyType(BodyType.Static);
                        m_weldJoint.Remove();
                        m_weldJoint = null;
                    }

                    if (TargetedPlayer.IsCrouching)
                    {
                        Instance.SetWorldPosition(TargetedPlayer.GetWorldPosition() - m_relPlayerPosition - Vector2.UnitY * 5);
                    }
                    else if (TargetedPlayer.IsRolling)
                    {
                        Instance.SetWorldPosition(TargetedPlayer.GetAABB().Center);
                    }
                    else
                    {
                        Instance.SetWorldPosition(TargetedPlayer.GetWorldPosition() - m_relPlayerPosition);
                    }
                }
                else if (TargetedPlayer.IsInMidAir) // cannot track position accurately when player is in mid air
                {
                    if (m_weldJoint == null)
                    {
                        Instance.SetBodyType(BodyType.Dynamic);
                        m_weldJoint = (IObjectWeldJoint)Game.CreateObject("WeldJoint");
                        m_weldJoint.SetWorldPosition(Instance.GetWorldPosition());
                        m_weldJoint.SetTargetObjects(new List <IObject>()
                        {
                            Instance, TargetedPlayer
                        });
                    }
                }
            }

            if (m_timeElasped != 0 && ScriptHelper.IsElapsed(m_timeElasped, 2000))
            {
                if (m_weldJoint != null)
                {
                    m_weldJoint.Remove();
                }
                DealExplosionDamage();
                Instance.Destroy();
            }
        }