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); } }
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; } }