/// <summary> /// 分散动画 /// </summary> private void dispersedAnim() { int listCount = mListObj.Count; for (int i = 0; i < listCount; i++) { GameObject itemObj = mListObj[i]; Transform itemTF = itemObj.transform; //设置层级 JigsawContainerCpt containerCpt = itemTF.GetComponent <JigsawContainerCpt>(); if (containerCpt == null) { continue; } containerCpt.setSortingOrder(listCount - i); //设置动画 Tweener tweener = itemTF .DOScale(new Vector3(1, 1, 1), animOffsetTime * i) .SetDelay(mPrependTime) .OnComplete(delegate() { GameStartAnimationManager.PuzzlesStartPre(itemObj); }); } Tweener gameStartTweener = mGameStartControl.transform .DOScale(new Vector3(1, 1, 1), mPrependTime + listCount * animOffsetTime) .OnComplete(delegate() { mGameStartControl.gameStart(); }); }
/// <summary> /// 当鼠标按下时触发(其实就是初始化_vec3Offset值,需要注意的是一切的位置坐标都是为了得到这个差值) /// </summary> private void onMouseDown() { //获取鼠标相对于摄像头的点击位置 Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); Vector2 mousePos2D = new Vector2(mousePos.x, mousePos.y); hitRC = Physics2D.Raycast(mousePos2D, Vector2.zero); if (hitRC.collider != null && hitRC.transform.GetComponent <JigsawContainerCpt>() != null) { Collider2D jigsawCollider = hitRC.collider; Transform jigsawTransform = jigsawCollider.transform; //让被选中的物体停止移动 Rigidbody2D baseRB = jigsawTransform.GetComponent <Rigidbody2D>(); baseRB.velocity = Vector3.zero; baseRB.constraints = RigidbodyConstraints2D.FreezeAll; baseRB.constraints = RigidbodyConstraints2D.None; //在鼠标按下时,鼠标和物体在控件坐标在空间上的位置差 jigsawContainerCpt = jigsawTransform.GetComponent <JigsawContainerCpt>(); if (jigsawContainerCpt != null) { isSelect = true; vec3Offset = jigsawTransform.position - new Vector3(mousePos.x, mousePos.y); jigsawContainerCpt.setIsSelect(true); } } }
/// <summary> /// 靠拢动画 /// </summary> private void closureAnim() { int listCount = mListObj.Count; for (int i = 0; i < listCount; i++) { GameObject itemObj = mListObj[i]; Transform itemTF = itemObj.transform; //设置层级 JigsawContainerCpt containerCpt = itemTF.GetComponent <JigsawContainerCpt>(); if (containerCpt == null) { continue; } containerCpt.setSortingOrder(listCount - i); //设置动画 Tweener tweener = itemTF .DOMove(startPosition, closeureTime) .SetDelay(mPrependTime + animOffsetTime * i); if (i.Equals(listCount - 1)) { tweener.OnComplete(dispersedAnim); } } }
/// <summary> /// 创建漏斗 /// </summary> private void buildFunnel() { int listCount = mListObj.Count; for (int i = 0; i < listCount; i++) { GameObject itemObj = mListObj[i]; //设置层级 JigsawContainerCpt containerCpt = itemObj.GetComponent <JigsawContainerCpt>(); if (containerCpt == null) { continue; } containerCpt.setSortingOrder(listCount - i); float picW = mGameStartControl.picAllWith; float picH = mGameStartControl.picAllHigh; float moveX = DevUtil.getRandomFloat(-picW / 2f, picW / 2f); float rangY = (picH / 2f) / ((picW / 2f) / ((picW / 2f) - (Mathf.Abs(moveX)))); float moveY = DevUtil.getRandomFloat((picH / 2f) - rangY, picH / 2f); itemObj .transform .DOMove(new Vector3(moveX, moveY), mBuildFunnelTime) .SetDelay(mPrependTime); } mGameStartControl.transform .DOScale(new Vector3(1, 1, 1), mPrependTime + mBuildFunnelTime) .OnComplete(delegate() { moveToMouth(); }); }
/// <summary> /// 创建拼图 /// </summary> /// <param name="jigsawInfoData"></param> private void createJigsaw(JigsawStyleEnum jigsawStyle, Texture2D pic2D, int horizontalNumber, int verticalJigsawNumber) { //创建拼图数据 listJigsawBean = CreateJigsawDataUtils.createJigsawDataList(jigsawStyle, horizontalNumber, verticalJigsawNumber, pic2D); //创建拼图 CreateJigsawGameObjUtil.createJigsawGameObjList(listJigsawBean, pic2D); containerList = CreateJigsawContainerObjUtil.createJigsawContainerObjList(listJigsawBean); //初始化拼图位置 for (int i = 0; i < listJigsawBean.Count; i++) { JigsawBean item = listJigsawBean[i]; Vector3 jigsawPosition = new Vector3( item.MarkLocation.x * item.JigsawWith - item.JigsawWith * horizontalNumber / 2f + item.JigsawWith / 2f, item.MarkLocation.y * item.JigsawHigh - item.JigsawHigh * verticalJigsawNumber / 2f + item.JigsawHigh / 2f ); containerList[i].transform.position = jigsawPosition; //设置起始位置和角度 JigsawContainerCpt containerCpt = containerList[i].transform.GetComponent <JigsawContainerCpt>(); if (containerCpt != null) { containerCpt.startPosition = jigsawPosition; containerCpt.startRotation = containerList[i].transform.rotation; } } }
/// <summary> /// 创建拼图容器对象 /// </summary> /// <param name="jigsawData"></param> /// <returns></returns> public static GameObject createJigsawContainerObj(JigsawBean jigsawData) { GameObject jigsawGameObj = JigsawContainerGameObjBuilder.buildJigsawContainerObj(); JigsawContainerCpt containerCpt = jigsawGameObj.GetComponent <JigsawContainerCpt>(); if (jigsawData != null) { containerCpt.addJigsaw(jigsawData); } return(jigsawGameObj); }
public override void startAnim() { float radius = 0; if (mGameStartControl.picAllWith > mGameStartControl.picAllHigh) { radius = mGameStartControl.picAllHigh; } else { radius = mGameStartControl.picAllWith; } int listCount = mListObj.Count; List <Vector3> listCircleVec = GeometryUtil.getCircleVertices(mStartPosition, radius * 1.9f, listCount, true, CircleStartVectorEnum.Left); int circleCount = listCircleVec.Count; for (int i = 0; i < listCount; i++) { GameObject itemObj = mListObj[i]; //设置层级 JigsawContainerCpt containerCpt = itemObj.transform.GetComponent <JigsawContainerCpt>(); if (containerCpt == null) { continue; } containerCpt.setSortingOrder(listCount - i); // int mListMoveCount= DevUtil.getRandomInt(1, circleCount); Vector3[] listMove = new Vector3[mListMoveCount]; for (int f = 0; f < mListMoveCount; f++) { int randomPosition = DevUtil.getRandomInt(0, circleCount - 1); listMove[f] = listCircleVec[randomPosition]; } //开始run itemObj.transform .DOPath(listMove, mRunTime) .SetDelay(mPrependTime) .OnComplete(delegate() { GameStartAnimationManager.PuzzlesStartPre(itemObj); }); } Tweener gameStartTweener = mGameStartControl.transform .DOScale(new Vector3(1, 1, 1), mPrependTime + mRunTime) .OnComplete(delegate() { mGameStartControl.gameStart(); }); }
private void decomposeAnim() { if (mListObj == null) { return; } int listCount = mListObj.Count; float radius = 0; if (mGameStartControl == null) { return; } if (mGameStartControl.picAllWith > mGameStartControl.picAllHigh) { radius = mGameStartControl.picAllHigh; } else { radius = mGameStartControl.picAllWith; } List <Vector3> listCircleVec = GeometryUtil.getCircleVertices(startPosition, radius * 1.9f, listCount, true, CircleStartVectorEnum.Left); for (int i = 0; i < listCount; i++) { GameObject itemObj = mListObj[i]; Transform itemTF = itemObj.transform; //设置层级 JigsawContainerCpt containerCpt = itemTF.GetComponent <JigsawContainerCpt>(); if (containerCpt == null) { continue; } containerCpt.setSortingOrder(listCount - i); //设置动画 Tweener tweener = itemTF .DOMove(listCircleVec[i], moveTime) .SetDelay(mPrependTime); if (i.Equals(listCount - 1)) { tweener.OnComplete(rotateAnim); } } }
/// <summary> /// 自动完成拼图 /// </summary> public static void CompletePuzzles(BaseMonoBehaviour content) { CommonData.GameStatus = 3; CommonData.IsCheating = true; JigsawContainerCpt[] cptList = UnityEngine.Object.FindObjectsOfType <JigsawContainerCpt>(); if (cptList == null || cptList.Length == 0) { return; } //设置不可在拖拽 CommonData.IsDargMove = false; JigsawContainerCpt tempCpt = cptList[0]; content.StartCoroutine(delayComplete(content, cptList, tempCpt, 10f)); }
static IEnumerator delayComplete(BaseMonoBehaviour content, JigsawContainerCpt[] cptList, JigsawContainerCpt tempCpt, float mergeTime) { foreach (JigsawContainerCpt itemCpt in cptList) { Rigidbody2D itemRB = itemCpt.GetComponent <Rigidbody2D>(); if (itemCpt != null) { //设置质量为0 防止动画时错位 itemRB.velocity = Vector3.zero; //顺便冻结缸体 itemRB.constraints = RigidbodyConstraints2D.FreezeAll; } CompositeCollider2D itemCollider = itemCpt.GetComponent <CompositeCollider2D>(); if (itemCollider != null) { UnityEngine.Object.Destroy(itemCollider); } } yield return(new WaitForEndOfFrame()); for (int i = 0; i < cptList.Length; i++) { if (mergeTime > 5) { tempCpt.transform.position = tempCpt.startPosition; tempCpt.transform.localRotation = tempCpt.startRotation; } JigsawContainerCpt itemCpt = cptList[i]; itemCpt.isSelect = false; // 添加拼图碎片到容器里 if (cptList[i] != tempCpt) { tempCpt.addJigsawList(itemCpt.listJigsaw); //位置纠正 tempCpt.jigsawLocationCorrect(mergeTime, itemCpt.listJigsaw); // 最后删除当前容器 UnityEngine.Object.Destroy(itemCpt.gameObject); } yield return(new WaitForSeconds(0.1f)); } tempCpt.mergeDeal(mergeTime); }
/// <summary> /// 读取拼图进度 /// </summary> /// <param name="content"></param> /// <param name="progressBean"></param> public static void setGameProgress(BaseMonoBehaviour content, PuzzlesProgressBean progressBean) { JigsawContainerCpt[] cptList = UnityEngine.Object.FindObjectsOfType <JigsawContainerCpt>(); if (cptList == null || cptList.Length == 0) { return; } List <PuzzlesProgressItemBean> progress = progressBean.progress; foreach (PuzzlesProgressItemBean itemProgress in progress) { JigsawContainerCpt tempCpt = null; //其次需要合并的子对象 List <JigsawContainerCpt> tempListCpt = new List <JigsawContainerCpt>(); foreach (JigsawContainerCpt itemCpt in cptList) { //首先获取父对象 if (itemCpt.listJigsaw[0].MarkLocation == itemProgress.markPostion) { tempCpt = itemCpt; } foreach (Vector2 listPuzzleItem in itemProgress.listPuzzles) { if (listPuzzleItem == itemCpt.listJigsaw[0].MarkLocation) { tempListCpt.Add(itemCpt); } } } JigsawContainerCpt[] tempArraryCpt = DevUtil.listToArray(tempListCpt); if (tempCpt != null) { //设置不可在拖拽 CommonData.IsDargMove = false; content.StartCoroutine(delayComplete(content, tempArraryCpt, tempCpt, 1f)); } } }
/// <summary> /// 碰撞处理 /// </summary> /// <param name="collision"></param> private void collisionCheck(Collider2D collision) { if (!isOpenMergeCheck) { return; } if (!isSelect) { return; } //获取被撞物体和其父对象 JigsawContainerCpt collisionJCC = collision.gameObject.GetComponent <JigsawContainerCpt>(); if (collisionJCC == null) { return; } if (checkMerge(collisionJCC)) { //设置不可在拖拽 CommonData.IsDargMove = false; isSelect = false; //设置质量为0 防止动画时错位 Rigidbody2D collisionRB = collisionJCC.GetComponent <Rigidbody2D>(); Rigidbody2D thisRB = gameObject.GetComponent <Rigidbody2D>(); if (collisionRB != null && thisRB != null) { collisionRB.velocity = Vector3.zero; thisRB.velocity = Vector3.zero; //顺便冻结缸体 collisionRB.constraints = RigidbodyConstraints2D.FreezeAll; thisRB.constraints = RigidbodyConstraints2D.FreezeAll; // 添加拼图碎片到碰撞容器里 collisionJCC.addJigsawList(listJigsaw); collisionJCC.jigsawLocationCorrect(mergeAnimDuration, listJigsaw); } collisionJCC.mergeDeal(mergeAnimDuration); // 最后删除当前容器 Destroy(gameObject); } }
private void changeAnim() { int listCount = mListObj.Count; List <Vector3> otherListPosition = new List <Vector3>(); for (int i = 0; i < listCount; i++) { otherListPosition.Add(mListObj[i].transform.position); } for (int i = 0; i < listCount; i++) { GameObject itemObj = mListObj[i]; Transform itemTF = itemObj.transform; //设置层级 JigsawContainerCpt containerCpt = itemTF.GetComponent <JigsawContainerCpt>(); if (containerCpt == null) { continue; } containerCpt.setSortingOrder(listCount - i); int changeRandom = DevUtil.getRandomInt(0, otherListPosition.Count - 1); Vector3 changePosition = otherListPosition[changeRandom]; itemTF .DOMove(changePosition, changeTime) .SetDelay(mPrependTime) .OnComplete(delegate() { GameStartAnimationManager.PuzzlesStartPre(itemObj); }); otherListPosition.Remove(changePosition); } Tweener gameStartTweener = mGameStartControl.transform .DOScale(new Vector3(1, 1, 1), changeTime + mPrependTime) .OnComplete(delegate() { mGameStartControl.gameStart(); }); }
/// <summary> /// 检测是否能合并 /// </summary> public bool checkMerge(JigsawContainerCpt collisionJCC) { Dictionary <Vector2, Vector3> collisionMergeVectorList = collisionJCC.getMergeVectorList(); Dictionary <Vector2, Vector3> jigsawPositionVectorList = this.getJigsawPositionVectorList(); float thisAngles = transform.eulerAngles.z; float collisionAngles = collisionJCC.transform.eulerAngles.z; float offsetAngles = Mathf.Abs(thisAngles - collisionAngles); foreach (KeyValuePair <Vector2, Vector3> jigsawPositionItem in jigsawPositionVectorList) { foreach (KeyValuePair <Vector2, Vector3> collisionMergeItem in collisionMergeVectorList) { if (jigsawPositionItem.Key.Equals(collisionMergeItem.Key)) { float distance = Vector3.Distance(jigsawPositionItem.Value, collisionMergeItem.Value); if (distance < mergeVectorOffset && offsetAngles < mergeAnglesOffset) { return(true); } } } } return(false); }
/// <summary> /// 游戏完成 /// </summary> public void gameFinsh() { CommonData.GameStatus = 2; CommonData.IsDargMove = false; CommonData.IsMoveCamera = false; //删除游戏进度 PuzzlesProgressBean progressTemp = new PuzzlesProgressBean(); progressTemp.puzzleId = CommonData.SelectPuzzlesInfo.puzzlesInfo.id; progressTemp.markFileName = CommonData.SelectPuzzlesInfo.puzzlesInfo.mark_file_name; ((PuzzlesProgressDSHandle)DataStorageManage.getPuzzlesProgressDSHandle()).deleteData(progressTemp); float startCameraOrthographicSize = cameraControl.startCameraOrthographicSize; //结束游戏时间 GameMainUIControl gameMainUI = uiMasterControl.getUIByType <GameMainUIControl>(UIEnum.GameMainUI); TimeBean completeTime = null; if (gameMainUI != null) { gameMainUI.endTimer(); completeTime = gameMainUI.getGameTimer(); } if (!CommonData.IsCheating) { if (CommonData.SelectPuzzlesInfo.puzzlesInfo.data_type.Equals((int)JigsawResourcesEnum.Custom)) { } else { //增加PP int addPuzzlesPoint = CommonData.SelectPuzzlesInfo.puzzlesInfo.level * 2; DialogManager.createPuzzlesPointAddDialog(addPuzzlesPoint); } //保存数据 GameUtil.FinshSaveCompleteData(CommonData.SelectPuzzlesInfo, completeTime); } //动画结束后显示排行榜 transform.DOScale(new Vector3(1, 1), gameFinshAnimTime).OnComplete(delegate() { if (CommonData.SelectPuzzlesInfo.puzzlesInfo.data_type.Equals((int)JigsawResourcesEnum.Custom)) { SceneUtil.jumpMainScene(); } else { int leaderType = 0; if (CommonData.IsCheating) { leaderType = 1; } else { //没有作弊 放烟花 //GameObject dialogObj = Instantiate(ResourcesManager.LoadData<GameObject>("Prefab/Particle/Background/GameFinshParticle")); //Canvas gameFinshCanvas = dialogObj.GetComponent<Canvas>(); //gameFinshCanvas.renderMode = RenderMode.ScreenSpaceCamera; //gameFinshCanvas.worldCamera = Camera.main; } DialogManager .createLeaderBoradDialog(leaderType, CommonData.SelectPuzzlesInfo) .setUserScore(completeTime.totalSeconds) .setCallBack(this) .setCancelButtonStr(CommonData.getText(21)) .setSubmitButtonStr(CommonData.getText(23)); } CommonData.IsCheating = false; }); //镜头移动 cameraControl.transform.DOMove(cameraControl.startCameraPosition, gameFinshAnimTime); Tween cameraTW = DOTween .To(() => Camera.main.orthographicSize, x => Camera.main.orthographicSize = x, startCameraOrthographicSize, gameFinshAnimTime); //图像归位 int containerListSize = containerList.Count; for (int i = 0; i < containerListSize; i++) { GameObject container = containerList[i]; if (container != null) { JigsawContainerCpt containerCpt = container.GetComponent <JigsawContainerCpt>(); Rigidbody2D containerRB = container.GetComponent <Rigidbody2D>(); containerRB.Sleep(); container.transform.DORotate(new Vector3(containerCpt.startRotation.x, containerCpt.startRotation.y), gameFinshAnimTime); container.transform.DOMove(containerCpt.startPosition, gameFinshAnimTime); break; } } //设置成就 List <PuzzlesCompleteStateBean> listCompleteState = ((PuzzlesCompleteDSHandle)DataStorageManage.getPuzzlesCompleteDSHandle()).getDefAllData(); if (listCompleteState != null && listCompleteState.Count != 0) { int completeNumber = 0; foreach (PuzzlesCompleteStateBean itemState in listCompleteState) { if (itemState.completeTime != null && itemState.completeTime.totalSeconds != 0) { completeNumber++; } } IUserAchievementHandle userAchievement = new UserStatsHandleImpl(); userAchievement.userCompleteNumberChange(completeNumber); } }