Exemplo n.º 1
0
    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();
    }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
    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);
    }