222 lines
7.1 KiB
C#
222 lines
7.1 KiB
C#
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|