Example #1
0
        public void MoveLeg(LegData leg,
                            Vector2 delta)
        {
            bool isTopLeg = leg.legPos == Legs.TopLeft ||
                            leg.legPos == Legs.TopRight;
            float inverse = isTopLeg ? -1.0f : 1.0f;

            if (!leg.spring && delta.SqrMagnitude() > 0)
            {
                float force       = delta.x * inverse;
                float sensitivity = 3;
                float angle       = leg.gameObject.transform.localEulerAngles.z;
                if ((force > 0 && angle - sensitivity * force > leg.angleLimits.x) ||
                    (force < 0 && angle - sensitivity * force < leg.angleLimits.y))
                {
                    leg.gameObject.transform.Rotate(new Vector3(0, 0, -sensitivity * force));
                }
            }
        }
Example #2
0
        public void MoveLeg(LegData leg,
                            Vector2 delta)
        {
            if (!leg.spring && (Math.Abs(delta.x) > 0.0f || Math.Abs(delta.y) > 0.0f))
            {
                delta = Quaternion.Euler(0, 0, leg.arctanRotation) * (-delta);
                float diffAngle = Mathf.Rad2Deg * Mathf.Atan2(delta.y, delta.x);
                if (diffAngle < 0)
                {
                    diffAngle = diffAngle < -90.0F ? 180.0F : 0.0F;
                }


                diffAngle = (leg.startMaxRange + diffAngle) - leg.currentAngle;
                if (Mathf.Abs(diffAngle) > leg.maxFrameDeltaAngle)
                {
                    diffAngle = Mathf.Sign(diffAngle) * leg.maxFrameDeltaAngle;
                }

                float finalAngle;


                if (leg.currentAngle + diffAngle > leg.angleLimits.y)
                {
                    finalAngle = leg.angleLimits.y;
                }
                else if (leg.currentAngle + diffAngle < leg.angleLimits.x)
                {
                    finalAngle = leg.angleLimits.x;
                }
                else
                {
                    finalAngle = leg.currentAngle + diffAngle;
                }

                leg.currentAngle = finalAngle;
                leg.gameObject.transform.localEulerAngles = new Vector3(0, 0, finalAngle);
            }
        }
Example #3
0
        void WebControl(KeyCode key, LegData leg)
        {
            if (Input.GetKeyDown(key))
            {
                if (!leg.spring)
                {
                    GameObject legObject    = leg.gameObject;
                    Transform  legTransform = legObject.transform;
                    LayerMask  layerMask    = ~(1 << LayerMask.NameToLayer("Player"));
                    // shoot web from the tip of the leg
                    Vector2      legEnd  = legTransform.position + (legTransform.up * leg.height);
                    RaycastHit2D hitInfo = Physics2D.Raycast(legEnd, legTransform.up, WebSwingRange, layerMask);
                    if (hitInfo.collider)
                    {
                        if (hitInfo.collider.tag == "Enemy")
                        {
                            DamageInfo dmgSource = new DamageInfo(Damage,
                                                                  Position,
                                                                  hitInfo.collider.gameObject.transform.position,
                                                                  leg.PlayerNumber,
                                                                  hitInfo.collider);
                            hitInfo.rigidbody.SendMessage("Die", dmgSource);
                        }

                        // if out leg is inside the wall don't create spring
                        if (!legEnd.Equals(hitInfo.point))
                        {
                            leg.webHitInfo = hitInfo;
                            SpringJoint2D spring = legObject.AddComponent <SpringJoint2D> ();
                            spring.autoConfigureDistance = false;
                            spring.distance     = 0;
                            spring.dampingRatio = 0.9F;
                            spring.frequency    = 0.3F;
                            // it should be up because joint start should be attached to the tip of the leg, but due to
                            // hingejoint bugs its atm connected to the body
                            spring.anchor          = Vector2.zero;
                            spring.connectedAnchor = hitInfo.point;
                            leg.spring             = spring;
                            leg.swingCollision     = true;
                            leg.lr.SetPosition(1, leg.spring.connectedAnchor);
                            leg.lr.enabled = true;
                        }
                    }
                    else
                    {
                        // did not hit anything, change web color to red with the end at the maximum range
                        leg.swingCollision = false;
                        Vector2 reachedPoint = legTransform.position + legTransform.up * (leg.height + WebSwingRange);
                        leg.lr.SetPosition(1, reachedPoint);
                        leg.lr.enabled = true;
                    }

                    AudioUtils.Play("Laser");
                }
            }
            else if (Input.GetKeyUp(key))
            {
                leg.lr.enabled = false;
                SpringJoint2D spring = leg.spring;
                if (spring)
                {
                    Destroy(spring);
                    leg.webHitInfo = new RaycastHit2D();
                }
            }

            if (leg.lr.enabled)
            {
                if (leg.webHitInfo.collider && !leg.webHitInfo.collider.name.ToLower().Contains("enemy"))   // if we're connected to (not enemy)
                // shoot ray again to check if the string should be destroyed
                {
                    LayerMask    layerMask    = ~(1 << LayerMask.NameToLayer("Player"));
                    Transform    legTransform = leg.gameObject.transform;
                    Vector2      legEnd       = legTransform.position + (legTransform.up * leg.height);
                    RaycastHit2D hitInfo      = Physics2D.Raycast(legEnd, leg.webHitInfo.point - legEnd, WebSwingRange, layerMask);
                    if (Vector2.SqrMagnitude(hitInfo.point - leg.webHitInfo.point) > 0.001F)
                    {
                        leg.lr.enabled = false;
                        SpringJoint2D spring = leg.spring;
                        Destroy(spring);
                        leg.webHitInfo = new RaycastHit2D();

                        AudioUtils.Play("FabricTorn", hitInfo.point);
                        return;
                    }
                }

                Vector2 legTip = leg.gameObject.transform.position + Quaternion.Euler(0, 0, leg.gameObject.transform.eulerAngles.z) * new Vector2(0, leg.height);
                if (leg.swingCollision)
                {
                    leg.lr.SetPosition(0, legTip);
                    leg.lr.SetColors(Color.white, Color.white);
                }
                else
                {
                    leg.lr.SetColors(Color.red, Color.red);
                    leg.lr.SetPosition(0, legTip);
                }
            }
        }