powerfun-unity/Assets/Scenes/Ride/Scripts/CyclingController.cs

190 lines
5.2 KiB
C#

using Assets.Scripts.Apis;
using Assets.Scripts.Apis.Models;
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scenes.Ride.Scripts.Model.CyclingModels;
using Assets.Scenes.Ride.Scripts;
using Mapbox.Unity.Map;
using UnityEngine;
using GeoJSON.Net.Geometry;
using TurfCS;
using Mapbox.Utils;
using Assets.Scripts;
public class CyclingController : DeviceServiceMonoBase
{
public AbstractMap map;
public GameObject player;
public GameObject UIObject;
public RouteResultParam selectParamModel;
public RouteResult routeResult;
public int preticks;
#region
private MapDataModel mapData;//当前路书数据
private Vector2d coordiantes;//当前地图中心
public bool isStart;//当前游戏是否开始
public CyclingModel cyclingModel;//当前骑行模式
public BaseCycling cyclingController { get; set; }
private int RouteId;
private MapApi mapApi;
private Route mapRoute;
#endregion
GameObject loadingcanvas;
void Awake()
{
//获取路书信息
mapApi = ConfigHelper.mapApi;
RouteId = App.RouteIdParam > 0? App.RouteIdParam : 376;
MapDataModel result = mapApi.GetData(RouteId);
mapRoute = GetNewInstace(RouteId);//获取一个路书所有的数据
MapUDPService.Init();//初始化TCP
if (result != null )
{
Init(result);
}
else
{
Debug.LogError("获取地图数据失败");
}
}
private void Start()
{
UIManager.Instance.MainPanel = this.transform.Find("SingleUI/Panel").GetComponent<PFUIPanel>();
UIManager.Instance.ModalsPanel = this.transform.Find("SingleUI/ModalPanel").GetComponent<PFUIPanel>();
}
//加载人物和地图以及UI界面
private void Init(MapDataModel result)
{
if (App.routeResult != null )
{
routeResult = App.routeResult;
selectParamModel = App.routeResult.ContinueCyclingParam;
preticks = App.routeResult.Ticks;
}
if (selectParamModel == null)
{
selectParamModel = new RouteResultParam
{
CompetitionId = 0,
ContinueIndex = 0,
ContinueMark = "",
GlobalContinue = false,
EndDistance = 0,
RankingsId = new List<string>(),
OnlineUserId = 0,
RouteId = App.RouteIdParam
};
}
App.routeResult = null;
mapData = result;
double endDistance = 0;
endDistance = selectParamModel.EndDistance;
coordiantes = Along(endDistance);
map.gameObject.SetActive(true);
player.SetActive(true);
UIObject.SetActive(true);
}
public void SetCyclingModel(CyclingModel mode)
{
this.cyclingModel = mode;
switch (cyclingModel)
{
case CyclingModel.Single:
cyclingController = new SingleModel(mapRoute, selectParamModel);
break;
case CyclingModel.Review:
cyclingController = new SingleModel(mapRoute, selectParamModel);
break;
}
}
#region
/// <summary>
/// 当前骑行数据的记录器
/// </summary>
private RecorderDataModel recorderData
{
get
{
return cyclingController?.recorderData;
}
}
public Route GetRoute()
{
return mapRoute;
}
public MapDataModel GetMapData()
{
return mapData;
}
public Vector2d GetCenterCoordinate()
{
return coordiantes;
}
public Route GetNewInstace(int id)
{
var routeInstance = mapApi.GetById(id);
if (routeInstance == null)
{
return null;
}
var jsonData = mapApi.GetData(RouteId);
return new Route(jsonData, routeInstance.data);
}
public Vector2d Along(double endDistance)
{
if (mapData != null)
{
var list = mapData.List.Select(p => new GeoJSON.Net.Geometry.GeographicPosition(p.Point[0], p.Point[1]));
LineString lineString = new LineString(list);
var pt1 = Turf.Along(lineString, endDistance);
var ll = ((GeographicPosition)((GeoJSON.Net.Geometry.Point)pt1.Geometry).Coordinates);
return new Vector2d(ll.Latitude, ll.Longitude);
}
else
{
return new Vector2d(0,0);
}
}
/// <summary>
/// 海拔图数据
/// </summary>
public float[] GetRealTimeLineChartData(int index)
{
List<float> dist = new List<float>();
var list = mapData.List.Select(c => (float) c.Elevation ).ToArray();
var count = list.Count();
for (int i = 0; i < count; i++)
{
if (i > index)
{
dist.Add(list[i]);
}
}
return dist.ToArray();
}
public float[] GetLineChartData()
{
var list = mapData.List.Select(c => (float)c.Elevation).ToArray();
return list;
}
#endregion
}