Ejemplo n.º 1
0
        public void SetParent(TilemapCircle parent, FollowParentParameters followParameters, Vector2 position, float rotation)
        {
            this.parent                = parent;
            this.position              = position;
            this.rotation              = rotation;
            this.parentFollowScale     = (followParameters & FollowParentParameters.FollowScale) != 0;
            this.parentFollowRotation  = (followParameters & FollowParentParameters.FollowRotation) != 0;
            this.parentCheckCollisions = (followParameters & FollowParentParameters.CheckCollisions) != 0;

            if (parent != null)
            {
                if (parentFollowScale)
                {
                    this.scale = parent.GetScaleFromPosition(position);
                }

                if (parentFollowRotation)
                {
                    this.rotation = parent.GetAngleFromPosition(position);
                }

                distanceInTilemapCircle      = parent.GetDistanceFromPosition(position);
                angleInTilemapCirclePosition = parent.GetAngleFromPosition(position);
            }

            if (listener != null)
            {
                listener.OnParentChanged(parent);
            }
        }
Ejemplo n.º 2
0
        protected void UpdatePosition(float deltaTime)
        {
            Vector2 normal;
            Vector2 tangent;

            Vector2 deltaPosition;
            float   deltaRotation;

            if (parent != null)
            {
                position = parent.GetPositionFromDistanceAndAngle(distanceInTilemapCircle, angleInTilemapCirclePosition);

                if (parentFollowRotation)
                {
                    rotation = parent.GetAngleFromPosition(position);
                }

                if (parentFollowScale)
                {
                    scale = parent.GetScaleFromPosition(position);
                }

                if (parent is Planet && useGravity)
                {
                    velocity.y -= ((Planet)parent).Gravity * deltaTime;
                }

                normal  = parent.GetNormalFromPosition(position);  //doesn't change with vertical position
                tangent = parent.GetTangentFromPosition(position); //doesn't change with vertical position

                deltaPosition = velocity * deltaTime * scale;

                if (parentFollowRotation)
                {
                    deltaRotation = 0.0f;
                }
                else
                {
                    deltaRotation = rotationVelocity * deltaTime;
                }
            }
            else
            {
                normal  = Vector2.up;
                tangent = Vector2.right;

                deltaPosition = velocity * deltaTime;
                deltaRotation = rotationVelocity * deltaTime;
            }

            hitFlags = TileHitFlags.None;

            if (parent != null && parentCheckCollisions)
            {
                TileHitInfo hitInfo;

                if (deltaPosition.y > 0)
                {
                    //Check against ceiling
                    if (parent.RaycastSquare(
                            position + normal * (size.y * 0.5f * scale),
                            size.x * scale,
                            TileDirection.Up,
                            deltaPosition.y + (size.y * 0.5f * scale),
                            out hitInfo))
                    {
                        deltaPosition.y = -(hitInfo.hitDistance - (size.y * 0.5f * scale));
                        velocity.y      = 0.0f;
                        hitFlags       |= TileHitFlags.Up;
                    }
                }
                else if (deltaPosition.y < 0)
                {
                    //Check against floor
                    if (parent.RaycastSquare(
                            position + normal * (size.y * 0.5f * scale),
                            size.x * scale,
                            TileDirection.Down,
                            -deltaPosition.y + (size.y * 0.5f * scale),
                            out hitInfo))
                    {
                        deltaPosition.y = -(hitInfo.hitDistance - (size.y * 0.5f * scale));
                        velocity.y      = 0.0f;
                        hitFlags       |= TileHitFlags.Down;
                    }
                }
            }

            if (deltaPosition.y != 0)
            {
                position += normal * deltaPosition.y;
                if (parent != null && parentFollowScale)
                {
                    scale = parent.GetScaleFromPosition(position);
                }
            }

            if (parent != null && parentCheckCollisions)
            {
                TileHitInfo hitInfo;

                if (deltaPosition.x > 0)
                {
                    //Check against right wall
                    if (parent.RaycastSquare(
                            position + normal * (size.y * 0.5f * scale),
                            size.y * scale,
                            TileDirection.Right,
                            deltaPosition.x + (size.x * 0.5f * scale),
                            out hitInfo))
                    {
                        deltaPosition.x = (hitInfo.hitDistance - (size.x * 0.5f * scale));
                        velocity.x      = 0.0f;
                        hitFlags       |= TileHitFlags.Right;
                    }
                }
                else if (deltaPosition.x < 0)
                {
                    //Check against left wall
                    if (parent.RaycastSquare(
                            position + normal * (size.y * 0.5f * scale),
                            size.y * scale,
                            TileDirection.Left,
                            -deltaPosition.x + (size.x * 0.5f * scale),
                            out hitInfo))
                    {
                        deltaPosition.x = -(hitInfo.hitDistance - (size.x * 0.5f * scale));
                        velocity.x      = 0.0f;
                        hitFlags       |= TileHitFlags.Left;
                    }
                }
            }

            if (deltaPosition.x != 0)
            {
                position += tangent * deltaPosition.x;
                if (parent != null)
                {
                    normal = parent.GetNormalFromPosition(position);
                }
            }

            if (parent != null)
            {
                if (parentFollowRotation)
                {
                    rotation = parent.GetAngleFromPosition(position);
                }
                else
                {
                    rotation += deltaRotation;
                }

                distanceInTilemapCircle      = parent.GetDistanceFromPosition(position);
                angleInTilemapCirclePosition = parent.GetAngleFromPosition(position);
            }
            else
            {
                rotation += deltaRotation;
            }
        }