private void HitOrb(IOrb orb) { var hitVector = new Vector2(0, 1); if (hero.Side == HeroSide.Top) { hitVector = new Vector2(0, -1); } var hitSpeed = 0f; var velocity = hero.AimVector - hero.Position; hitSpeed = Mathf.Clamp(velocity.magnitude / touchVelocityMax, 0, 1); hitVector = hitVector * (1 - hitSpeed) + hitSpeed * velocity.normalized; if (hero.Side == HeroSide.Top && hitVector.y > 0 || hero.Side == HeroSide.Bottom && hitVector.y < 0) { hitVector = new Vector2(hitVector.x, -hitVector.y); } var slope = hitVector.x / hitVector.y; if (slope > minSlope) { hitVector = new Vector2(minSlope, Math.Sign(hitVector.y)); } else if (slope < -minSlope) { hitVector = new Vector2(-minSlope, Math.Sign(hitVector.y)); } var spin = MathHelper.ShortestVector(orb.Position, hero.AimVector, hero.AimSpinVector + hero.AimVector); var spinMagnitude = spin.magnitude; if (spinMagnitude < spinMinCutoff) { spinMagnitude = 0; } else { spinMagnitude = Mathf.Clamp(spinMagnitude, spinMinCutoff, spinMaxCutoff) * spinCoefficient; spinMagnitude *= Math.Sign(MathHelper.Determinant(orb.Position, hero.AimVector, hero.AimSpinVector + hero.AimVector)); } Debug.Log("HitOrb! hitSpeed: " + hitSpeed + " dirX: " + hitVector.x + " dirY: " + hitVector.y + " spin: " + spinMagnitude); orb.ForceHit(hero, hitVector, 1f, spinMagnitude); stateMachine.SetState(PaddleState.Cooldown); hero.HitOrb(); }
public void OnCenterHit(IOrb orb) { if (state != WellState.Active) { return; } if (orb.Owner.Side == HeroSide.Top) { pushDirection = new Vector2(0, -1); } else { pushDirection = new Vector2(0, 1); } orb.ForceHit(Vector2.zero, 0); SetState(WellState.Charging); }
public override void OnBump(IOrb orb, Vector2 collisionPoint) { Vector2 normal = (orb.Position - collisionPoint).normalized; Vector2 newDirection = orb.Direction - 2 * (orb.Direction.x * normal.x + orb.Direction.y * normal.y) * normal; float newSpin = orb.Spin; newDirection = MathHelper.Rotate(newDirection, newSpin * .5f); if (Math.Abs(newSpin) < .25f) { newSpin = 0; } else { newSpin -= .25f * Math.Sign(newSpin); } orb.ForceHit(newDirection, orb.SpeedMultiplier, newSpin); }