public void InterpolateSize(ISlotListItem listItem) { ISlotListSlot currentSlot = listItem.GetCurrentSlot(); if (currentSlot == null) { return; } ESlotListDirection direction = CalculateOffsetDirection(listItem, Vector2.zero); ISlotListSlot targetSlot = GetTargetSlot(listItem, direction); if (targetSlot == null) { listItem.SetSize(currentSlot.GetSize()); return; } float offsetPercent = CalculateOffsetPositionPercent( listItem.GetPosition(), Vector2.zero, currentSlot.GetPosition(), targetSlot.GetPosition()); InterpolateSize(listItem, targetSlot, offsetPercent); }
public void ApplyOffsetPositionPercent(ISlotListItem listItem) { ISlotListSlot currentSlot = listItem.GetCurrentSlot(); ISlotListSlot targetSlot = GetTargetSlot(listItem, offsetDirection); if (targetSlot != null) { Vector2 interpolatedPosition = currentSlot.GetPosition() + ((targetSlot.GetPosition() - currentSlot.GetPosition()) * offsetPositionPercent); listItem.SetPosition(interpolatedPosition); } else { listItem.SetPosition(currentSlot.GetPosition()); } }
private void InterpolateSize(ISlotListItem listItem, ISlotListSlot targetSlot, float offsetPercent) { Vector2 currentSlotSize = listItem.GetCurrentSlot().GetSize(); if (targetSlot == null || offsetPercent.NearlyEquals(0, 0.001f)) { listItem.SetSize(currentSlotSize); return; } // Interpolate size Vector2 targetSlotSize = targetSlot.GetSize(); Vector2 interpolatedSize = Vector2.Lerp(currentSlotSize, targetSlotSize, offsetPercent); listItem.SetSize(interpolatedSize); }
private ESlotListDirection CalculateOffsetDirection(ISlotListItem listItem, Vector2 dragDelta) { if (listItem == null) { return(ESlotListDirection.None); } Vector2 listItemPosition = listItem.GetPosition() + dragDelta; ISlotListSlot currentSlot = listItem.GetCurrentSlot(); if (currentSlot == null) { return(ESlotListDirection.None); } ISlotListSlot nextSlot = currentSlot.GetNextSlot(); if (nextSlot != null) { float distanceNextSlotToCurrentSlot = Vector2.Distance(nextSlot.GetPosition(), currentSlot.GetPosition()); float distanceNextSlotToItemPosition = Vector2.Distance(nextSlot.GetPosition(), listItemPosition); if (distanceNextSlotToItemPosition < distanceNextSlotToCurrentSlot) { return(ESlotListDirection.TowardsNextSlot); } } ISlotListSlot previousSlot = currentSlot.GetPreviousSlot(); if (previousSlot != null) { float distancePreviousSlotToCurrentSlot = Vector2.Distance(previousSlot.GetPosition(), currentSlot.GetPosition()); float distancePreviousSlotToItemPosition = Vector2.Distance(previousSlot.GetPosition(), listItemPosition); if (distancePreviousSlotToItemPosition < distancePreviousSlotToCurrentSlot) { return(ESlotListDirection.TowardsPreviousSlot); } } return(ESlotListDirection.None); }
void Start() { for (int i = 0; i < rouletteItemPlaceholders.Count; i++) { ISlotListSlot previousSlot = 0 <= (i - 1) ? rouletteItemPlaceholders[i - 1] : null; ISlotListSlot nextSlot = (i + 1) <= (rouletteItemPlaceholders.Count - 1) ? rouletteItemPlaceholders[i + 1] : null; rouletteItemPlaceholders[i].SetNeighborSlots(previousSlot, nextSlot); } SlotListControl.SlotChangeEventStream.Subscribe(OnSongRouletteItemChangedSlot); activeRouletteItemPlaceholders = new List <RouletteItemPlaceholder>(rouletteItemPlaceholders); centerItemIndex = (int)Math.Floor(rouletteItemPlaceholders.Count / 2f); centerItem = rouletteItemPlaceholders[centerItemIndex]; if (!showRouletteItemPlaceholders) { foreach (RouletteItemPlaceholder item in rouletteItemPlaceholders) { Image image = item.GetComponentInChildren <Image>(); image.enabled = false; } } }
public void OnDrag(ISlotListItem listItem, Vector2 dragDelta) { // Calculate direction offsetDirection = CalculateOffsetDirection(listItem, dragDelta); // Calculate offset from current slot ISlotListSlot targetSlot = GetTargetSlot(listItem, offsetDirection); offsetPositionPercent = targetSlot != null ? CalculateOffsetPositionPercent(listItem.GetPosition(), dragDelta, listItem.GetCurrentSlot().GetPosition(), targetSlot.GetPosition()) : 0; // Apply this to all list items. This make them move in the same way towards their target slot. foreach (ISlotListItem otherListItem in ListItems) { ApplyOffsetPositionPercent(otherListItem); } // When the target has been reached, then adjust the current slot of all items if (offsetPositionPercent >= 0.6f) { slotChangeEventStream.OnNext(new SlotChangeEvent(offsetDirection, offsetPositionPercent)); } }
public void SetNeighborSlots(ISlotListSlot previousSlot, ISlotListSlot nextSlot) { this.previousSlot = previousSlot; this.nextSlot = nextSlot; }