powerfun-unity/Assets/Scripts/UI/Prefab/Rower/RowerMultiModeScript.cs

637 lines
23 KiB
C#
Raw Normal View History

using Assets.Scripts;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using Assets.Scripts.Apis.Models;
using System;
using System.Linq;
using UnityEngine.UI;
using Assets.Scripts.UI.Prefab.Login;
using Newtonsoft.Json;
public class RowerMultiModeScript : MonoBehaviour
{
// Start is called before the first frame update
[SerializeField]
GameObject rank;
Transform scroll,m2;
Vector3 startPosition,boatStartPosition;
TKPanRecognizer pan;
ScrollRect scrollRank;
Dictionary<string, Texture> caches;
public class Trace
{
public int userId { get; set; }
public Transform trace { get; set; }
}
public class TraceData
{
public List<RowerChartModel> list { get; set; }
public string NickName { get; set; }
public string Avatar { get; set; }
public int UserId { get; set; }
public bool isMine { get; set; }
public int currentDistance { get; set; }
public string Country { get; set; }
public int currentRank { get; set; }
}
List<Trace> traceList;
List<float> initialPosYList;
void Awake()
{
scroll = transform.Find("Rower/Modes/Scroll");
startPosition = scroll.localPosition;
if (PlayerPrefs.GetFloat("RowerMultiModeLocationX") != 0f)
{
scroll.localPosition = new Vector3(PlayerPrefs.GetFloat("RowerMultiModeLocationX"), startPosition.y, startPosition.z);
foreach (Transform t in transform.Find("Rower/Dots"))
{
t.GetComponent<Image>().color = Utils.HexToColorHtml("#ffffff");
}
if (scroll.localPosition.x >= startPosition.x - (730 / 2))
{
transform.Find("Rower/Dots/d1").GetComponent<Image>().color = Utils.HexToColorHtml("#f93086");
}
else
{
transform.Find("Rower/Dots/d2").GetComponent<Image>().color = Utils.HexToColorHtml("#f93086");
}
}
AddTouchEvent();
m2 = transform.Find("Rower/Modes/Scroll/M2");
caches = new Dictionary<string, Texture>();
traceList = new List<Trace>()
{
new Trace{ userId=0, trace=m2.Find("Track/T1") },
new Trace{ userId=0, trace=m2.Find("Track/T2") },
new Trace{ userId=0, trace=m2.Find("Track/T3") },
new Trace{ userId=0, trace=m2.Find("Track/T4") },
new Trace{ userId=0, trace=m2.Find("Track/T5") },
};
initialPosYList = new List<float>
{
m2.Find("Track/T1").localPosition.y,
m2.Find("Track/T2").localPosition.y,
m2.Find("Track/T3").localPosition.y,
m2.Find("Track/T4").localPosition.y,
m2.Find("Track/T5").localPosition.y,
};
scrollRank = transform.Find("Rower/Modes/Scroll/M2/Rank/Scroll View").GetComponent<ScrollRect>();
var countryJson = Resources.Load<TextAsset>("UI/flags-mini").text;
countryList = JsonConvert.DeserializeObject<List<CountryModel>>(countryJson);
}
public void HandleTimeTick(RowerChartModel data)
{
//rowerType = GetComponent<RowerHomeScript>().rowerType;
currentSecond++;
myData.list.Add(data);
SortByCurrentDistance();
DisplayUserRanks();
DisplayTraces();
}
private void SortByCurrentDistance()
{
if (currentSecond >= 0)
{
userList.ForEach(x =>
{
var _list = x.list;
var _distance = 0;
if (_list.Count == 0)
{
_distance = 0;
}
else if (currentSecond >= _list.Count)
{
_distance = _list[_list.Count - 1].Distance;
}
else
{
_distance = _list[currentSecond].Distance;
}
x.currentDistance = _distance;
2022-03-31 18:30:07 +08:00
if (x.isMine && rowerType.type == 1 && x.currentDistance > rowerType.value)
{
x.currentDistance = (int)rowerType.value;
}
});
}
userList = userList.OrderByDescending(x => x.currentDistance).ToList();
for (int i = 0; i < userList.Count; i++)
{
userList[i].currentRank = i + 1;
}
}
private List<TraceData> HandleData()
{
//仅取5个
var mineIndex = userList.FindIndex(x => x.isMine);
if (mineIndex < 2)
{
return userList.Where((x, i) => i < 5).ToList();
}
else if (mineIndex > userList.Count - 3)
{
return userList.Where((x, i) => i >= userList.Count - 5).ToList();
}
else
{
return userList.Where((x, i) => i >= mineIndex - 2 && i <= mineIndex + 2).ToList();
}
}
List<TraceData> userList;
TraceData myData;
public List<RowerRank> shadowList { get; private set; }
public async void GetShadowList(RowerTaskPanel.RowerType rowerType)
{
this.rowerType = rowerType;
currentSecond = -1;
var res = await ConfigHelper.rowerApi.GetShadowList(rowerType);
shadowList = res.data;
var _tmpList = shadowList.Select(x => new TraceData
{
list = x.list,
NickName = x.NickName,
Avatar = x.WxHeadImg,
UserId = x.UserId,
isMine = false,
currentDistance = 0,
Country = x.Country
}).ToList();
myData = new TraceData();
myData.list = new List<RowerChartModel>();
myData.UserId = App.CurrentUser.Id;
myData.NickName = App.CurrentUser.Nickname;
myData.Avatar = App.CurrentUser.WxHeadImg;
myData.isMine = true;
myData.Country = App.CurrentUser.Country;
_tmpList.Add(myData);
userList = _tmpList.OrderByDescending(x => x.currentDistance).ToList();
for (int i = 0; i < userList.Count; i++)
{
userList[i].currentRank = i + 1;
}
DisplayUserRanks(true);
DisplayTraces();
}
private void DisplayTraces()
{
var list = HandleData();
//CompareTraceList(traceList, list);
int i = 0;
var mineData = list.FirstOrDefault(x => x.isMine);
for (i = 0; i < list.Count;i++)
{
var sq = DOTween.Sequence();
var item = traceList[i];
var t = item.trace;
var data = list[i];
t.gameObject.SetActive(true);
TweenCallback callback = () =>
{
2022-03-31 18:30:07 +08:00
if (string.IsNullOrEmpty(data.Avatar))
{
t.Find("Left/Avatar").GetComponent<RawImage>().texture = null;
}
else
{
Utils.DisplayImageTempDict(t.Find("Left/Avatar").GetComponent<RawImage>(), data.Avatar, caches);
}
var _c = countryList.SingleOrDefault(x => x.country == data.Country);
if (_c != null)
{
t.Find("Left/Avatar/Country").GetComponent<Image>().sprite = Resources.Load<Sprite>(_c.source);
}
t.Find("Left/NickName").GetComponent<Text>().text = data.NickName;
if (data.list.Count == 0)
{
t.Find("Left/Time").GetComponent<Text>().text = TimeSpan.FromSeconds(0).ToString(@"mm\:ss");
}
else if (currentSecond >= 0 && currentSecond < data.list.Count)
{
var _d = data.list[currentSecond];
t.Find("Left/Time").GetComponent<Text>().text = TimeSpan.FromSeconds(_d.Pace).ToString(@"mm\:ss");
}
else
{
var _d = data.list[data.list.Count - 1];
t.Find("Left/Time").GetComponent<Text>().text = TimeSpan.FromSeconds(_d.Pace).ToString(@"mm\:ss");
}
var diff = data.currentDistance - mineData.currentDistance;
if (diff > 0)
{
t.Find("Main/Diff").GetComponent<Text>().text = diff.ToString("+#0M");
}
else if (diff == 0)
{
t.Find("Main/Diff").GetComponent<Text>().text = data.isMine ? "" : diff.ToString("#0M");
}
else
{
t.Find("Main/Diff").GetComponent<Text>().text = diff.ToString("#0M");
}
if (data.isMine)
{
t.transform.Find("Left/Time").GetComponent<Text>().color = Utils.HexToColorHtml("#f93086");
t.transform.Find("Left/NickName").GetComponent<Text>().color = Utils.HexToColorHtml("#f93086");
}
else
{
t.transform.Find("Left/Time").GetComponent<Text>().color = Utils.HexToColorHtml("#ffffff");
t.transform.Find("Left/NickName").GetComponent<Text>().color = Utils.HexToColorHtml("#ffffff");
}
};
if (item.userId != data.UserId)
{
var sq1 = DOTween.Sequence();
var tmp = traceList[i].trace.DOLocalRotate(new Vector3(90, 0, 0), 0.3f);
tmp.onComplete = callback;
sq1.Append(tmp);
sq1.Append(traceList[i].trace.DOLocalRotate(new Vector3(0, 0, 0), 0.3f));
sq.Join(sq1);
}
else
{
sq.AppendCallback(callback);
}
item.userId = data.UserId;
if (currentSecond >= 0 && currentSecond < list[i].list.Count)
{
var _d = data.list[currentSecond];
if (currentSecond > 0)
{
var _pred = data.list[currentSecond - 1];
if (_pred.StrokeCount != _d.StrokeCount)
{
//上次划桨次数和这次不一样 说明需要划桨一次
var spDict = GetComponent<RowerHomeScript>().spriteDict;
int spDictIndex = 0;
sq.Join(DOTween.To(() => spDictIndex, x => t.Find("Main/Boat").GetComponent<Image>().sprite = spDict[x], 14, 0.3f));
sq.AppendCallback(() =>
{
int spDictIndex2 = 14;
DOTween.To(() => spDictIndex2, x => t.Find("Main/Boat").GetComponent<Image>().sprite = spDict[x], 0, 0.6f);
});
}
}
}
var width = t.Find("Main").GetComponent<RectTransform>().sizeDelta.x - t.Find("Main/Boat").GetComponent<RectTransform>().sizeDelta.x;
var diffWidth = data.currentDistance - mineData.currentDistance + 50;
if (data.currentDistance <= 50)
{
diffWidth = data.currentDistance;
}
else if (rowerType.type == 1 && rowerType.value - data.currentDistance <= 50)
{
diffWidth = 100 - ((int)rowerType.value - data.currentDistance);
}
2022-03-31 18:30:07 +08:00
//if (data.isMine)
//{
// print("diff:" + diffWidth + ";"+ rowerType.type);
//}
if (diffWidth >= 0 && diffWidth <= 100)
2022-03-31 18:30:07 +08:00
{
var tWidth = (diffWidth / 100f) * width;
t.Find("Main/Boat").gameObject.SetActive(true);
//t.Find("Main/Boat").localPosition = new Vector3(25 + tWidth, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z);
sq.Join(t.Find("Main/Boat").DOLocalMoveX(21.5f + tWidth, 0.9f));
}
else
{
t.Find("Main/Boat").localPosition = new Vector3(-21.5f, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z);
t.Find("Main/Boat").gameObject.SetActive(false);
}
sq.Play();
}
for (; i < traceList.Count; i++)
{
traceList[i].userId = 0;
traceList[i].trace.gameObject.SetActive(false);
}
}
private void CompareTraceList(List<Trace> traceList, List<TraceData> list)
{
if (traceList.Count(x => x.userId == 0) == 5) return;
var originUserList = traceList.Select(x => x.userId).ToList();
var newUserList = list.Select(x => x.UserId).ToList();
if (newUserList.Count != 5)
{
for (int i = newUserList.Count; i < 5; i++)
{
newUserList.Add(0);
}
}
var diffRank = new List<int?>();
for (int i = 0; i < 5; i++)
{
int _origin = originUserList[i], _new = newUserList[i];
if (_origin == _new)
{
//相等 则排名没变化
diffRank.Add(0);
}
else
{
//不相等 分情况
var newIndex = originUserList.FindIndex(x => x == _new);
if (newIndex != -1)
{
diffRank.Add(newIndex - _origin);
}
else
{
diffRank.Add(null);
}
}
}
}
private void SetRank(GameObject game, TraceData item,int i)
{
game.transform.Find("Content/Rank").GetComponent<Text>().text = item.currentRank.ToString("00");
game.transform.Find("Content/NickName").GetComponent<Text>().text = item.NickName;
Utils.DisplayImageTempDict(game.transform.Find("Content/Avatar").GetComponent<RawImage>(), item.Avatar, caches);
var _c = countryList.FirstOrDefault(x => item.Country == x.country);
if (_c != null)
{
game.transform.Find("Content/Country").GetComponent<Image>().sprite = Resources.Load<Sprite>(_c.source);
}
2022-03-31 18:30:07 +08:00
int _d = 0, _p = 0;
if (currentSecond < 0 || item.list.Count == 0)
{
2022-03-31 18:30:07 +08:00
}
else if (currentSecond >= 0 && currentSecond < item.list.Count)
{
2022-03-31 18:30:07 +08:00
_d = item.list[currentSecond].Distance;
_p = item.list[currentSecond].Power;
}
else
{
2022-03-31 18:30:07 +08:00
_d = item.list[item.list.Count - 1].Distance;
_p = item.list[item.list.Count - 1].Power;
}
if (item.isMine && rowerType.type == 1 && _d > rowerType.value)
{
_d = (int)rowerType.value;
}
2022-03-31 18:30:07 +08:00
game.transform.Find("Content/Time").GetComponent<Text>().text = $"{_d}M";
game.transform.Find("Content/Power").GetComponent<Text>().text = $"{_p}W";
if (item.isMine)
{
game.transform.Find("Content/Time").GetComponent<Text>().color = Utils.HexToColorHtml("#f93086");
game.transform.Find("Content/Power").GetComponent<Text>().color = Utils.HexToColorHtml("#f93086");
game.transform.Find("Content/NickName").GetComponent<Text>().color = Utils.HexToColorHtml("#f93086");
game.transform.Find("Content/Rank").GetComponent<Text>().color = Utils.HexToColorHtml("#f93086");
}
else
{
game.transform.Find("Content/Time").GetComponent<Text>().color = Utils.HexToColorHtml("#ffffff");
game.transform.Find("Content/Power").GetComponent<Text>().color = Utils.HexToColorHtml("#ffffff");
game.transform.Find("Content/NickName").GetComponent<Text>().color = Utils.HexToColorHtml("#ffffff");
game.transform.Find("Content/Rank").GetComponent<Text>().color = Utils.HexToColorHtml("#ffffff");
}
}
private List<TraceData> Get8UserList()
{
var resRanks = userList;
var ind = resRanks.FindIndex(x => x.UserId == App.CurrentUser.Id);
if (ind >= 8)
{
var tops = resRanks.Take(3).ToList();
List<TraceData> mys = null;
if (resRanks.Count - 1 - ind < 2)
{
mys = resRanks.GetRange(resRanks.Count - 5, 5);
}
else
{
mys = resRanks.GetRange(ind - 2, 5);
}
resRanks = tops.Concat(mys).ToList();
}
else
{
resRanks = resRanks.Take(8).ToList();
}
return resRanks;
}
private void DisplayUserRanks(bool isRefresh = false)
{
if (isRefresh)
{
scrollRank.content.DestroyChildren();
}
var list = Get8UserList();
if (scrollRank.content.childCount == 0)
{
for (int i = 0; i < list.Count; i++)
{
var item = list[i];
var game = Instantiate<GameObject>(rank);
SetRank(game, item, i);
game.transform.SetParent(scrollRank.content);
game.transform.localScale = Vector3.one;
game.SetActive(true);
}
}
else
{
int i = 0;
foreach (Transform t in scrollRank.content)
{
var item = list[i];
SetRank(t.gameObject, item, i);
i++;
}
}
transform.Find("Rower/Modes/Scroll/M2/Rank/MyRank").GetComponent<Text>().text = $"<color=#f93086>{userList.FindIndex(x => x.isMine) + 1}</color> / {userList.Count}";
}
private void AddTouchEvent()
{
pan = new TKPanRecognizer();
pan.gestureRecognizedEvent += (r) =>
{
var startPoint = r.startPoint;
if (((RectTransform)transform.Find("Rower/Modes")).isPointInTransfrom(startPoint))
{
if (scroll.localPosition.x < startPosition.x - (730 / 2)
&& ((RectTransform)transform.Find("RankS")).isPointInTransfrom(startPoint))
{
return;
}
var offset = pan.deltaTranslation;
2022-03-31 18:30:07 +08:00
if (scroll.localPosition.x >= 30 || scroll.localPosition.x <= -760) return;
scroll.localPosition += new Vector3(offset.x, 0, 0);
}
};
pan.gestureCompleteEvent += (r) =>
{
float x = 0;
2022-03-31 18:30:07 +08:00
string selDot = "";
if (Color.Equals(transform.Find("Rower/Dots/d1").GetComponent<Image>().color, Utils.HexToColorHtml("#f93086")))
{
2022-03-31 18:30:07 +08:00
if (scroll.localPosition.x >= startPosition.x - ((730 * 1) / 10))
{
x = startPosition.x;
selDot = "d1";
}
else
{
print(491);
x = startPosition.x - 730;
selDot = "d2";
}
}
2022-03-31 18:30:07 +08:00
else
{
2022-03-31 18:30:07 +08:00
if (scroll.localPosition.x >= startPosition.x - ((730 * 9) / 10))
{
x = startPosition.x;
selDot = "d1";
}
else
{
x = startPosition.x - 730;
selDot = "d2";
}
}
2022-03-31 18:30:07 +08:00
foreach (Transform t in transform.Find("Rower/Dots"))
{
2022-03-31 18:30:07 +08:00
t.GetComponent<Image>().color = Utils.HexToColorHtml("#ffffff");
}
2022-03-31 18:30:07 +08:00
transform.Find($"Rower/Dots/{selDot}").GetComponent<Image>().color = Utils.HexToColorHtml("#f93086");
scroll.DOLocalMoveX(x, 0.5f);
PlayerPrefs.SetFloat("RowerMultiModeLocationX", x);
};
TouchKit.addGestureRecognizer(pan);
2022-03-31 18:30:07 +08:00
print("注册触摸事件");
}
private void OnDestroy()
{
TouchKit.removeAllGestureRecognizers();
}
//交换A,B索引的赛道
void ChangeTrace(int indexA, int indexB)
{
if (indexA >= traceList.Count || indexB >= traceList.Count)
{
return;
}
if (traceList.Count(x => x.trace.gameObject.activeInHierarchy) == 0) return;
Trace a = traceList[indexA], b = traceList[indexB];
//2个排名
//先视觉交换
float aniTime = 0.3f;
Vector3 aloc = a.trace.localPosition;
var sq = DOTween.Sequence();
sq.Join(a.trace.DOLocalMoveY(b.trace.localPosition.y, aniTime));
sq.Join(b.trace.DOLocalMoveY(aloc.y, aniTime));
//逻辑交换
var tmp = traceList[indexA];
traceList[indexA] = traceList[indexB];
traceList[indexB] = tmp;
var sq1 = DOTween.Sequence();
if (traceList.Count(x => x.trace.gameObject.activeInHierarchy) != 5) return;
if (indexA == 1 && indexB == 2)
{
for (int i = 0; i < 5; i++)
{
if (i == 4)
{
sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[4] - 50.4f, aniTime));
}
else
{
sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[i + 1], aniTime));
}
}
sq1.AppendCallback(() =>
{
traceList[4].trace.localPosition = new Vector3(traceList[0].trace.localPosition.x, initialPosYList[0] + 49.5f, traceList[0].trace.localPosition.z);
});
sq1.Append(traceList[4].trace.DOLocalMoveY(initialPosYList[0], aniTime));
sq.Append(sq1);
sq.Play().onComplete = () =>
{
tmp = traceList[4];
for (int i = 4; i >= 1; i--)
{
traceList[i] = traceList[i - 1];
}
traceList[0] = tmp;
};
}
else if (indexA == 2 && indexB == 3)
{
for (int i = 0; i < 5; i++)
{
if (i == 0)
{
sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[0] + 50.4f, aniTime));
}
else
{
sq1.Join(traceList[i].trace.DOLocalMoveY(initialPosYList[i - 1], aniTime));
}
}
sq1.AppendCallback(() =>
{
traceList[0].trace.localPosition = new Vector3(traceList[0].trace.localPosition.x, initialPosYList[4] - 49.5f, traceList[0].trace.localPosition.z);
});
sq1.Append(traceList[0].trace.DOLocalMoveY(initialPosYList[4], aniTime));
sq.Append(sq1);
sq.Play().onComplete = () =>
{
tmp = traceList[0];
for (int i = 0; i < 4; i++)
{
traceList[i] = traceList[i + 1];
}
traceList[4] = tmp;
};
}
}
float timer = 1f;
int currentSecond = -1;
private List<CountryModel> countryList;
public RowerTaskPanel.RowerType rowerType { get; set; }
// Update is called once per frame
void Update()
{
#if UNITY_EDITOR
timer -= Time.deltaTime;
if (timer < 0)
{
//var r = new System.Random();
//int a = r.Next(1, 3);
//print($"{a},{a+1}");
//ChangeTrace(a, a+1);
HandleTimeTick(new RowerChartModel()
{
Distance = 15,
});
timer += 1f;
}
#endif
}
}