/// <summary> /// 设置箭头,计算分数 /// </summary> /// <param name="type"></param> void SetArrowResult(Global.TIMING_JUAGE_TYPE type, Arrow arrow, bool isMainBeat = true) { switch (type) { case Global.TIMING_JUAGE_TYPE.BAD: Sounder.instance.Play("BAD音效"); break; } if (arrow.isLastOne) { bool end = true; if (arrow is LongPressArrow) { LongPressArrow longPress = arrow as LongPressArrow; switch (longPress.subState) { case Arrow.STATE.PRESSING: case Arrow.STATE.READY: end = false; break; } } if (hp > 0 && end) { ClearnArrow(); Eff.instance.lastHit.SetActive(true); BeatGame.instance.ArrowComplete(); } } if (type != Global.TIMING_JUAGE_TYPE.MISS) { int comboTime = combo.GetCount(); GetComponent <AudioSource>().volume = comboTime < 10 ? 0.7f : 1; if (isMainBeat) { GetComponent <AudioSource>().PlayOneShot(leftRightClip); } } timingJudge.Show(type); if (type < Global.TIMING_JUAGE_TYPE.BAD) { AddCombo(type); BeatLight bl = null; switch (arrow.songTime.direction) { case SongInfo.DIRECTION.LEFT: bl = leftLight; break; case SongInfo.DIRECTION.RIGHT: bl = rightLight; break; case SongInfo.DIRECTION.UP: bl = upLight; break; case SongInfo.DIRECTION.DOWN: bl = downLight; break; } bl.Show(); Eff.instance.ScreenHit(arrow.songTime.direction); } else { //道具 if (correctProp != null && DataUtils.mode == Global.MODE.MODE_1P) { if (correctProp.Use()) { Sounder.instance.Play("道具消耗音效"); AddCombo(Global.TIMING_JUAGE_TYPE.PREFECT); Eff.instance.ScreenHit(arrow.songTime.direction); type = Global.TIMING_JUAGE_TYPE.PREFECT; } else { combo.Reset(); } } else { combo.Reset(); } switch (type) { case Global.TIMING_JUAGE_TYPE.BAD: mark += 5; //bad加5 break; case Global.TIMING_JUAGE_TYPE.MISS: RefreshHP(); break; } } scoreData.AddJuade(info.data, type); markText.SetValue(mark); }
// Update is called once per frame void FixedUpdate() { var d = hpBar.dimensions; d.Set(d.x + (dimensionsX - d.x) * .3f, hpBar.dimensions.y); hpBar.dimensions = d; Vector3 p = hpEff.transform.position; p.x = hpBar.transform.position.x + d.x / 100; hpEff.transform.position = p; if (BeatGame.instance.playState != BeatGame.PLAY_STATE.PLAYING || !alive) { return; } //runTime+= Time.fixedDeltaTime; runTime = BeatGame.instance.audioSource.time; #region 添加箭头 for (int i = beatIndex, c = curBeats.Length; i < c; i++) { SongTime songTime = curBeats[i]; if (runTime >= (songTime.showTime - moveToTopTime)) { if (i >= beatIndex) { beatIndex = i + 1; } Arrow arrow; if (songTime is LongSongTime) { arrow = PrefabPool.instance(longArrowPrefab).GetComponent <LongPressArrow>(); (arrow as LongPressArrow).subState = Arrow.STATE.READY; } else { arrow = PrefabPool.instance(arrowPrefab).GetComponent <Arrow>(); } arrow.SetState(Arrow.STATE.READY); arrow.gameObject.SetActive(true); arrow.gameObject.transform.parent = arrowContainer.transform; if (beatIndex == curBeats.Length) { arrow.isLastOne = true; } GameObject targetArrow = null; switch (songTime.direction) { case SongInfo.DIRECTION.DOWN: targetArrow = downArrow; break; case SongInfo.DIRECTION.LEFT: targetArrow = leftArrow; break; case SongInfo.DIRECTION.RIGHT: targetArrow = rightArrow; break; case SongInfo.DIRECTION.UP: targetArrow = upArrow; break; } if (songTime is LongSongTime) { arrow.GetComponent <LongPressArrow>().SetType(songTime.direction, (songTime as LongSongTime).PressTime * unitSpeedPerFrame * Application.targetFrameRate * 100); } else { arrow.GetComponent <Arrow>().SetType(songTime.direction); } arrow.transform.localPosition = new Vector3(targetArrow.transform.localPosition.x, bornPosY, 0); arrow.SetSongTime(songTime); arrows.Add(arrow); arrow.Init(runTime - PRESS_DELAY_TIME, unitSpeedPerSec); } else { break; } } #endregion #region 移动、删除箭头 for (int i = 0, c = arrows.Count; i < c; i++) { if (!alive) { return; } Arrow a = arrows[i]; a.Move(runTime); bool isLongPress = a is LongPressArrow; //超出底线,干掉 if ((!isLongPress && a.transform.localPosition.y >= (Global.SCREEN_HEIGHT + 1f)) || (isLongPress && a.transform.localPosition.y >= (Global.SCREEN_HEIGHT + 1f + (a as LongPressArrow).height / 100)) ) { KillArrow(arrows[i]); } else if ((a.transform.position.y > (END_POSITION_Y + HIT_DISTANCE))) //超过顶部图标,判定MISS { if (a.state != Arrow.STATE.FAILED) { a.SetState(Arrow.STATE.FAILED); SetArrowResult(Global.TIMING_JUAGE_TYPE.MISS, a); } else if (isLongPress && (a as LongPressArrow).subState != Arrow.STATE.FAILED) { Vector3 pos = (a as LongPressArrow).GetSecondArrowPos(); if (pos.y > (END_POSITION_Y + HIT_DISTANCE)) { (a as LongPressArrow).subState = Arrow.STATE.FAILED; SetArrowResult(Global.TIMING_JUAGE_TYPE.MISS, a); } } } else if (DataUtils.isAutoMode && DataUtils.mode == Global.MODE.MODE_1P) //自动模式 { if (a is LongPressArrow) { LongPressArrow l = a as LongPressArrow; switch (l.state) { case Arrow.STATE.READY: if ((a as LongPressArrow).IsPerfectTime(true)) { PressKey(a.songTime.direction, JoystickManager.JOYSTICK_KEY_STATE.KEY_DOWN); //Debug.Log("长按:" + a.songTime.direction + "时间:" + runTime); } break; case Arrow.STATE.PRESSING: if (GetJuade(Mathf.Abs(l.GetSecondArrowPos().y - END_POSITION_Y)) == Global.TIMING_JUAGE_TYPE.PREFECT) //if ((a as LongPressArrow).IsPerfectTime(false)) { PressKey(a.songTime.direction, JoystickManager.JOYSTICK_KEY_STATE.KEY_UP); //Debug.Log("长按结束:" + a.songTime.direction + "时间:" + runTime); } break; } } else { if (a.IsPerfectTime()) { PressKey(a.songTime.direction, JoystickManager.JOYSTICK_KEY_STATE.KEY_DOWN); } } if (a is LongPressArrow) { LongPressArrow l = a as LongPressArrow; if (a.state == Arrow.STATE.PRESSING) { if (l.pressingTime != 0 && (runTime - l.pressingTime) > 0.25f) { SetArrowResult(Global.TIMING_JUAGE_TYPE.PREFECT, a, false); l.pressingTime = runTime; } } } } } if (deleteArrows.Count > 0) { for (int i = 0, c = deleteArrows.Count; i < c; i++) { arrows.Remove(deleteArrows[i]); } deleteArrows.Clear(); } #endregion }
/// <summary> /// 按键 /// </summary> /// <param name="d"></param> /// <param name="keyState"></param> public void PressKey(SongInfo.DIRECTION d, JoystickManager.JOYSTICK_KEY_STATE keyState) { Arrow a; GameObject targetArrow = null; for (int i = 0, c = arrows.Count; i < c; i++) { a = arrows[i]; if (a.songTime.direction != d) { continue; } switch (a.songTime.direction) { case SongInfo.DIRECTION.UP: targetArrow = upArrow; break; case SongInfo.DIRECTION.DOWN: targetArrow = downArrow; break; case SongInfo.DIRECTION.LEFT: targetArrow = leftArrow; break; case SongInfo.DIRECTION.RIGHT: targetArrow = rightArrow; break; } float dis = Vector3.Distance(a.transform.position, targetArrow.transform.position); Global.TIMING_JUAGE_TYPE type = GetJuade(dis); if (a is LongPressArrow) { LongPressArrow l = a as LongPressArrow; switch (l.state) { case LongPressArrow.STATE.READY: //准备好时,如果按下相应的链接又在区域内,改变为按下状态 if (type != Global.TIMING_JUAGE_TYPE.NONE && keyState == JoystickManager.JOYSTICK_KEY_STATE.KEY_DOWN) { l.SetState(LongPressArrow.STATE.PRESSING); l.pressingTime = runTime; SetArrowResult(type, a); float offset = targetArrow.transform.position.y - a.transform.position.y; a.transform.position = targetArrow.transform.position; l.height += offset * 100; l.AddLongEff(targetArrow.transform.position); return; } break; case LongPressArrow.STATE.PRESSING: //如果按下状态时弹起,改为失败状态 if (keyState == JoystickManager.JOYSTICK_KEY_STATE.KEY_UP) { dis = Vector3.Distance(l.GetSecondArrowPos(), targetArrow.transform.position); Global.TIMING_JUAGE_TYPE secondType = GetJuade(dis); if (secondType != Global.TIMING_JUAGE_TYPE.NONE) { l.SetState(LongPressArrow.STATE.SUCCESS); l.subState = Arrow.STATE.SUCCESS; KillArrow(a); SetArrowResult(secondType, a, false); Eff.instance.AddArrowEff(targetArrow.transform.position, a.songTime.direction); } else { l.SetState(LongPressArrow.STATE.FAILED); } return; } break; } } else { if (keyState == JoystickManager.JOYSTICK_KEY_STATE.KEY_DOWN) { if (type != Global.TIMING_JUAGE_TYPE.NONE) { KillArrow(a); SetArrowResult(type, a); Eff.instance.AddArrowEff(targetArrow.transform.position, a.songTime.direction); return; } } } } }