Esempio n. 1
0
        private void TurnTowards(float seconds, Vector2 target)
        {
            float targetAngle    = this.GetClosestPointAtAngleInRange(target);
            float currentAngle   = Vector2Utils.MinimizeMagnitude(this.TurretDirectionRelativeToSelf);
            float maxAngleChange = seconds * this.AngularSpeed;

            if (this.Range >= Math.PI)
            {
                this.TurretDirectionRelativeToSelf = PhysicsUtils.AngularMoveTowardBounded(currentAngle, targetAngle, maxAngleChange);
            }
            else
            {
                if (Math.Abs(currentAngle - targetAngle) <= maxAngleChange)
                {
                    this.TurretDirectionRelativeToSelf = targetAngle;
                }
                else if (targetAngle < currentAngle)
                {
                    this.TurretDirectionRelativeToSelf = currentAngle - maxAngleChange;
                }
                else
                {
                    this.TurretDirectionRelativeToSelf = currentAngle + maxAngleChange;
                }
            }
        }
Esempio n. 2
0
        private void DrawRollingFrictionGizmo(Vector2 locationIn2DSpace, Color gizmoColor)
        {
            Vector2 correctedRollingFrictionForce = Vector2Utils.GetRotatedVelocityVector(GetRollingFriction(), transform.rotation.eulerAngles.z) * GIZMO_SCALE;

            Gizmos.color = gizmoColor;
            Gizmos.DrawLine(locationIn2DSpace, locationIn2DSpace + correctedRollingFrictionForce);
        }
Esempio n. 3
0
        public void DrawLine(Vector2 point1, Vector2 point2, Color color, double depth)
        {
            Vector2 scale    = new Vector2((float)Math.Sqrt((point2 - point1).LengthSquared()), 1);
            float   rotation = (float)Vector2Utils.Vector2Angle(point2 - point1);

            spriteBatch.Draw(point, point1, null, color, rotation, new Vector2(0), scale, SpriteEffects.None, (float)depth);
        }
Esempio n. 4
0
        private void UpdatePosition()
        {
            if (moveByArc)
            {
                if (count < 1.0f && movingToPoint)
                {
                    count += moveSpeed * Time.deltaTime;

                    Vector3 m1 = Vector2.Lerp(startPosition, middlePoint, count);
                    Vector3 m2 = Vector2.Lerp(middlePoint, targetPosition, count);
                    transform.position = Vector2.Lerp(m1, m2, count);
                    var rotation = Vector2Utils.CalculateFacingToTarget(m1, m2).angle;
                    transform.rotation = rotation;
                }
            }
            else
            {
                if (transform.position != new Vector3(targetPosition.x, targetPosition.y, 0) && movingToPoint)
                {
                    transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime * moveSpeed);
                }
                else
                {
                    movingToPoint = true;
                }
            }
        }
Esempio n. 5
0
    private static Vector2[] GetCorners(Collider2D c)
    {
        if (c is BoxCollider2D box)
        {
            Vector2 size = box.size * 0.5f;
            return(new Vector2[4] {
                box.transform.TransformPoint(new Vector3(size.x, size.y)),
                box.transform.TransformPoint(new Vector3(-size.x, size.y)),
                box.transform.TransformPoint(new Vector3(size.x, -size.y)),
                box.transform.TransformPoint(new Vector3(-size.x, -size.y))
            });
        }
        if (c is CircleCollider2D circle)
        {
            float radius  = circle.radius;
            var   results = new List <Vector2>();
            for (int i = 0; i < 360; i += 10)
            {
                results.Add(circle.transform.TransformPoint(Vector2Utils.FromAngle(i) * radius));
                //Debug.DrawLine(Vector3.zero, Vector2Utils.FromAngle(i) * radius, Color.white, 20f);
            }
            return(results.ToArray());
        }

        return(new Vector2[0]);
    }
