powerfun-unity/Assets/Scripts/UI/Prefab/Rower/RowerMultiModeScript.cs
2022-05-31 16:47:21 +08:00

1202 lines
48 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
using Assets.Scripts.UI.UIEffect;
public class RowerMultiModeScript : MonoBehaviour
{
// Start is called before the first frame update
[SerializeField]
GameObject rank,trace;
Transform scroll,m1,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;
Sprite bg_myself { get; set; }
Sprite bg_other { get; set; }
Sprite img_overline_myself { get; set; }
Sprite img_overline_others { get; set; }
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();
m1 = transform.Find("Rower/Modes/Scroll/M1");
m2 = transform.Find("Rower/Modes/Scroll/M2");
currentModeType = PlayerPrefs.GetInt("CurrentModeType");
Transform aniView = currentModeType == 0 ? m1 : m2, followAniView = currentModeType == 0 ? m2 : m1;
aniView.localPosition = new Vector3(0, aniView.localPosition.y, aniView.localPosition.z);
followAniView.localPosition = new Vector3(730, followAniView.localPosition.y, followAniView.localPosition.z);
string selDot = currentModeType == 0 ? "d1" : "d2";
foreach (Transform t in transform.Find("Rower/Dots"))
{
t.GetComponent<Image>().color = Utils.HexToColorHtml("#ffffff");
}
transform.Find($"Rower/Dots/{selDot}").GetComponent<Image>().color = Utils.HexToColorHtml("#f93086");
print($"模块位置:{m1.localPosition.x},{m2.localPosition.x}");
caches = new Dictionary<string, Texture>();
traceList = new List<Trace>();
//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/M1/Rank/Scroll View").GetComponent<ScrollRect>();
//var countryJson = Resources.Load<TextAsset>("UI/flags-mini").text;
//countryList = JsonConvert.DeserializeObject<List<CountryModel>>(countryJson);
//UIManager.Instance.loginRegOptions.GetCountryIndexByCode();
bg_myself = Resources.Load<Sprite>("Images/RowerNew/动画用/bg_myself");
bg_other = Resources.Load<Sprite>("Images/RowerNew/动画用/bg_other");
img_overline_myself = Resources.Load<Sprite>("Images/RowerNew/动画用/img_overline_myself");
img_overline_others = Resources.Load<Sprite>("Images/RowerNew/动画用/img_overline_others");
}
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;
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++)
{
int rank = i + 1, userId = userList[i].UserId;
if (rankDiffDict.ContainsKey(userId))
{
rankDiffDict[userId].rank = rank;
rankDiffDict[userId].diff = userList[i].currentRank - rank;
if (currentSecond % 3 == 0)
{
rankDiffDict[userId].sumdiff = rankDiffDict[userId].diff;
}
else
{
rankDiffDict[userId].sumdiff += rankDiffDict[userId].diff;
}
}
userList[i].currentRank = rank;
}
}
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 class RankDiff
{
public int rank { get; set; }
public int diff { get; set; }
public int sumdiff { get; set; }
}
public Dictionary<int, RankDiff> rankDiffDict;
public async void GetShadowList(RowerTaskPanel.RowerType rowerType, RowerResultModel reRowData)
{
this.rowerType = rowerType;
currentSecond = -1;
//if(Application.internetReachability == NetworkReachability.NotReachable)
var res = reRowData ==null? await ConfigHelper.rowerApi.GetShadowList(rowerType): await ConfigHelper.rowerApi.GetReRowShadowList(reRowData.Id);
shadowList = res.data;
//foreach (var t in traceList)
//{
// t.userId = 0;
// t.trace.gameObject.SetActive(false);
//}
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.Insert(_tmpList.Count / 2, myData);
//_tmpList.Add(myData);
userList = _tmpList.OrderByDescending(x => x.currentDistance).ToList();
rankDiffDict = new Dictionary<int, RankDiff>();
for (int i = 0; i < userList.Count; i++)
{
userList[i].currentRank = i + 1;
rankDiffDict.Add(userList[i].UserId, new RankDiff { rank = userList[i].currentRank, diff = 0 });
}
DisplayUserRanks(true);
DisplayTraces(true);
}
float GetStrokeSpeed(uint rate)
{
//0 10 20 30 35
//0.9 0.8 0.7 0.6 0.5
if (rate < 10) return 0.9f;
else if (rate < 20) return 0.7f;
else if (rate < 30) return 0.5f;
else if (rate < 35) return 0.4f;
else return 0.3f;
}
//标识线
int leftWidth = 0, rightWidth = 100;
private void DisplayTrace(Transform t,TraceData data,TraceData mineData,bool isAni = false)
{
//增加新设计稿逻辑
t.Find("Left").GetComponent<Image>().sprite = data.isMine ? bg_myself : bg_other;
t.Find("Main/Boat/Head").GetComponent<Image>().sprite = data.isMine ? img_overline_myself : img_overline_others;
t.Find("Main/Boat/Head").gameObject.SetActive(data.currentDistance > 0);
t.Find("Main/Rowed").GetComponent<Image>().color = data.isMine ? Utils.HexToColorHtml("#f9308699") : Utils.HexToColorHtml("#27dfe399");
t.GetComponent<Image>().color = data.isMine ? Utils.HexToColorHtml("#f930861a") : Utils.HexToColorHtml("#27dfe31a");
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);
}
t.Find("Left/Avatar/Country").GetComponent<Image>().ShowImageWithTexture(UIManager.Instance.loginRegOptions.GetCountryImage(data.Country));
t.Find("Left/NickName").GetComponent<Text>().text = data.NickName;
if (data.list.Count == 0 || !GetComponent<RowerHomeScript>().openTimer)
{
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");
}
t.Find("Mine").gameObject.SetActive(data.isMine);
var diff = data.currentDistance - mineData.currentDistance;
if (diff > 0)
{
t.Find("Main/Diff").GetComponent<Text>().text = diff.ToString("+#0M");
}
else if (diff == 0)
{
if (data.isMine)
{
var originstr = $"<color=#f93086>{userList.FindIndex(x => x.isMine) + 1}</color> / {userList.Count}";
var str = originstr;
var mytxt = t.Find("Main/Diff").GetComponent<Text>();
if (rankDiffDict[data.UserId].diff != 0)
{
var myranksq = DOTween.Sequence();
myranksq.AppendCallback(() =>
{
mytxt.DOFade(0, 0);
if (rankDiffDict[data.UserId].diff > 0) str = "<color=#f93086>↑</color>";
else if (rankDiffDict[data.UserId].diff < 0) str = "<color=#2fb95b>↓</color>";
mytxt.text = str;
});
myranksq.Append(mytxt.DOFade(1, 0.2f));
myranksq.AppendInterval(0.3f);
myranksq.Append(mytxt.DOFade(0, 0.2f));
myranksq.AppendCallback(() =>
{
mytxt.text = originstr;
});
myranksq.Append(mytxt.DOFade(1, 0.2f));
myranksq.Play();
}
else
{
mytxt.text = originstr;
}
}
else
{
t.Find("Main/Diff").GetComponent<Text>().text = 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");
}
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 (mineData.currentDistance <= 50)
{
diffWidth = data.currentDistance;
}
else if (rowerType.type == 1 && rowerType.value - mineData.currentDistance <= 50)
{
diffWidth = 100 - ((int)rowerType.value - data.currentDistance);
}
Func<float, bool> is0to100 = a => a >= 0 && a <= 100;
//标识线显示
if (data.isMine)
{
Transform leftLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineMeterLeft"),
rightLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineMeterRight"),
finishLine = transform.Find("Rower/Modes/Scroll/M2/Track/TraceContainer/LineFinish");
if (rightWidth <= mineData.currentDistance)
{
var tmp = leftLine;
leftLine = rightLine;
rightLine = tmp;
leftLine.name = "LineMeterLeft";
rightLine.name = "LineMeterRight";
}
leftWidth = (mineData.currentDistance / 100) * 100;
rightWidth = leftWidth + 100;
leftLine.gameObject.SetActive(leftWidth != 0);
int leftDiff = leftWidth - mineData.currentDistance, rightDiff = rightWidth - mineData.currentDistance;
leftLine.Find("Text").GetComponent<Text>().text = $"{leftWidth}M";
rightLine.Find("Text").GetComponent<Text>().text = $"{rightWidth}M";
float leftPositionX = ((diffWidth + leftDiff) / 100f) * width + 43,
rightPositionX = ((diffWidth + rightDiff) / 100f) * width + 43;
if (leftPositionX >= -30 && leftPositionX<=415)
{
StartCoroutine(MoveLine(leftLine, leftLine.localPosition, new Vector3(leftPositionX - 207.5f, leftLine.localPosition.y, leftLine.localPosition.z)));
//leftLine.DOLocalMoveX(leftPositionX - 207.5f, 0.9f);
}
else
{
leftLine.localPosition = new Vector3(leftPositionX - 207.5f, leftLine.localPosition.y, leftLine.localPosition.z);
}
if (rightPositionX >= 0 && rightPositionX <= 415)
{
StartCoroutine(MoveLine(rightLine, rightLine.localPosition, new Vector3(rightPositionX - 207.5f, rightLine.localPosition.y, rightLine.localPosition.z)));
//rightLine.DOLocalMoveX(rightPositionX - 207.5f, 0.9f);
}
else
{
rightLine.localPosition = new Vector3(rightPositionX - 207.5f, rightLine.localPosition.y, rightLine.localPosition.z);
}
if (rowerType.type == 1)
{
finishLine.gameObject.SetActive(true);
//终点线
float finishWidth = rowerType.value;
leftLine.gameObject.SetActive(Math.Abs(finishWidth - leftWidth) > 10 && leftWidth != 0);
rightLine.gameObject.SetActive(Math.Abs(finishWidth - rightWidth) > 10);
float finishDiff = finishWidth - mineData.currentDistance;
float finishPositionX = ((diffWidth + finishDiff) / 100f) * width + 43;
if (finishPositionX >= 0 && finishPositionX <= 415)
{
StartCoroutine(MoveLine(finishLine, finishLine.localPosition, new Vector3(finishPositionX - 207.5f, finishLine.localPosition.y, finishLine.localPosition.z)));
//finishLine.DOLocalMoveX(finishPositionX - 207.5f, 0.9f);
}
else
{
finishLine.localPosition = new Vector3(finishPositionX - 207.5f, finishLine.localPosition.y, finishLine.localPosition.z);
}
}
else
{
finishLine.gameObject.SetActive(false);
rightLine.gameObject.SetActive(true);
}
}
//if(!data.isMine) diffWidth = 101;
if (is0to100(diffWidth))
{
var tWidth = (diffWidth / 100f) * width;
t.Find("Main/Boat").gameObject.SetActive(true);
t.Find("Left/Rank").GetComponent<Text>().text = (userList.FindIndex(x => x.UserId == data.UserId) + 1).ToString("00");
if (isAni)
{
t.Find("Main/Boat").DOLocalMoveX(21.5f + tWidth, 0.9f);
var rowed = t.Find("Main/Rowed").GetComponent<RectTransform>();
//rowed.GetComponent<UIGradient>().color1 = data.isMine ? Utils.HexToColorHtml("#f9308633") : Utils.HexToColorHtml("#27bac033");
//rowed.GetComponent<UIGradient>().color2 = data.isMine ? Utils.HexToColorHtml("#f930864d") : Utils.HexToColorHtml("#27bac04d");
rowed.DOSizeDelta(new Vector2(tWidth, rowed.sizeDelta.y), 0.9f);
}
else
{
t.Find("Main/Boat").localPosition = new Vector3(21.5f + tWidth, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z);
}
}
else
{
t.Find("Main/Boat").localPosition = new Vector3(diffWidth < 0 ? -21.5f : 21.5f + width, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z);
t.Find("Main/Boat").gameObject.SetActive(false);
var rowed = t.Find("Main/Rowed").GetComponent<RectTransform>();
rowed.sizeDelta = new Vector2(diffWidth < 0 ? 0 : t.Find("Main").GetComponent<RectTransform>().sizeDelta.x, rowed.sizeDelta.y);
}
if (isAni && currentSecond >= 0 && currentSecond < data.list.Count && currentSecond%2 == 0)
{
var ani = DOTween.Sequence();
var _d = data.list[currentSecond];
if (currentSecond > 0 && _d.Rate > 0)
{
var spDict = GetComponent<RowerHomeScript>().spriteDict2;
int spDictIndex = 0;
ani.Join(DOTween.To(() => spDictIndex, x => t.Find("Main/Boat/Image").GetComponent<Image>().sprite = spDict[x], 14, 0.495f));
ani.AppendCallback(() =>
{
int spDictIndex2 = 14;
DOTween.To(() => spDictIndex2, x => t.Find("Main/Boat/Image").GetComponent<Image>().sprite = spDict[x], 0, 1.485f);
});
ani.Play();
//var _pred = data.list[currentSecond - 1];
//if (_pred.StrokeCount != _d.StrokeCount)
//{
// //上次划桨次数和这次不一样 说明需要划桨一次
// var spDict = GetComponent<RowerHomeScript>().spriteDict;
// int spDictIndex = 0;
// ani.Join(DOTween.To(() => spDictIndex, x => t.Find("Main/Boat").GetComponent<Image>().sprite = spDict[x], 14, 0.2f));
// ani.AppendCallback(() =>
// {
// int spDictIndex2 = 14;
// DOTween.To(() => spDictIndex2, x => t.Find("Main/Boat").GetComponent<Image>().sprite = spDict[x], 0, 0.4f);
// });
// ani.Play();
//}
}
}
}
private IEnumerator MoveLine(Transform line, Vector3 originLocation, Vector3 targetLocation)
{
float t = 0;
while (t < 1)
{
t += Time.deltaTime;
Vector3 v = Vector3.Lerp(originLocation, targetLocation, t);
line.localPosition = v;
yield return new WaitForEndOfFrame();
}
}
private int getStartIndexByMineData()
{
var list = userList;
var mineIndex = list.FindIndex(x => x.isMine);
if (mineIndex < 2) return 0;
else if (mineIndex >= list.Count - 2)
{
mineIndex = list.Count - 5;
if (mineIndex < 0) mineIndex = 0;
return mineIndex;
}
else
{
return mineIndex - 2;
}
}
private int[] getStartRangeByMineData()
{
var list = userList;
var mineIndex = list.FindIndex(x => x.isMine);
if (mineIndex < 2)
{
int sindex = 0,eIndex = 4;
if (eIndex > list.Count - 1) eIndex = list.Count - 1;
return new int[] { sindex, eIndex };
}
else if (mineIndex >= list.Count - 2)
{
mineIndex = list.Count - 5;
if (mineIndex < 0) mineIndex = 0;
return new int[] { mineIndex, list.Count - 1 };
}
else
{
return new int[] { mineIndex - 2, mineIndex + 2 };
}
}
private Color RandomColor()
{
//随机颜色的HSV值,饱和度不变只改变H值
//H、S、V三个值的范围都是在0~1之间
float h = UnityEngine.Random.Range(0f, 1f);//随机值
float s = 0.3f;//设置饱和度为定值
Color color = Color.HSVToRGB(h, s, 1);
return color;
}
private void DisplayTraces(bool isRefresh = false)
{
var list = userList;
var listc = transform.Find("Rower/Modes/Scroll/M2/Track/Container/List");
var mineData = list.FirstOrDefault(x => x.isMine);
var sindex = getStartIndexByMineData();
int i = 0;
if (isRefresh)
{
traceList.Clear();
listc.localPosition = new Vector3(0, 115.5f);
listc.GetComponent<RectTransform>().sizeDelta = new Vector2(550f, 43 + 47 * (list.Count - 1));
print(listc.localPosition.ToString());
listc.DestroyChildren();
for (i = 0; i < list.Count; i++)
{
var data = list[i];
var g = Instantiate<GameObject>(trace);
g.name = i.ToString();
DisplayTrace(g.transform.Find("T1/p1"), data, mineData);
g.transform.parent = listc;
g.SetActive(true);
g.transform.localScale = Vector3.one;
g.transform.localPosition = new Vector3(0, -21.5f - 47f * i);
//g.transform.Find("T1/p1").GetComponent<Image>().color = RandomColor();
traceList.Add(new Trace { userId = data.UserId, trace = g.transform.Find("T1") });
}
listc.DOLocalMoveY(47 * sindex + 115.5f, 0.8f);
return;
}
if (currentSecond % 3 == 2)
{
var allsq = DOTween.Sequence();
// -21.5
allsq.Join(listc.DOLocalMoveY(47 * sindex + 115.5f, 1.5f));
var sq = DOTween.Sequence();
for (i = 0; i < list.Count; i++)
{
var data = list[i];
var t = traceList.FirstOrDefault(x => x.userId == data.UserId).trace;
var diff = rankDiffDict[data.UserId];
DisplayTrace(t.Find("p1"), data, mineData, true);
if (diff.sumdiff != 0)
{
if (diff.sumdiff > 0)
{
t.parent.SetAsLastSibling();
}
//t.parent.gets
sq.Join(t.parent.DOLocalMoveY(-47 * (diff.rank - 1) - 21.5f, 1.5f));
var sq1 = DOTween.Sequence();
if (diff.sumdiff < 0)
{
sq1.Append(t.GetComponent<CanvasGroup>().DOFade(0.2f, 0.75f));
sq1.Append(t.GetComponent<CanvasGroup>().DOFade(1f, 0.75f));
}
sq.Join(sq1);
//sq.SetEase(Ease.InOutCubic);
//sq.Append(t.GetComponent)
}
//t.parent.name = i.ToString();
}
allsq.Join(sq);
allsq.Play();
}
else
{
for (i = 0; i < list.Count; i++)
{
var data = list[i];
var t = traceList.FirstOrDefault(x => x.userId == data.UserId).trace;
DisplayTrace(t.Find("p1"), data, mineData, true);
}
}
//for (i = 0; i < list.Count; i++)
//{
// traceList[i].trace = traceList[i].trace.parent.parent.Find($"{i.ToString()}/T1");
//}
//return;
//if (currentSecond % 2 == 1)
//{
// //0-0.5
// allsq.Append(listc.DOLocalMoveY(47 * sindex + 115.5f, 0.5f));
// var indexRange = getStartRangeByMineData();
// var sq = DOTween.Sequence();
// for (i = 0; i < list.Count; i++)
// {
// var sq1 = DOTween.Sequence();
// var data = list[i];
// var t = traceList[i].trace;
// if (i >= indexRange[0] && i <= indexRange[1])
// {
// //需要做动画
// if (data.UserId != traceList[i].userId)
// {
// //var mysq = DOTween.Sequence();
// //if (traceList[i].userId == App.CurrentUser.Id)
// //{
// // mysq.Join(t.GetComponent<CanvasGroup>().DOFade(0, 0.5f).SetEase(Ease.OutSine));
// //}
// //if (data.UserId != App.CurrentUser.Id)
// //{
// // sq1.Append(t.GetComponent<CanvasGroup>().DOFade(0.68f, 0.45f).SetEase(Ease.InSine));
// // sq1.AppendCallback(() =>
// // {
// // DisplayTrace(t.Find("p1"), data, mineData);
// // });
// // sq1.Append(t.GetComponent<CanvasGroup>().DOFade(1, 0.45f));
// //}
// //else
// //{
// // mysq.Join(t.GetComponent<RowerTraceAnimated>().startAnimation(0.5f, () =>
// // {
// // DisplayTrace(t.Find("p2"), data, mineData);
// // }, rankDiffDict[data.UserId].sumdiff >= 0 ? 1 : 0));
// // allsq.Append(mysq);
// //}
// sq1.Append(t.GetComponent<RowerTraceAnimated>().startAnimation(0.8f, () =>
// {
// DisplayTrace(t.Find("p2"), data, mineData);
// }, rankDiffDict[data.UserId].sumdiff >= 0 ? 1 : 0).SetEase(Ease.OutBounce));
// //sq1.Append(t.GetComponent<RowerTraceAnimated>().startAnimation(0.8f, () =>
// //{
// // DisplayTrace(t.Find("p2"), data, mineData);
// //}, 0).SetEase(Ease.OutBounce));
// }
// else
// {
// sq1.AppendCallback(() =>
// {
// DisplayTrace(t.Find("p1"), data, mineData, true);
// });
// }
// traceList[i].userId = data.UserId;
// }
// else
// {
// DisplayTrace(t.Find("p1"), data, mineData);
// }
// sq.Join(sq1);
// }
// allsq.Append(sq);
// allsq.Play();
//}
//else
//{
// for (i = 0; i < list.Count; i++)
// {
// var data = list[i];
// var _trace = traceList.FirstOrDefault(x=>x.userId == data.UserId);
// if (_trace != null)
// {
// DisplayTrace(_trace.trace.Find("p1"), data, mineData, true);
// }
// }
//}
////for (i = 0; i < list.Count; i++)
////{
//// var sq = DOTween.Sequence();
//// var item = traceList[i];
//// var data = list[i];
//// var t = item.trace.Find("p2");
////}
//return;
//var list = HandleData();
//CompareTraceList(traceList, list);
//for (i = 0; i < list.Count;i++)
//{
// var sq = DOTween.Sequence();
// var item = traceList[i];
// var data = list[i];
// var t = item.trace.Find("p2");
// TweenCallback callback = () =>
// {
// };
// if (!item.trace.gameObject.activeInHierarchy)
// {
// t = item.trace.Find("p1");
// item.trace.gameObject.SetActive(true);
// callback();
// continue;
// }
// //var rotatesq = item.trace.GetComponent<RowerTraceAnimated>().startAnimation(0.8f, callback);
// //if (rotatesq != null)
// //{
// // sq.Join(rotatesq);
// //}
// var isRotate = item.userId != data.UserId;
// if (isRotate)
// {
// t = item.trace.Find("p2");
// var rotatesq = item.trace.GetComponent<RowerTraceAnimated>().startAnimation(0.8f, callback);
// if (rotatesq != null)
// {
// sq.Join(rotatesq);
// }
// }
// else
// {
// t = item.trace.Find("p1");
// 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);
// }
// //if (data.isMine)
// //{
// // print("diff:" + diffWidth + ";"+ rowerType.type);
// //}
// if (diffWidth >= 0 && diffWidth <= 100)
// {
// 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);
// if (isRotate)
// {
// t.Find("Main/Boat").localPosition = new Vector3(21.5f + tWidth, t.Find("Main/Boat").localPosition.y, t.Find("Main/Boat").localPosition.z);
// }
// else
// {
// 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);
// }
//排名变化
//var diffTransfrom = transform.Find("Rower/Modes/Scroll/M2/Track/RankDiff"+item.trace.name).GetComponent<Text>();
//if (rankDiffDict[data.UserId].diff > 0)
//{
// diffTransfrom.text = "+" + rankDiffDict[data.UserId].diff;
// var rankDiffSQ = DOTween.Sequence();
// rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#bd362bff"), 0.3f));
// rankDiffSQ.AppendInterval(0.4f);
// rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#ffffff00"), 0.3f));
// sq.Join(rankDiffSQ);
//}
//else if (rankDiffDict[data.UserId].diff < 0)
//{
// diffTransfrom.text = "" + rankDiffDict[data.UserId].diff;
// var rankDiffSQ = DOTween.Sequence();
// rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#27bac0ff"), 0.3f));
// rankDiffSQ.AppendInterval(0.4f);
// rankDiffSQ.Append(diffTransfrom.DOColor(Utils.HexToColorHtml("#ffffff00"), 0.3f));
// sq.Join(rankDiffSQ);
//}
//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);
//}
int _d = 0, _p = 0;
if (currentSecond < 0 || item.list.Count == 0)
{
}
else if (currentSecond >= 0 && currentSecond < item.list.Count)
{
_d = item.list[currentSecond].Distance;
_p = item.list[currentSecond].Power;
}
else
{
_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;
}
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/M1/Rank/MyRank").GetComponent<Text>().text = $"<color=#f93086>{userList.FindIndex(x => x.isMine) + 1}</color> / {userList.Count}";
}
// 0 单人 1 影子
int currentModeType = 0;
private void AddTouchEvent()
{
pan = new TKPanRecognizer();
//0 730 0的位置是显示位置
Sequence sq = DOTween.Sequence();
pan.gestureRecognizedEvent += (r) =>
{
if (sq.IsActive() && sq.IsPlaying()) return;
var startPoint = r.startPoint;
if (((RectTransform)transform.Find("Rower/Modes")).isPointInTransfrom(startPoint)|| ((RectTransform)transform.Find("RankS")).isPointInTransfrom(startPoint))
{
//if (currentModeType == 1 && ((RectTransform)transform.Find("RankS")).isPointInTransfrom(startPoint))
//{
// return;
//}
var offset = pan.deltaTranslation;
//if (scroll.localPosition.x >= 30 || scroll.localPosition.x <= -760) return;
Transform aniView = currentModeType == 0 ? m1 : m2, followAniView = currentModeType == 1 ? m1 : m2;
aniView.localPosition += new Vector3(offset.x, 0, 0);
followAniView.localPosition = aniView.localPosition + new Vector3((aniView.localPosition.x < 0 ? 1 : -1) * 730, 0, 0);
//scroll.localPosition += new Vector3(offset.x, 0, 0);
}
};
pan.gestureCompleteEvent += (r) =>
{
if (sq.IsActive() && sq.IsPlaying()) return;
sq = DOTween.Sequence();
Transform aniView = currentModeType == 0 ? m1 : m2, followAniView = currentModeType == 1 ? m1 : m2;
if (Math.Abs(aniView.localPosition.x) <= 30)
{
sq.Join(aniView.DOLocalMoveX(0, 0.5f));
if (aniView.localPosition.x != 0) sq.Join(followAniView.DOLocalMoveX(aniView.localPosition.x > 0 ? -730 : 730, 0.5f));
}
else
{
if (aniView.localPosition.x > 30)
{
sq.Join(aniView.DOLocalMoveX(730, 0.5f));
}
else if (aniView.localPosition.x < -30)
{
sq.Join(aniView.DOLocalMoveX(-730, 0.5f));
}
sq.Join(followAniView.DOLocalMoveX(0, 0.5f));
sq.onComplete = () =>
{
currentModeType = (currentModeType + 1) % 2;
string selDot = currentModeType == 0 ? "d1" : "d2";
foreach (Transform t in transform.Find("Rower/Dots"))
{
t.GetComponent<Image>().color = Utils.HexToColorHtml("#ffffff");
}
transform.Find($"Rower/Dots/{selDot}").GetComponent<Image>().color = Utils.HexToColorHtml("#f93086");
PlayerPrefs.SetInt("CurrentModeType", currentModeType);
};
}
sq.Play();
return;
//float x = 0;
//string selDot = "";
//if (Color.Equals(transform.Find("Rower/Dots/d1").GetComponent<Image>().color, Utils.HexToColorHtml("#f93086")))
//{
// if (scroll.localPosition.x >= startPosition.x - ((730 * 1) / 10))
// {
// x = startPosition.x;
// selDot = "d1";
// }
// else
// {
// print(491);
// x = startPosition.x - 730;
// selDot = "d2";
// }
//}
//else
//{
// if (scroll.localPosition.x >= startPosition.x - ((730 * 9) / 10))
// {
// x = startPosition.x;
// selDot = "d1";
// }
// else
// {
// x = startPosition.x - 730;
// selDot = "d2";
// }
//}
//foreach (Transform t in transform.Find("Rower/Dots"))
//{
// t.GetComponent<Image>().color = Utils.HexToColorHtml("#ffffff");
//}
//transform.Find($"Rower/Dots/{selDot}").GetComponent<Image>().color = Utils.HexToColorHtml("#f93086");
//scroll.DOLocalMoveX(x, 0.5f);
//PlayerPrefs.SetFloat("RowerMultiModeLocationX", x);
};
TouchKit.addGestureRecognizer(pan);
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; }
int _testdis = 0;
// Update is called once per frame
void Update()
{
#if UNITY_EDITOR
return;
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);
_testdis += 5;
HandleTimeTick(new RowerChartModel()
{
Distance = _testdis,
Rate = 35,
});
timer += 1f;
}
#endif
}
}