示例#1
0
    public void OnFlowerHit(ICenterRose rose, IOrb orb)
    {
        bool allClear = true;

        foreach (var flower in flowers)
        {
            if (flower.State == PointGeneratorState.Full)
            {
                allClear = false;
                break;
            }
        }

        if (allClear)
        {
            if (orb.Owner != null)
            {
                scoring       = true;
                scoringPlayer = orb.Owner;
                foreach (var flower in flowers)
                {
                    flower.ResetCooldown();
                }
            }
        }
    }
示例#2
0
    private void OnTriggerExit2D(Collider2D collision)
    {
        IOrb orb = collision.AsOrb();

        if (orb != null)
        {
            stateMachine.SetState(AimRegionState.Normal);
        }
    }
示例#3
0
    private void OnTriggerEnter2D(Collider2D collision)
    {
        IOrb orb = collision.AsOrb();

        if (orb != null)
        {
            HitOrb(orb);
        }
    }
示例#4
0
    private void OnTriggerEnter2D(Collider2D collision)
    {
        IOrb orb = collision.AsOrb();

        if (orb != null && stateMachine.CurrentStateKey == PaddleState.Normal)
        {
            StartAim(orb);
        }
    }
示例#5
0
    void UpdateOrb(IOrb orb)
    {
        if (this.state != WellState.Active)
        {
            return;
        }

        PullOrb(orb);
    }
示例#6
0
    public override void OnBump(IOrb orb, Vector2 collisionPoint)
    {
        if (orb.Owner != null)
        {
            orb.Owner.GainUltCharge(points, Position);
        }

        manager.OnBeeHit(this);
        stateMachine.SetState(BeeState.Hit);
    }
示例#7
0
    void PullOrb(IOrb orb)
    {
        var delta   = (Vector2)transform.position - orb.Position;
        var scale   = 1 - Mathf.Clamp(delta.magnitude / (orb.Radius + circleCollider.radius), 0, 1);
        var scaleSq = (float)Math.Pow(scale, 2);

        orb.Pull(delta, gravity * scaleSq);

        Debug.Log("delta=" + delta + ", scale=" + scale + ", scaleSq=" + scaleSq + ", gravity*scaleSq=" + gravity * scaleSq);
    }
示例#8
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();
    }
示例#9
0
    void HitOrb(IOrb orb)
    {
        stateMachine.SetState(AimRegionState.Cooldown);

        /*var futureOrbPos = orb.Position + orb.Direction * 2;
         *
         * int collisions = Physics2D.RaycastNonAlloc(orb.Position, orb.Direction, collisionBuffer, 3, collisionFilter.layerMask);
         * for (int i = 0; i < collisions; i++)
         * {
         *  IPaddle collidedPaddle = collisionBuffer[i].collider.GetComponent<Paddle>();
         *  if (collidedPaddle != null && collidedPaddle == this.paddle)
         *  {
         *  }
         * }*/
    }
        private void RemoveOrb(IOrb orb)
        {
            if (orb is Quas)
            {
                this.QuasCount--;
            }
            else if (orb is Wex)
            {
                this.WexCount--;
            }
            else
            {
                this.ExortCount--;
            }

            this.CurrentOrbs.Remove(orb);
        }
示例#11
0
    void OrbHit(IOrb orb)
    {
        if (this.state != TreeState.Charging)
        {
            return;
        }

        if (orb.Owner != null && orb.Owner.Side == side)
        {
            curHits++;
            if (curHits == hitsToUnleash)
            {
                state   = TreeState.Unleashing;
                curHits = 0;
            }
        }
    }
示例#12
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);
    }
示例#13
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);
    }
示例#14
0
    public override void OnBump(IOrb orb, Vector2 collisionPoint)
    {
        if (State != PointGeneratorState.Full)
        {
            return;
        }

        ResetCooldown();

        if (orb.Owner != null)
        {
            orb.Owner.GainUltCharge(points, Position);
        }

        if (onHitEffect != null)
        {
            this.AddChild(Game.Objects.CreatePrefab <SimpleEffect>(onHitEffect.gameObject));
        }

        OnFullBump(orb, collisionPoint);
    }
示例#15
0
 public void OnFlowerHit(ISideFlower flower, IOrb orb)
 {
     flowers.Remove(flower);
 }
示例#16
0
 private void StartAim(IOrb orb)
 {
     this.orb = orb;
     stateMachine.SetState(PaddleState.Aiming);
 }
示例#17
0
 public override void OnCenterBump(IOrb orb)
 {
     well.OnCenterHit(orb);
 }
示例#18
0
 public virtual void OnCenterBump(IOrb orb)
 {
 }
示例#19
0
 public override void OnFullBump(IOrb orb, Vector2 collisionPoint)
 {
     flowerBed.OnFlowerHit(this, orb);
 }
示例#20
0
 public override void OnFullBump(IOrb orb, Vector2 collisionPoint)
 {
     spawner.OnFlowerHit(this, orb);
     Kill();
 }
示例#21
0
 public virtual void OnFullBump(IOrb orb, Vector2 collisionPoint)
 {
 }
示例#22
0
 protected override void OnParented(IGameEntity parent)
 {
     orb = (IOrb)parent;
 }
示例#23
0
 void Awake()
 {
     orb = this.transform.parent.GetComponent <Orb>();
 }