Esempio n. 6
0
        protected override async ValueTask UpdateCore(GameContext game)
        {
            if (_path is null || (!_path.Any() && _currPathNode is null))
            {
                return;
            }

            _currPathNode ??= _path.Next();

            var tilePos = _mapRenderer.GetTilePos(_currPathNode);
            var newPos  = Vector2Utils.MoveTowards(_transform.World.Position, tilePos, Speed);

            _transform.Local.Position = newPos;

            var dist = Vector2.DistanceSquared(newPos, tilePos);

            if (dist < Speed)
            {
                _currPathNode             = null;
                _transform.Local.Position = tilePos;

                if (!_path.Any())
                {
                    _path = null;
                    OnArrived?.Invoke(this);
                }
            }
        }
Esempio n. 7
0
    public void explode(float force, Vector3 explosionPosition)
    {
        //if fragments were not created before runtime then create them now
        if (fragments.Count == 0 && allowRuntimeFragmentation)
        {
            generateFragments();
        }
        //otherwise unparent and activate them
        else
        {
            foreach (GameObject frag in fragments)
            {
                frag.transform.parent = null;
                frag.SetActive(true);
            }
        }
        //if fragments exist destroy the original
        if (fragments.Count > 0)
        {
            Destroy(gameObject);

            if (force > 0)
            {
                foreach (GameObject gameObject in fragments)
                {
                    Rigidbody2D rigidbody2d  = gameObject.GetComponent <Rigidbody2D>();
                    Vector3     v3Difference = gameObject.transform.position - explosionPosition;
                    Vector2     difference   = new Vector2(v3Difference.x, v3Difference.y);
                    Vector2     newDirection = Vector2Utils.GetSmallVariation(difference.normalized, 5);
                    rigidbody2d.AddForce(newDirection.normalized * force, ForceMode2D.Impulse);
                }
            }
        }
    }
Esempio n. 8
0
    void Start()
    {
        startposition = transform.position;
        var angle = transform.eulerAngles.z;

        body          = GetComponent <Rigidbody2D>();
        body.velocity = Vector2Utils.CreateVector(Speed, angle * Mathf.Deg2Rad);
    }
Esempio n. 9
0
        public Boolean IsPointedAt(Vector2 target, float errorDistance)
        {
            Vector2 worldPosition    = this.WorldPosition();
            float   angle            = Vector2Utils.ShortestAngleDistance(Vector2Utils.Vector2Angle(target - worldPosition), this.WorldDirection());
            float   distanceToTarget = Vector2.Distance(target, worldPosition);

            return(Math.Abs(angle) <= Math.PI / 2 && Math.Abs((float)(Math.Sin(angle) * distanceToTarget)) < errorDistance);
        }
Esempio n. 10
0
        public void Shoot()
        {
            var instance = Instantiate(bullet, transform.position, Quaternion.Inverse(transform.rotation));
            var rb       = instance.GetComponent <Rigidbody2D>();

            rb.velocity = Vector2Utils.Rotate(Vector2.up, rb.rotation) * bulletSpeed;
            instance.shooterCollider = shooterCollider;
            instance.shooterTag      = shooterTag;
        }
Esempio n. 11
0
        private void AdjustBone(SkeletonInputs inputs, Bone bone, Vector2 source, Vector2 target, float weight)
        {
            var transform = bone.GetChainedTransform(inputs);
            var center    = Matrix3x2.TransformPoint(transform, bone.Center);

            float rotationDelta = Vector2Utils.AngleBetween(source - center, target - center);

            bone.IncrementRotation(inputs, rotationDelta * weight);
        }
        private void ShootRay()
        {
            var instance = Instantiate(ShootingAbility.bullet, transform.position, Quaternion.Inverse(transform.rotation));
            var rb       = instance.GetComponent <Rigidbody2D>();

            rb.velocity              = Vector2Utils.Rotate(Vector2.up, rb.rotation) * ShootingAbility.speed;
            instance.damage          = damage;
            instance.shooterCollider = shooterCollider;
            instance.shooterTag      = shooterTag;
        }
