public override float GetScreenPointProportionAlong(Vector2 point, Vector3 grabRelativePosition, Moveable_Drag drag) { bool flipSide = (drag && Vector3.Dot(drag.GetGrabPosition() - drag.Transform.position, drag.Transform.right) < 0f); float worldDepth = Vector3.Dot(grabRelativePosition, Transform.forward); Vector3 grabOffset = Transform.forward * worldDepth; Vector2 screen_gizmoStartPosition = KickStarter.CameraMain.WorldToScreenPoint(GetGizmoPosition(0f) + grabOffset); Vector2 screen_gizmoEndPosition = KickStarter.CameraMain.WorldToScreenPoint(GetGizmoPosition(1f) + grabOffset); Vector2 screen_origin = KickStarter.CameraMain.WorldToScreenPoint(Transform.position + grabOffset); Vector2 startToOrigin = screen_gizmoStartPosition - screen_origin; Vector2 endToOrigin = screen_gizmoEndPosition - screen_origin; Vector2 pointToOrigin = point - screen_origin; float startToPointAngle = AdvGame.SignedAngle(startToOrigin, pointToOrigin); float startToEndAngle = AdvGame.SignedAngle(startToOrigin, endToOrigin); bool isFlipped = (Vector3.Dot(Transform.forward, KickStarter.CameraMainTransform.forward) < 0f); if (isFlipped) { startToEndAngle *= -1f; startToPointAngle *= -1f; } if (flipSide) { startToPointAngle += 180f; } if (startToEndAngle < 0f) { startToEndAngle += 360f; } if (startToPointAngle < 0f) { startToPointAngle += 360f; } if (Loops) { startToEndAngle = 360f; } float reversedMidAngle = 180f + (startToEndAngle / 2f); if (startToPointAngle > reversedMidAngle) { startToPointAngle -= 360f; } return(startToPointAngle / startToEndAngle); }
public override float GetScreenPointProportionAlong(Vector2 point) { Vector2 screen_gizmoStartPosition = KickStarter.CameraMain.WorldToScreenPoint(GetGizmoPosition(0f)); Vector2 screen_gizmoEndPosition = KickStarter.CameraMain.WorldToScreenPoint(GetGizmoPosition(1f)); Vector2 screen_origin = KickStarter.CameraMain.WorldToScreenPoint(transform.position); Vector2 startToOrigin = screen_gizmoStartPosition - screen_origin; Vector2 endToOrigin = screen_gizmoEndPosition - screen_origin; Vector2 pointToOrigin = point - screen_origin; float startToPointAngle = AdvGame.SignedAngle(startToOrigin, pointToOrigin); float startToEndAngle = AdvGame.SignedAngle(startToOrigin, endToOrigin); bool isFlipped = (Vector3.Dot(transform.forward, KickStarter.CameraMain.transform.forward) < 0f); if (isFlipped) { startToEndAngle *= -1f; startToPointAngle *= -1f; } if (startToEndAngle < 0f) { startToEndAngle += 360f; } if (startToPointAngle < 0f) { startToPointAngle += 360f; } if (Loops) { startToEndAngle = 360f; } float reversedMidAngle = 180f + (startToEndAngle / 2f); if (startToPointAngle > reversedMidAngle) { startToPointAngle -= 360f; } return(startToPointAngle / startToEndAngle); }
/** * Updates the current QTE. This is called every frame by StateHandler. */ public void UpdateQTE() { if (endTime <= 0f) { return; } if (Time.time > endTime) { Lose(); return; } switch (qteType) { case QTEType.SingleKeypress: { if (inputName == touchScreenTap) { if (Input.touchCount > 0f) { Win(); return; } } else { if (KickStarter.playerInput.InputGetButtonDown(inputName)) { Win(); return; } else if (wrongKeyFails && KickStarter.playerInput.InputAnyKey() && KickStarter.playerInput.GetMouseState() == MouseState.Normal) { Lose(); return; } } } break; case QTEType.SingleAxis: { float axisValue = KickStarter.playerInput.InputGetAxis(inputName); if (axisThreshold > 0f && axisValue > axisThreshold) { Win(); return; } else if (axisThreshold < 0f && axisValue < axisThreshold) { Win(); return; } else if (wrongKeyFails) { if (axisThreshold > 0f && axisValue < -axisThreshold) { Lose(); return; } else if (axisThreshold < 0f && axisValue > -axisThreshold) { Lose(); return; } } } break; case QTEType.HoldKey: { if (inputName == touchScreenTap) { if (Input.touchCount > 0f) { if (lastPressTime <= 0f) { lastPressTime = Time.time; } else if (Time.time > lastPressTime + holdDuration) { Win(); return; } } else { lastPressTime = 0f; } } else { if (KickStarter.playerInput.InputGetButton(inputName)) { if (lastPressTime <= 0f) { lastPressTime = Time.time; } else if (Time.time > lastPressTime + holdDuration) { Win(); return; } } else if (wrongKeyFails && Input.anyKey) { Lose(); return; } else { lastPressTime = 0f; } } if (animator != null) { if (lastPressTime <= 0f) { animator.SetBool("Held", false); } else { animator.SetBool("Held", true); } } } break; case QTEType.ButtonMash: { if (inputName == touchScreenTap) { if (Input.touchCount > 1) { if (canMash) { numPresses++; lastPressTime = Time.time; if (animator) { animator.Play("Hit", 0, 0f); } canMash = false; } } else { canMash = true; if (doCooldown) { if (lastPressTime > 0f && Time.time > lastPressTime + cooldownTime) { numPresses--; lastPressTime = Time.time; } } } } else { if (KickStarter.playerInput.InputGetButtonDown(inputName)) { if (canMash) { numPresses++; lastPressTime = Time.time; if (animator) { animator.Play("Hit", 0, 0f); } canMash = false; } } else { canMash = true; if (doCooldown) { if (lastPressTime > 0f && Time.time > lastPressTime + cooldownTime) { numPresses--; lastPressTime = Time.time; } } } if (KickStarter.playerInput.InputGetButtonDown(inputName)) { } else if (wrongKeyFails && Input.anyKeyDown) { Lose(); return; } } if (numPresses < 0) { numPresses = 0; } if (numPresses >= targetPresses) { Win(); return; } } break; case QTEType.ThumbstickRotation: { Vector2 currentInput = new Vector2(KickStarter.playerInput.InputGetAxis(inputName), KickStarter.playerInput.InputGetAxis(verticalInputName)); if (currentInput.sqrMagnitude > axisThreshold) { if (lastFrameRotationInput != Vector2.zero) { float frameAngleDiff = AdvGame.SignedAngle(currentInput, lastFrameRotationInput); if (frameAngleDiff > 180f) { frameAngleDiff -= 360f; } else if (frameAngleDiff < -180f) { frameAngleDiff += 360f; } currentRotations += frameAngleDiff / 360f; if (rotationIsClockwise) { maxRotation = Mathf.Max(maxRotation, currentRotations); if (currentRotations > targetRotations) { Win(); return; } } else { maxRotation = Mathf.Min(maxRotation, currentRotations); if (currentRotations < targetRotations) { Win(); return; } } if (wrongKeyFails) { if (rotationIsClockwise) { if (maxRotation - currentRotations > 0.15f) { Lose(); return; } } else { if (maxRotation - currentRotations < -0.15f) { Lose(); return; } } } } lastFrameRotationInput = currentInput; } else { currentRotations = 0f; lastFrameRotationInput = Vector2.zero; } } break; } }