Пример #1
0
    private void OnTriggerEnter2D(Collider2D other)
    {
        bool canInteract = Mathf.Abs(lastInteractionTime - Time.time) > interactionDelay;

        if (canInteract && other.CompareTag("CirclePart"))
        {
            lastInteractionTime = Time.time;

            Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, radius, circlePartsLayer);
            if (colliders.Length > 0)
            {
                for (int i = 0; i < colliders.Length; i++)
                {
                    other = colliders.ElementAt(i);
                    CirclePart circlePart = other.gameObject.GetComponent <CirclePart>();
                    if (i == 0)
                    {
                        circlePart.playerInteraction(reflecting);
                        circlePartInteraction(circlePart);
                    }
                    else
                    {
                        circlePart.bounce();
                    }
                }
            }
        }
    }
Пример #2
0
    public void circlePartInteraction(CirclePart part)
    {
        if (reflecting)
        {
            return;
        }

        if (part.state == CirclePart.CirclePartState.Default || part.state == CirclePart.CirclePartState.Reload)
        {
            if (sprite.color == part.color)
            {
                comboCount++;
            }
            else
            {
                comboCount = 1;
            }

            sprite.color  = part.color;
            rb2d.velocity = Vector2.up * force;

            bool combo = comboCount >= circle.playerComboCount;

            if (combo)
            {
                comboCount = 0;
                StartCoroutine(_reflect(circle.getReflectionPoints()));
            }

            ParticleSystem.MainModule main = jumpPs.main;
            main.startColor = sprite.color;
            jumpPs.Play();

            interactedWithCircle?.Invoke(comboCount, combo, part.state == CirclePart.CirclePartState.Reload);
        }
        else if (part.state == CirclePart.CirclePartState.Spike)
        {
            die(DieType.Spike);
        }
    }
Пример #3
0
    private void prepareCircleParts()
    {
        parts.ForEach(part => Destroy(part.gameObject));
        parts.Clear();

        float angle = 0;

        List <CirclePartType> partTypes = randomPartTypes();

        #region Spikes Difficulty
        int level       = gameController.score.level;
        int spikesCount = 0;
        switch (level)
        {
        case int lvl when level <= 3: {
            spikesCount = 0;
            break;
        }

        case int lvl when level > 3 && level < 25: {
            spikesCount = Range(1, 3 + 1);
            break;
        }

        case int lvl when level >= 25: {
            spikesCount = Range(2, 4 + 1);
            break;
        }

        case int lvl when level >= 50: {
            spikesCount = Range(3, 5 + 1);
            break;
        }

        default: break;
        }

        int count = partTypes.Count(partType => isTruePartType(partType));
        spikesCount = Mathf.Clamp(spikesCount, 0, (int)(count / 2f) - 1);
        if (count <= 5)
        {
            spikesCount = 1;
        }

        if (count >= 7)
        {
            partsReloadTime = 2.25f;
        }
        else
        {
            partsReloadTime = 1.5f;
        }
        #endregion

        int spikesSpawned = 0;

        for (int i = 0; i < partTypes.Count; i++)
        {
            CirclePartType partType = partTypes.ElementAt(i);

            if (i > 0)
            {
                CirclePartType previousPartType = partTypes.ElementAt(i - 1);

                int partTypeValue         = truePartValue(partType);
                int previousPartTypeValue = truePartValue(previousPartType);
                // get true values of angle cost
                int   difference      = Mathf.Abs(partTypeValue - previousPartTypeValue);
                float differenceAngle = (difference * deltaPartCost);
                if (partTypeValue < previousPartTypeValue)
                {
                    differenceAngle = -differenceAngle;
                }
                else if (partTypeValue == previousPartTypeValue)
                {
                    differenceAngle = 0f;
                }
                angle += differenceAngle;
            }

            float   radius = c2d.radius;
            float   x      = radius * Mathf.Cos(angle * Mathf.Deg2Rad);
            float   y      = radius * Mathf.Sin(angle * Mathf.Deg2Rad);
            Vector3 point  = new Vector3(x, y, 0);

            CirclePart partPrefab = circlePartPrefab(partType);
            if (partPrefab != null)
            {
                CirclePart part = Instantiate(partPrefab, point, Quaternion.AngleAxis(angle, Vector3.forward));
                part.transform.position = part.transform.position + transform.position;

                bool spawnSpike = false;
                if (spikesSpawned < spikesCount)
                {
                    float chance = (i + 1) * (100f / partTypes.Count);
                    if (Range(0f, 100f) <= chance)
                    {
                        spikesSpawned++;
                        spawnSpike = true;
                    }
                }

                part.setupCircle(this, spawnSpike ? CirclePart.CirclePartState.Spike : CirclePart.CirclePartState.Default);
                parts.Add(part);
            }

            angle += circlePartCost(partType);
        }
    }
Пример #4
0
    void OnTriggerEnter2D(Collider2D col)
    {
        if (isGameOver)
        {
            return;
        }
        //Debug.LogError(col+" layer "+ col.GetComponent<SpriteRenderer>().sortingLayerID);
        //1746648709 ???
        if (col.GetComponent <SpriteRenderer>() != null && col.GetComponent <SpriteRenderer>().sortingLayerID != 1746648709)
        {
            return;
        }
        if (decideByTheFirstHit && col.transform.parent && hittedCircle.Contains(col.transform.parent.gameObject))
        {
            return;
        }
        if (willTeleportThis)
        {
            return;
        }
        GameColor  script = col.gameObject.GetComponent <GameColor>();
        CirclePart cp     = col.gameObject.GetComponent <CirclePart>();

        if (script && cp)
        {
            GameColorEnum c = script.gameColor;

            if (cp.willChange)
            {
                ChangeColor(c);
            }
            else
            {
                if (c != gameColor)
                {
                    HitWontChangePartWithDifferentColor();
                }
                else
                {
                    HitWontChangePartWithSameColor();
                    //achievement
                }
            }
            if (shouldDestroyPart)
            {
                col.gameObject.SetActive(false);
                hittedPart.Add(col.gameObject);
            }
            if (!abilityBehavior.WouldDestroyMultiplePartsOnOneCircle)
            {
                hittedCircle.Add(col.transform.parent.gameObject);
            }

            //get item if exist
            GameItem item = col.transform.parent.parent.GetComponentInChildren <GameItem>();
            UseItem(item);

            if (col.transform.parent.gameObject != startObject)
            {
                Monster monster = col.transform.parent.parent.GetComponentInChildren <Monster>();
                if (monster && monster.gameObject.activeSelf)
                {
                    monster.GetDamage(1);
                }
            }
        }
        else
        {
            //hit on wholeCircle
            //CSUtil.ERROR("item is not color changer and does not have colorManager on it");
        }
    }