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(); }
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(); } }