Esempio n. 13
0
        public void DrawRectangle(Vector2 position, Vector2 size, Vector2 center, double rotation, Color color, double depth)
        {
            Vector2 point1 = position + Vector2Utils.RotateVector2(-center, rotation);
            Vector2 point2 = point1 + Vector2Utils.RotateVector2(new Vector2(size.X, 0), rotation);
            Vector2 point3 = point1 + Vector2Utils.RotateVector2(size, rotation);
            Vector2 point4 = point1 + Vector2Utils.RotateVector2(new Vector2(0, size.Y), rotation);

            DrawLine(point1, point2, color, depth);
            DrawLine(point2, point3, color, depth);
            DrawLine(point3, point4, color, depth);
            DrawLine(point4, point1, color, depth);
        }
Esempio n. 14
0
        private void DrawBrakingFrictionGizmo(Vector2 locationIn2DSpace, Color noGripGizmoColor, Color maxGripGizmoColor)
        {
            float minFrictionCoefficient     = _tyreData.MinFrictionCoefficient() * (IsTyreRolling ? _tyreData.ForwardsFrictionCoefficient : _tyreData.SidewaysFrictionCoefficient);
            float maxFrictionCoefficient     = _tyreData.MaxFrictionCoefficient() * (IsTyreRolling ? _tyreData.ForwardsFrictionCoefficient : _tyreData.SidewaysFrictionCoefficient);
            float currentRelativeCoefficient = ((IsTyreRolling ? _forwardsGripCoefficient : _lockedBrakesGripCoefficient) - minFrictionCoefficient) / (maxFrictionCoefficient - minFrictionCoefficient);

            Gizmos.color = Color.Lerp(noGripGizmoColor, maxGripGizmoColor, currentRelativeCoefficient);

            Vector2 correctedBrakingFrictionForce = Vector2Utils.GetRotatedVelocityVector(GetBrakingFriction(), transform.rotation.eulerAngles.z) * GIZMO_SCALE;

            Gizmos.DrawLine(locationIn2DSpace, locationIn2DSpace + correctedBrakingFrictionForce);
        }
Esempio n. 15
0
        private void OnCollisionEnter2D(Collision2D other)
        {
            if (!other.gameObject.CompareTag("Reflective"))
            {
                return;
            }

            Vector2 reflected = Vector3.Reflect(Vector2Utils.CreateVector(1, Angle * Mathf.Deg2Rad),
                                                other.GetContact(0).normal);

            Angle = reflected.GetAngle() * Mathf.Rad2Deg;
            OnHitShield();
        }
Esempio n. 16
0
    public static List <Vector2> GetPointsInArc(float fovAngle, float fovDistance, float offsetAngle, Vector2 origin, int resolution)
    {
        var   results    = new List <Vector2>();
        float startAngle = offsetAngle + fovAngle * 0.5f;

        for (int i = 0; i <= resolution; i++)
        {
            float angle = startAngle - i * (fovAngle / resolution);
            results.Add(Vector2Utils.FromAngle(angle) * fovDistance + origin);
        }

        return(results);
    }
