Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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;
        }