骑行界面调整,底层逻辑细化

This commit is contained in:
lishuo committed 2021-03-30 17:30:29 +08:00
1 parent d5133ee7b0
commit 9a7830f46a
168 files changed
+19164 -393

No files matched your search

+134 -57
View File
@@ -13,6 +13,9 @@ using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using Assets.Scenes.Ride.Scripts.Model;
using static CyclingController;
using System.IO;
namespace Assets.Scenes.Ride.Scripts
{
@@ -36,8 +39,10 @@ namespace Assets.Scenes.Ride.Scripts
#region 选手骑行数据
bool isStart;
bool isMajor;//是否是主人公
MapDataModel mapData;
int userId;
int routeId;
DateTime startTime;//开始骑行时间
double speed;
@@ -45,7 +50,7 @@ namespace Assets.Scenes.Ride.Scripts
double gradev;
double elevation;
double cadance;
double heartRate;
int heartRate;
int ticks;
double totalDistance;
double currentSlope;
@@ -71,10 +76,11 @@ namespace Assets.Scenes.Ride.Scripts
void Start()
{
characterAnimator = GetComponentInChildren<Animator>();
var mainController = transform.parent.GetComponent<MainController>();
var mainController = transform.parent.GetComponent<CyclingController>();
map = FindObjectOfType<AbstractMap>();
mapData = mainController.GetMapData();//获取路书信息
InitializePlayer(mainController.GetCenterCoordinate());//初始人物
routeId = mainController.RouteId;//路数id
Initialize(mainController.GetCenterCoordinate());//初始人物
}
void Update()
@@ -87,7 +93,7 @@ namespace Assets.Scenes.Ride.Scripts
}
}
#region 骑行逻辑
#region 游戏状态控制
//开始骑行
public void SetStart()
{
@@ -103,10 +109,14 @@ namespace Assets.Scenes.Ride.Scripts
public void SetPause()
{
isStart = false;
Complete();
}
#endregion
#region 骑行逻辑
//初始化玩家距离/朝向
void InitializePlayer(double[] coordinates)
void Initialize(double[] coordinates)
{
ticks = 0;//当前骑行时间
//初始化人物位置
@@ -119,7 +129,8 @@ namespace Assets.Scenes.Ride.Scripts
//Quaternion firstRotation = Quaternion.LookRotation(transform.localPosition - secondVect3d);
//character.transform.rotation = Quaternion.Euler(0, firstRotation.eulerAngles.y, 0);
}
StringBuilder sb = new StringBuilder();
public List<TargetData> RiderDatas = new List<TargetData>();
//骑行中
void Run()
{
@@ -131,6 +142,7 @@ namespace Assets.Scenes.Ride.Scripts
speed = Helper.CalculateSpeed(elevation, 0, power, 65, 7);
distance = Math.Round(speed / 3600, 6);
totalDistance += distance;
characterAnimator.SetBool("IsRide", false);//初始化动画状态
if (totalDistance <= mapData.TotalDistance)
{
@@ -143,7 +155,18 @@ namespace Assets.Scenes.Ride.Scripts
//记录骑行数据
var recordText = string.Format($"{ ticks },{ power.ToString(CultureInfo.InvariantCulture) },{ speed.ToString(CultureInfo.InvariantCulture) },{ Math.Round(totalDistance, 6).ToString(CultureInfo.InvariantCulture) },{ cadance.ToString(CultureInfo.InvariantCulture) },{ heartRate.ToString(CultureInfo.InvariantCulture) },{ Math.Round(nextlatlong.x, 6).ToString(CultureInfo.InvariantCulture) },{ Math.Round(nextlatlong.y, 6).ToString(CultureInfo.InvariantCulture) }");
Debug.Log(recordText);
sb.AppendLine(recordText);
RiderDatas.Add(new TargetData
{
Ticks = ticks,
_Power = power,
_Speed = speed,
_Distance = totalDistance,
_Cadence = cadance,
_HeartRate = heartRate,
_Lat = nextlatlong.x,
_Lon = nextlatlong.y
});
//动画控制
if (distance > 0)
@@ -155,7 +178,23 @@ namespace Assets.Scenes.Ride.Scripts
}
else
{
//TODO保存骑行数据
totalDistance = mapData.TotalDistance;
//记录骑行数据
var recordText = string.Format($"{ ticks },{ power.ToString(CultureInfo.InvariantCulture) },{ speed.ToString(CultureInfo.InvariantCulture) },{ Math.Round(totalDistance, 6).ToString(CultureInfo.InvariantCulture) },{ cadance.ToString(CultureInfo.InvariantCulture) },{ heartRate.ToString(CultureInfo.InvariantCulture) },{ Math.Round(nextlatlong.x, 6).ToString(CultureInfo.InvariantCulture) },{ Math.Round(nextlatlong.y, 6).ToString(CultureInfo.InvariantCulture) }");
Debug.Log(recordText);
RiderDatas.Add(new TargetData
{
Ticks = ticks,
_Power = power,
_Speed = speed,
_Distance = totalDistance,
_Cadence = cadance,
_HeartRate = heartRate,
_Lat = nextlatlong.x,
_Lon = nextlatlong.y
});
Complete();
isStart = false;
characterAnimator.SetBool("ReachEnd", true);
}
}
@@ -164,64 +203,102 @@ namespace Assets.Scenes.Ride.Scripts
characterAnimator.SetBool("IsRide", false);
}
}
//发送当前用户位置给UDPs
void SendUdp() {
}
//TODO:骑行结束
void Finish()
private int weight = 65;
private int bicycleWeight = 7;
private string ContinueMark = "TODO";
private int ContinueIndex=0;
private int Competitionid =0;
private bool IsNeedRanking = true;
private double CurrentRouteStartDistance = 0;
private int ManufacturerId=0;
private int AntModelId =0 ;
private CyclingModel cyclingModel = CyclingModel.Single;
private DateTime EndTime;
void Complete()
{
//上传文件
//var path = FileHelper.GetDataDire("MapWorkoutRecords");
//var fname = path + "/" + newFileName + ".txt";
//var files = new List<string>();
EndTime = startTime.AddSeconds(ticks);
MapInterruptRecordApi api = new MapInterruptRecordApi();
int FTP = 200;
double NP = 0;
string id = Guid.NewGuid().ToString();
string newFileName = Guid.NewGuid().ToString();
int FTP = Helper.GetFtp();
double NP = Helper.GetNP(RiderDatas);
//强度
double IF = NP / FTP;
var mapRecord = new MapInterruptRecord
//训练量
double TSS = (RiderDatas.Count * NP * IF) / (FTP * 3600) * 100;
var recordId = Guid.NewGuid().ToString();
var averagePower = Helper.AveragePower(RiderDatas);
var interruptRecord = new MapInterruptRecord
{
Id = id,
RouteId = 5946,
EndDistance = totalDistance,
RouteImage = "",
RecordFileName = "",
CreateTime = DateTime.Now,//骑行结束时间
IsCompleted = true,
TotalDistance = totalDistance,
Id = recordId,
RouteId = routeId,
RouteName = "",
TotalDistance = mapData.TotalDistance,
UserId = userId,
Ftp = 200,
IF = IF,
Kj = 0,
Tss = 0,
NormalizedPower = Math.Round(NP, 0),
AveragePower = 0,
MaxPower = 0,
Ticks = ticks,
AverageCadence = 0,
MaxCadence = 0,
AverageHeartRate = 0,
MaxHeartRate =0,
Progress = 1,
ContinueMark = "",
ContinueIndex = 0,
RecordFileName = newFileName + ".txt",
Ftp = FTP,//FTP设置
IF = Math.Round(IF, 2),
Kj = RiderDatas.Sum(a => a._Power) / 1000,//消耗
Tss = Math.Round(TSS, 2),
EndDistance = totalDistance,
IsCompleted = totalDistance >= mapData.TotalDistance,
NormalizedPower = Math.Floor(NP),//标准化功率
AveragePower = averagePower,//平均功率
MaxPower = RiderDatas.Max(a => a._Power),//最大功率
WeightKg = Math.Round(averagePower / weight, 2),
Weight = weight,
BicycleWeight = bicycleWeight,
ContinueMark = ContinueMark,
ContinueIndex = ContinueIndex,
IsDelete = false,
MapCompetitionId = 0,
CurrentRouteStartDistance = 0,
StartTime = DateTime.Now,
WeightKg = 0,
Weight = 0,
BicycleWeight = 0,
Mode = "Single",
Param = "",
DeviceNumber = "",
ManufacturerId = 0,
ManufacturerName ="",
MapCompetitionId = Competitionid,
ManufacturerName = "TODO",
DeviceNumber = "TODO",
IsRanking = IsNeedRanking,
CurrentRouteStartDistance = CurrentRouteStartDistance,
ManufacturerId = ManufacturerId,
AntModelId = AntModelId,
StartTime = startTime,
CreateTime = EndTime,
Ticks = RiderDatas.Last().Ticks,
Mode = cyclingModel.ToString(),
//Param = Newtonsoft.Json.JsonConvert.SerializeObject(selectParam),
//GlobalCyclingId = selectParam.GlobalCyclingId
};
interruptRecord.SpeedRange = null;
double process = Math.Round((totalDistance - interruptRecord.CurrentRouteStartDistance) /mapData.TotalDistance, 2);
interruptRecord.Progress = process > 1 ? 1 : process;
api.Add(mapRecord, null);
var cadences = RiderDatas.Where(a => a._Cadence.HasValue && a._Cadence.Value > 0);
if (cadences.Any())
{
interruptRecord.AverageCadence = Math.Round(cadences.Average(a => a._Cadence.GetValueOrDefault(0)));
}
interruptRecord.MaxCadence = Math.Round(RiderDatas.Max(a => a._Cadence.GetValueOrDefault(0)));
interruptRecord.AverageHeartRate = Math.Round(RiderDatas.Average(a => a._HeartRate.GetValueOrDefault(0)));
interruptRecord.MaxHeartRate = RiderDatas.Max(a => a._HeartRate.GetValueOrDefault(0));
var path = Helper.GetDataDire("MapWorkoutRecords");
var fname = path + "/" + newFileName + ".txt";
var files = new List<string>();
using (var fs = new FileInfo(fname).OpenWrite())
{
var stream = new StreamWriter(fs);
stream.BaseStream.Seek(0, SeekOrigin.End);
foreach (var item in RiderDatas)
{
stream.Write(item.Write() + "\r\n");
}
stream.Flush();
stream.Close();
files.Add(fname);
}
var result = api.Add(interruptRecord, files);
}
#endregion