Esempio n. 17
0
        public void DrawCircle(Vector2 center, double radius, Color color, double depth)
        {
            int maxSegments = 50;
            //int segmentSize = 5;
            int segments = maxSegments;

            for (int i = 0; i < segments; i++)
            {
                Vector2 point1 = Vector2Utils.ConstructVectorFromPolar(radius, i * (2 * Math.PI / segments)) + center;
                Vector2 point2 = Vector2Utils.ConstructVectorFromPolar(radius, ((i + 1) % segments) * (2 * Math.PI / segments)) + center;
                DrawLine(point1, point2, color, depth);
            }
        }
    public void TestAngleBetween()
    {
        Assert.AreEqual(0, Vector2Utils.AngleBetween(+Vector2.UnitX, +Vector2.UnitX), 1e-6f);
        Assert.AreEqual(MathUtil.PiOverFour, Vector2Utils.AngleBetween(+Vector2.UnitX, new Vector2(1, 1)), 1e-6f);

        Assert.AreEqual(MathUtil.PiOverTwo, Vector2Utils.AngleBetween(+Vector2.UnitX, +Vector2.UnitY), 1e-6f);
        Assert.AreEqual(MathUtil.PiOverTwo, Vector2Utils.AngleBetween(+Vector2.UnitY, -Vector2.UnitX), 1e-6f);
        Assert.AreEqual(MathUtil.PiOverTwo, Vector2Utils.AngleBetween(-Vector2.UnitX, -Vector2.UnitY), 1e-6f);
        Assert.AreEqual(MathUtil.PiOverTwo, Vector2Utils.AngleBetween(-Vector2.UnitY, +Vector2.UnitX), 1e-6f);

        Assert.AreEqual(-MathUtil.PiOverTwo, Vector2Utils.AngleBetween(+Vector2.UnitY, +Vector2.UnitX), 1e-6f);
        Assert.AreEqual(-MathUtil.PiOverTwo, Vector2Utils.AngleBetween(-Vector2.UnitX, +Vector2.UnitY), 1e-6f);
        Assert.AreEqual(-MathUtil.PiOverTwo, Vector2Utils.AngleBetween(-Vector2.UnitY, -Vector2.UnitX), 1e-6f);
        Assert.AreEqual(-MathUtil.PiOverTwo, Vector2Utils.AngleBetween(+Vector2.UnitX, -Vector2.UnitY), 1e-6f);
    }
Esempio n. 19
0
        public float GetClosestPointAtAngleInRange(Vector2 target)
        {
            PhysicalObject parent = ((PhysicalObject)(this.Parent));

            if (parent != null)
            {
                float worldDirection = Vector2Utils.Vector2Angle(target - this.WorldPosition());
                float targetAngleRelativeToParent = worldDirection - parent.WorldDirection() - this.DirectionRelativeToParent;
                return(MathUtils.ClosestInRange(Vector2Utils.MinimizeMagnitude(targetAngleRelativeToParent), this.Range, -this.Range));
            }
            else
            {
                return(0);
            }
        }
Esempio n. 20
0
        private void ShootToTarget(Transform target)
        {
            var(angle, directionalVector) = Vector2Utils.CalculateFacingToTarget(transform.position, target.position);
            var instance = Instantiate(ShootingAbility.bullet, transform.position, angle);
            var rb       = instance.GetComponent <Rigidbody2D>();

            if (gunObject != null)
            {
                gunObject.transform.right = target.position - gunObject.transform.position;
                gunObject.transform.Rotate(new Vector3(0, 0, -90));
            }

            rb.velocity              = directionalVector * ShootingAbility.speed;
            instance.damage          = damage;
            instance.shooterCollider = shooterCollider;
            instance.shooterTag      = shooterTag;
        }
Esempio n. 21
0
    public static List <Vector2> GetFilteredPoints(float fovAngle, float fovDistance, float offsetAngle, Vector2 origin)
    {
        var   results     = new List <Vector2>();
        var   forward     = Vector2Utils.FromAngle(offsetAngle);
        float distanceSqr = fovDistance * fovDistance;
        float halfAngle   = fovAngle * 0.5f;

        foreach (var p in ObstacleManager.Corners)
        {
            Vector2 direction = (p - origin);
            if (Vector2.Angle(direction, forward) < halfAngle && direction.sqrMagnitude < distanceSqr)
            {
                results.Add(p);
            }
        }

        return(results);
    }
