HartoukChartEditor/Assets/Script/Data/BPMGroupModel.cs

240 lines
7.3 KiB
C#
Raw Normal View History

using System.Collections.Generic;
public class BPMGroupModel
{
/*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD>дΪ<EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ
* ֻ<EFBFBD><EFBFBD>Ҫʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>Ϳ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* Ϊ<EFBFBD>˱<EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,Ԥ<EFBFBD>ƻ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>½ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ
*
*/
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD>,<2C><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,keyΪ<79><CEAA>ʼʱ<CABC><CAB1>,valueΪĿ<CEAA><C4BF>BPMֵ
/// </summary>
private SortedDictionary<int, SortedList<float , float>> BPMData;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B9A9><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD>б<EFBFBD>
/// </summary>
private SortedDictionary<int, BPMGroup> BPMGroupList;
private float noteStream;
private float baseSpeed;
private float baseBPM;
private float trackLength;
public BPMGroupModel(float noteStream, float baseSpeed, float baseBPM, float trackLength)
{
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
this.noteStream = noteStream;
this.baseSpeed = baseSpeed;
this.baseBPM = baseBPM;
this.trackLength = trackLength;
//<2F><>ʼ<EFBFBD><CABC>ʱ,<2C><EFBFBD><E1B4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD>ֵ<EFBFBD>
BPMData = new SortedDictionary<int, SortedList<float, float>>();
BPMGroupList = new SortedDictionary<int, BPMGroup>();
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>BPM<50><4D><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>,<2C><><EFBFBD><EFBFBD>Chart<72>Ĺ淶,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public List<BPMListItem> GetDataObject()
{
var list = new List<BPMListItem>();
foreach (var item in BPMData)
{
var valuePairs = item.Value;
foreach (var pair in valuePairs)
{
var bpmItem = new BPMListItem(pair.Key, pair.Value, item.Key);
list.Add(bpmItem);
}
}
return list;
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD>з<EFBFBD><D0B7><EFBFBD>Chart<72><EFBFBD><E6B7B6><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public void ReadDataObject(List<BPMListItem> list)
{
var testList = new List<BPMListItem>();
foreach (var item in list)
{
CreateNewBPMGroup(item.number, item.startTime, item.bpm);
}
}
/// <summary>
/// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public void CreateNewBPMGroup(int groupNum, float startTime, float currentBPM)
{
if (BPMData.TryGetValue(groupNum, out var valuePairs))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾͵<CBBE><CDB5>ñ༭<C3B1><E0BCAD><EFBFBD><EFBFBD>,<2C><>Ϊÿ<CEAA>γ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Ŀʱ<C4BF>ö<EFBFBD><C3B6>󶼻<EFBFBD>Ĭ<EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>Ĭ<EFBFBD>϶<EFBFBD><CFB6><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫע<D2AA><D7A2>
if (valuePairs.ContainsKey(startTime))
{
EditBPMGroup(groupNum, startTime, currentBPM);
return;// <20><EFBFBD><E0BCAD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>
}
valuePairs.Add(startTime, currentBPM);
}
else
{
BPMData[groupNum] = new SortedList<float, float>
{
{ startTime, currentBPM }
};
//<2F><><EFBFBD><EFBFBD><EFBBB9>Ҫ<EFBFBD><D2AA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>BPMGroupList<73><74>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BPMGroup<75><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>
var group = new BPMGroup( currentBPM, groupNum, noteStream, baseSpeed, baseBPM, trackLength);
BPMGroupList.Add(groupNum, group);
}
}
/// <summary>
/// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public void DeleteBPMGroup(int groupNum, float startTime)
{
if (BPMData.TryGetValue(groupNum, out var valuePairs))
{
if (!valuePairs.ContainsKey(startTime))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return;
}
valuePairs.Remove(startTime);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD>м<EFBFBD><D0BC><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>б<EFBFBD><D0B1>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><><D6B1><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (valuePairs.Count == 0)
{
DeleteNewBPMGroupIndex(groupNum);
}
//<2F><><EFBFBD><EFBFBD><EFB2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>
}
}
/// <summary>
/// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>,<2C><>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵı<DAB5><C4B1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󱨸<EFBFBD>
/// </summary>
public void DeleteNewBPMGroupIndex(int groupNum)
{
if (!BPMData.ContainsKey(groupNum))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󱨸<EFBFBD>
return;
}
BPMData.Remove(groupNum);
BPMGroupList.Remove(groupNum);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>,<2C><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б
/// </summary>
public void EditBPMGroup(int groupNum, float startTime, float newBPM)
{
//<2F><>Ԥ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>е<EFBFBD><D0B5><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ༭<DAB1><E0BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>µ<EFBFBD>,<2C>ú<EFBFBD><C3BA><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD>е<EFBFBD><D0B5><EFBFBD>
if (BPMData.TryGetValue(groupNum, out var valuePairs))
{
if (!valuePairs.ContainsKey(startTime))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return;
}
valuePairs[startTime] = newBPM;
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>Ƿ<EFBFBD><C7B7><EFBFBD>ѯ
}
}
/// <summary>
/// <20><>ѯĿ<D1AF><C4BF>BPMGroup
/// </summary>
public BPMGroup QueryBPMGroup(int groupNum)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
if (BPMGroupList.TryGetValue(groupNum, out var value))
{
return value;
}
else { return null; }
}
/// <summary>
/// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public bool QueryBPMGroupDataItem(int groupNum, float startTime, float newBPM)
{
if (BPMData.TryGetValue(groupNum, out var valuePairs))
{
if (!valuePairs.ContainsKey(startTime))
{
return false;
}
}
else
{
return false;
}
return true;
}
/// <summary>
/// ÿ<><C3BF>ʱ<EFBFBD><CAB1><EFBFBD>仯ʱ<E4BBAF><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>BPMGroup<75><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>µ<EFBFBD>״̬
/// </summary>
public void UpdateBPMGroup(float currentTime)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>,ʹ<>õ<EFBFBD>ǰʱ<C7B0><CAB1>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>С<EFBFBD>ڵ<EFBFBD>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
foreach (var item in BPMData)
{
var value = FindMin(item.Value, currentTime);
BPMGroupList[item.Key].CurrentBPM = value;
}
}
private float FindMin(SortedList<float, float> valuePairs, float currentTime)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>,һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><E9B6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD>ǿ<EFBFBD><C7BF>Խ<EFBFBD><D4BD>ܵ<EFBFBD><><D6AE><EFBFBD>Ż<EFBFBD><C5BB>׶<EFBFBD><D7B6>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>
//<2F><>β<EFBFBD><CEB2><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
float min = 114514;
for (int i = valuePairs.Count - 1; i >= 0; i--)
{
if (valuePairs.Keys[i] < currentTime)
{
min = valuePairs[valuePairs.Keys[i]];
break;
}
}
return min;
}
public List<(int GroupNum, float startTime, float currentBPM)> GetAllBPMDataItem()
{
var list =new List<(int GroupNum,float startTime,float currentBPM)>();
foreach (var BPMDataList in BPMData)
{
foreach (var pair in BPMDataList.Value)
{
list.Add((BPMDataList.Key, pair.Key, pair.Value));
}
}
return list;
}
/// <summary>
/// <20>ڱ༭<DAB1><E0BCAD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>޸<EFBFBD><DEB8><EFBFBD>Ϸ<EFBFBD><CFB7>ʼ<EFBFBD><CABC>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BPMGroupList,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ֵ
/// </summary>
public void UpdatePlayerSetting(float noteStream, float baseSpeed, float baseBPM, float trackLength)
{
//<2F>޸<EFBFBD><DEB8>ڲ<EFBFBD><DAB2><EFBFBD>ֵ
this.noteStream = noteStream;
this.baseSpeed = baseSpeed;
this.baseBPM = baseBPM;
this.trackLength = trackLength;
foreach (var item in BPMGroupList.Values)
{
item.UpdatePlayerSetting(noteStream, baseSpeed, baseBPM, trackLength);
}
}
}