HartoukChartEditor/Assets/Script/Data/ChartRuntimeModel.cs

222 lines
7.1 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD>ͨѶ,<2C><>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ψһ<CEA8><D2BB><EFBFBD><EFBFBD>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڱȽ<DAB1>
/// </summary>
public class ChartRuntimeModel
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Chart<72><74><EFBFBD><EFBFBD>
/// </summary>
public SortedSet<RuntimeBaseNoteData> ChartRuntimeSet = new SortedSet<RuntimeBaseNoteData>(new UniversalBaseNoteComparer());
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>ͼ
/// </summary>
public SortedSet<RuntimeBaseNoteData> SearchRange(float startTime, float endTime)
{
var view = ChartRuntimeSet.GetViewBetween(new TempBaseNoteComparer(startTime), new TempBaseNoteComparer(endTime));
return view;
}
/// <summary>
/// ɾ<><C9BE>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public void DeleteDataItem(RuntimeBaseNoteData obj)
{
ChartRuntimeSet.Remove(obj);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B7B5>null
/// </summary>
public RuntimeBaseNoteData GetDataItem(RuntimeBaseNoteData obj)
{
if (ChartRuntimeSet.TryGetValue(obj, out var Value))
{
return Value;
}
else
{
return null;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public void AddDataItem(RuntimeBaseNoteData obj)
{
ChartRuntimeSet.Add(obj);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>־û<D6BE><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
/// </summary>
public void GetChartData(Chart chart)
{
foreach (var item in ChartRuntimeSet)
{
switch (item)
{
case RuntimeNoteData:
{
chart.noteList.Add(new NoteListItem(
item.xPos,
item.yPos,
item.targetTime,
item.bpmGroup.GroupNum));
break;
}
case RuntimeDragData:
{
chart.dragList.Add(new DragListItem(
item.xPos,
item.yPos,
item.targetTime,
item.bpmGroup.GroupNum));
break;
}
case RuntimeFlickData:
{
var flick = item as RuntimeFlickData;
chart.flickList.Add(new FlickListItem(
item.xPos,
item.yPos,
item.targetTime,
item.bpmGroup.GroupNum,
flick.direction
));
break;
}
case RuntimeSnakeData:
{
var snake = item as RuntimeSnakeData;
chart.dataFlowList.Add(new DataFlowListItem(
snake.xPos,
snake.yPos,
snake.endXPos,
snake.endYPos,
snake.targetTime,
snake.endTime,
true,
snake.bpmGroup.GroupNum,
snake.referencePoint
));
break;
}
}
}
}
}
public class UniversalBaseNoteComparer : IComparer<RuntimeBaseNoteData>
{
public int Compare(RuntimeBaseNoteData x, RuntimeBaseNoteData y)
{
if (x == null && y == null) return 0;
if (x == null) return -1;
if (y == null) return 1;
int timeComparison = x.targetTime.CompareTo(y.targetTime);
if (timeComparison != 0) return timeComparison;
int xComparison = x.xPos.CompareTo(y.xPos);
if (xComparison != 0) return xComparison;
int yComparison = x.yPos.CompareTo(y.yPos);
if (yComparison != 0) return yComparison;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ㣬<DAB5>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
if (x is RuntimeSnakeData xSnake && y is RuntimeSnakeData ySnake)
{
// <20>Ƚ<EFBFBD><C8BD>߽ڵ<DFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>
int endXComparison = xSnake.endXPos.CompareTo(ySnake.endXPos);
if (endXComparison != 0) return endXComparison;
int endYComparison = xSnake.endYPos.CompareTo(ySnake.endYPos);
if (endYComparison != 0) return endYComparison;
int endTimeComparison = xSnake.endTime.CompareTo(ySnake.endTime);
if (endTimeComparison != 0) return endTimeComparison;
int referencePointComparison = xSnake.referencePoint.CompareTo(ySnake.referencePoint);
if (referencePointComparison != 0) return referencePointComparison;
}
// ֻ<>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD>
Type xType = x.GetType();
Type yType = y.GetType();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ȣ<EFBFBD>SortedSet <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return string.Compare(xType.FullName, yType.FullName, StringComparison.Ordinal);
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĻ<DDB5><C4BB><EFBFBD>
/// </summary>
public class RuntimeBaseNoteData
{
public float targetTime { get; set; }
public float xPos { get; set; }
public float yPos { get; set; }
public BPMGroup bpmGroup { get; set; }
}
public class TempBaseNoteComparer : RuntimeBaseNoteData
{
public TempBaseNoteComparer(float time)
{
targetTime = time;
}
}
public class RuntimeNoteData : RuntimeBaseNoteData
{
public RuntimeNoteData(float targetTime, float xPos, float yPos, BPMGroup bpmGroup)
{
this.targetTime = targetTime;
this.xPos = xPos;
this.yPos = yPos;
this.bpmGroup = bpmGroup;
}
}
public class RuntimeDragData : RuntimeBaseNoteData
{
public RuntimeDragData(float targetTime, float xPos, float yPos, BPMGroup bpmGroup)
{
this.targetTime = targetTime;
this.xPos = xPos;
this.yPos = yPos;
this.bpmGroup = bpmGroup;
}
}
public class RuntimeFlickData : RuntimeBaseNoteData
{
public FlickDirection direction { get; set; }
public RuntimeFlickData(float targetTime, float xPos, float yPos, FlickDirection direction, BPMGroup bpmGroup)
{
this.targetTime = targetTime;
this.xPos = xPos;
this.yPos = yPos;
this.direction = direction;
this.bpmGroup = bpmGroup;
}
}
public class RuntimeSnakeData : RuntimeBaseNoteData
{
public float endXPos { get; set; }
public float endYPos { get; set; }
public float endTime { get; set; }
public ReferencePointLocation referencePoint { get; set; }
public RuntimeSnakeData(float targetTime, float xPos, float yPos, float endXPos, float endYPos, float endTime, ReferencePointLocation referencePoint, BPMGroup bpmGroup)
{
this.targetTime = targetTime;
this.xPos = xPos;
this.yPos = yPos;
this.endXPos = endXPos;
this.endYPos = endYPos;
this.endTime = endTime;
this.referencePoint = referencePoint;
this.bpmGroup = bpmGroup;
}
}