Esempio n. 22
0
    private void OnDrawGizmos()
    {
        Vector2 intersection = new Vector2();

        //Apron.LineIntersection(
        //To2D(transform.position), To2D(transform.forward),
        //To2D(other.position), To2D(other.forward), ref intersection);

        Vector2Utils.RayRayIntersection(To2D(transform.position), To2D(transform.forward),
                                        To2D(other.position), To2D(other.forward), ref intersection);

        Gizmos.DrawLine(transform.position - transform.forward * 1000,
                        transform.position + transform.forward * 1000);
        Gizmos.DrawLine(other.position - other.forward * 1000,
                        other.position + other.forward * 1000);

        Gizmos.DrawWireSphere(new Vector3(intersection.x, 0, intersection.y), 1 * 100);
    }
        public static FabrIkChain Make(SkeletonInputs inputs, Bone sourceBone, Vector2 unposedSource, Vector2 target)
        {
            Vector2 posedSource = Matrix3x2.TransformPoint(sourceBone.GetChainedTransform(inputs), sourceBone.End);

            List <Bone> bones = new List <Bone> {
            };
            List <Vector2> unposedBoneVectors = new List <Vector2> {
            };

            List <float> rotations = new List <float>();

            List <Vector2> positions = new List <Vector2> {
            };

            positions.Add(posedSource);

            Vector2 previousUnposedPosition = unposedSource;
            Vector2 previousPosedPosition   = posedSource;

            for (var bone = sourceBone; bone != null; bone = bone.Parent)
            {
                var unposedCenter = bone.Center;
                var posedCenter   = Matrix3x2.TransformPoint(bone.GetChainedTransform(inputs), unposedCenter);

                Vector2 unposedBoneVector = previousUnposedPosition - unposedCenter;
                Vector2 posedBoneVector   = previousPosedPosition - posedCenter;
                float   rotation          = Vector2Utils.AngleBetween(
                    unposedBoneVector,
                    posedBoneVector);

                bones.Add(bone);
                unposedBoneVectors.Add(unposedBoneVector);
                rotations.Add(rotation);
                positions.Add(posedCenter);

                previousUnposedPosition = unposedCenter;
                previousPosedPosition   = posedCenter;
            }

            var startTarget = target;
            var endTarget   = positions[bones.Count];

            return(new FabrIkChain(bones, unposedBoneVectors, rotations, positions, target, endTarget));
        }
 public override Vector2 WorldPosition()
 {
     if (this.Parent == null)
     {
         return(new Vector2(0));
     }
     else
     {
         PhysicalObject parentObj = (PhysicalObject)this.Parent;
         if (parentObj != null)
         {
             return(Vector2Utils.RotateVector2(this.PositionRelativeToParent, parentObj.WorldDirection()) + parentObj.WorldPosition());
         }
         else
         {
             return(new Vector2(float.NaN));
         }
     }
 }
Esempio n. 25
0
        protected override async ValueTask UpdateCore(GameContext game)
        {
            var dt = (float)game.GameTime.ElapsedMilliseconds / 1000;

            _rotationVelocity         += RotationSpeed * dt;
            _rotationVelocity         *= (1f - dt * RotationDrag);
            _transform.Local.Rotation += _rotationVelocity * dt;

            var dir = new Vector2(MathF.Sin(_transform.Local.Rotation), -MathF.Cos(_transform.Local.Rotation));

            var traction = dir * this.Thrust;

            var acceleration = traction / Mass;

            _velocity += acceleration * dt;
            _velocity *= (1 - dt * Drag);
            _velocity  = Vector2Utils.ClampMagnitude(ref _velocity, MaxSpeed);

            _transform.Local.Position += _velocity * dt;
        }
Esempio n. 26
0
            public override void Handle(Microsoft.Xna.Framework.GameTime elapsedTime)
            {
                base.Handle(elapsedTime);
                if (Vector2Utils.ShortestAngleDistance(obj.Direction, Vector2Utils.Vector2Angle(followObj.Position - obj.Position)) < (Math.PI / 20))
                {
                    if (!fire)
                    {
                        //((NPCShip)obj).FireCoaxialWeapon();
                        //fire = true;
                    }
                }

                // Switch states if we are too close for engagement.
                if ((followObj.Position - obj.Position).Length() < 500)
                {
                    // TODO: Dangerous convert...fix this
                    this.Context.AddState(new ClearTargetState((NPCBasicAttackStrategy)this.Context, (NPCShip)this.obj, this.followObj));
                    this.Context.RemoveState(this);
                }
            }
