public override void Update(float elapsed) { base.Update(elapsed); if (Owner.IsManualAiming) { var holdPosition = GetHoldPosition(true); m_invisibleMagnet.SetWorldPosition(holdPosition); // m_invisibleMagnet is a static object so the corresponding TargetObjectJoint need to be moved manually too m_magnetJoint.SetWorldPosition(holdPosition); if (TargetedObject != null) { TryStabilizeTargetedObject(holdPosition); } if (Game.IsEditorTest) { var scanLine = GetScanLine(); Game.DrawLine(scanLine[0], scanLine[1]); Game.DrawCircle(holdPosition, .5f, Color.Red); //Game.DrawCircle(position, .5f, Color.Blue); //Game.DrawLine(position, position + direction * 6, Color.Yellow); //Game.DrawArea(m_pullJoint.GetAABB(), Color.Cyan); //Game.DrawArea(m_magnetJoint.GetAABB(), Color.Magenta); if (TargetedObject != null) { Game.DrawArea(TargetedObject.GetAABB(), Color.Blue); } //if (m_distanceJointObject != null) // Game.DrawArea(m_distanceJointObject.GetAABB(), Color.Green); var to = m_pullJoint.GetTargetObject(); if (to != null) { Game.DrawArea(to.GetAABB(), Color.Yellow); } } } else { if (IsTargetedObjectStabilized || TargetedObject != null) { StopStabilizingTargetedObject(); m_invisibleMagnet.SetWorldPosition(FarAwayPosition); m_magnetJoint.SetWorldPosition(FarAwayPosition); } } }
private void StabilizeTargetedObject() { TargetedObject.SetLinearVelocity(Vector2.Zero); m_distanceJointObject = Game.CreateObject("InvisibleBlockSmall"); m_distanceJointObject.SetBodyType(BodyType.Dynamic); m_distanceJoint = (IObjectDistanceJoint)Game.CreateObject("DistanceJoint"); m_distanceJoint.SetLineVisual(LineVisual.None); m_distanceJoint.SetLengthType(DistanceJointLengthType.Fixed); m_targetedObjectJoint = (IObjectTargetObjectJoint)Game.CreateObject("TargetObjectJoint"); var targetedObjPosition = TargetedObject.GetAABB().Center; m_distanceJointObject.SetWorldPosition(targetedObjPosition); TargetedObject.SetWorldPosition(targetedObjPosition); m_pullJoint.SetWorldPosition(targetedObjPosition); m_distanceJoint.SetWorldPosition(targetedObjPosition); // if DistanceJoint and TargetObjectJoint is at the same position, weird things may happen // uncomment the part below to stop it m_targetedObjectJoint.SetWorldPosition(m_distanceJointObject.GetWorldPosition() /* - Vector2.UnitY*/); m_pullJoint.SetTargetObject(m_distanceJointObject); m_distanceJoint.SetTargetObject(m_distanceJointObject); m_distanceJoint.SetTargetObjectJoint(m_targetedObjectJoint); m_targetedObjectJoint.SetTargetObject(TargetedObject); m_pullJoint.SetForce(15); IsTargetedObjectStabilized = true; }
protected override void OnHover() { base.OnHover(); Instance.FlagForRemoval(); // no blackhole too close with other blackholes foreach (var hole in BlackholeLocations) { if (ScriptHelper.GrowFromCenter(hole, DestroyRadius * 2).Contains(HoverPosition)) { Destroy(); return; } } BlackholeLocations.Add(HoverPosition); var noCollision = Constants.NoCollision; if (Size == BlackholeSize.Big) { Game.RunCommand("/settime .1"); ScriptHelper.Timeout(() => Game.RunCommand("/settime 1"), 2000); } m_blackhole = Game.CreateObject("Shadow00A"); m_blackhole.SetBodyType(BodyType.Dynamic); m_blackhole.SetCollisionFilter(noCollision); m_blackhole.SetWorldPosition(HoverPosition); ScriptHelper.RunIn(() => Game.DrawCircle(HoverPosition, .5f, Color.Green), 10000); for (var i = 1; i < 40; i++) { var egg = Game.CreateObject("Shadow00A"); egg.SetAngle(MathHelper.TwoPI * i / 39); egg.SetBodyType(BodyType.Static); egg.SetCollisionFilter(noCollision); egg.SetWorldPosition(HoverPosition); m_blackholes.Add(egg); } m_magnetJoint = (IObjectTargetObjectJoint)Game.CreateObject("TargetObjectJoint"); m_magnetJoint.SetWorldPosition(HoverPosition); m_magnetJoint.SetTargetObject(m_blackhole); m_revoluteJoint = (IObjectRevoluteJoint)Game.CreateObject("RevoluteJoint"); m_revoluteJoint.SetWorldPosition(HoverPosition); m_revoluteJoint.SetTargetObjectA(m_blackhole); //m_revoluteJoint.SetMotorEnabled(true); m_revoluteJoint.SetMotorSpeed(3000); m_revoluteJoint.SetMaxMotorTorque(50000); m_activeTime = Game.TotalElapsedGameTime; }