Esempio n. 27
0
    void FixedUpdate()
    {
        if (VisibleObject.IsVisible && Player)
        {
            RotateTowardsPlayer(Time.deltaTime);

            transform.position += new Vector3(Random.Range(-5f, 5f), Random.Range(-5f, 5f), 0) * Time.deltaTime;

            ShotCooldown -= Time.deltaTime;
            if (ShotCooldown <= 0)
            {
                Instantiate(Burst, LookAhead.transform.position, transform.rotation, transform.parent);
                Vector2        direction = Vector2Utils.Vector2FromAngle(Body.rotation + Random.Range(-15f, 15f));
                ShotController shot      = Instantiate(Shot, LookAhead.transform.position, transform.rotation, transform.parent).GetComponent <ShotController>();
                shot.Fire(direction, Body.velocity, ShootPower);

                ShotCooldown = MaxShootCooldown + Random.Range(-0.15f, 0.15f);
            }
        }
    }
Esempio n. 28
0
        private Projection projectOnAxis(ConvexShape shape, Vector2 axis)
        {
            float min = Vector2Utils.DotProduct(axis, shape.Points[0]);
            float max = min;

            for (int i = 1; i < shape.Points.Count; i++)
            {
                float p = Vector2Utils.DotProduct(axis, shape.Points[i]);

                if (p < min)
                {
                    min = p;
                }
                else if (p > max)
                {
                    max = p;
                }
            }

            return(new Projection(min, max));
        }
        //From end-effector to root
        public void DoForwardPass()
        {
            Vector2 targetEnd = firstTargetEnd;

            for (int boneIdx = 0; boneIdx < bones.Count; ++boneIdx)
            {
                Vector2 currentEnd    = positions[boneIdx];
                Vector2 currentCenter = positions[boneIdx + 1];

                float targetRotationDelta = Vector2Utils.AngleBetween(
                    currentEnd - currentCenter,
                    targetEnd - currentCenter);
                float   unconstrainedTargetRotation = rotations[boneIdx] + targetRotationDelta;
                float   targetRotation = ConstrainRotationAgainstChild(boneIdx, unconstrainedTargetRotation);
                Vector2 targetCenter   = targetEnd - Vector2Utils.RotateBy(targetRotation, unposedBoneVectors[boneIdx]);

                positions[boneIdx] = targetEnd;
                rotations[boneIdx] = targetRotation;
                targetEnd          = targetCenter;
            }

            positions[bones.Count] = targetEnd;
        }
        // From root to end-effector
        public void DoBackwardPass()
        {
            Vector2 targetCenter = lastTargetCenter;

            for (int boneIdx = bones.Count - 1; boneIdx >= 0; --boneIdx)
            {
                Vector2 currentEnd    = positions[boneIdx];
                Vector2 currentCenter = positions[boneIdx + 1];

                float targetRotationDelta = Vector2Utils.AngleBetween(
                    currentEnd - currentCenter,
                    currentEnd - targetCenter);
                float   unconstrainedTargetRotation = rotations[boneIdx] + targetRotationDelta;
                float   targetRotation = ConstraintRotationAgainstParent(boneIdx, unconstrainedTargetRotation);
                Vector2 targetEnd      = targetCenter + Vector2Utils.RotateBy(targetRotation, unposedBoneVectors[boneIdx]);

                positions[boneIdx + 1] = targetCenter;
                rotations[boneIdx]     = targetRotation;
                targetCenter           = targetEnd;
            }

            positions[0] = targetCenter;
        }