void Update()
    {
        //Update rotation based on player input
        Vector2 axis = new Vector2(Input.GetAxisRaw("P" + playerData.GetPlayerNum() + "_Joystick_L_Horizontal"), Input.GetAxisRaw("P" + playerData.GetPlayerNum() + "_Joystick_L_Vertical"));

        if (axis != Vector2.zero && axis.magnitude > 0.5f)
        {
            playerAngle = TrigUtilities.VectorToDegrees(axis);
        }

        //Handle input for if the player doesn't have a weapon
        if (Input.GetButtonDown("P" + playerData.GetPlayerNum() + "_Fire"))
        {
            if (!playerData.GetWeapon())
            {
                ApplyForceForward(1);
            }
        }

        //Handle flying off into infinity

        /*if (GameManager.instance.IsTransformOffCamera(transform))
         * {
         *  transform.position = new Vector2(0, 0);
         *  print("Zoop!");
         * };*/
    }
    public void OnObjectSpawn()
    {
        float   angle     = Random.Range(0, 360);
        Vector2 direction = TrigUtilities.DegreesToVector(angle);

        rb.AddForce(direction * Random.Range(10f, 15f), ForceMode2D.Impulse);
        StartCoroutine(InvisibleFrames());
    }
    void Start()
    {
        //GetComponent<SpriteRenderer>().color = color;
        trailRenderer = GetComponent <TrailRenderer>();
        ColorBullet();

        circleCollider = GetComponent <CircleCollider2D>();
        moveVector     = direction * velocityMagnitude;
        actualRadius   = circleCollider.radius * transform.localScale.x;

        //Figure out what to do if the bullet spawned inside of something
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, circleCollider.radius * transform.localScale.x);
        foreach (Collider2D collider in colliders)
        {
            //This bullet
            if (collider == circleCollider)
            {
                continue;
            }

            //Other player
            if (collider.CompareTag("Player") && collider.gameObject != owner.gameObject)
            {
                if (causeExplosion)
                {
                    ObjectPooler.instance.SpawnExplosionFromPool(transform.position, damage, damageForce, explosionRadius, owner, canHitOwner);
                }
                else
                {
                    collider.GetComponent <PlayerData>().TakeDamage(damage, TrigUtilities.VectorToDegrees(direction), damageForce, owner);
                }
                Destroy(gameObject);
            }

            //Wall
            else if (collider.CompareTag("Wall"))
            {
                if (causeExplosion)
                {
                    ObjectPooler.instance.SpawnExplosionFromPool(transform.position, damage, damageForce, explosionRadius, owner, canHitOwner);
                }
                Destroy(gameObject);
            }
        }

        LeanTween.delayedCall(gameObject, lifeSpan, () =>
        {
            if (causeExplosion)
            {
                ObjectPooler.instance.SpawnExplosionFromPool(transform.position, damage, damageForce, explosionRadius, owner, canHitOwner);
            }
            Destroy(gameObject);
        });
    }
    void Update()
    {
        if (invincible)
        {
            sr.enabled = !sr.enabled;
        }

        // Get player input
        playerInput = new Vector2(Input.GetAxisRaw("P" + playerNum + "_Horizontal"), Input.GetAxisRaw("P" + playerNum + "_Vertical"));

        // Jump control
        grounded = Physics2D.OverlapCircle(transform.position, circleCollider2D.radius * 1.5f, groundLayerMask);
        if (grounded && playerInput.y == 1)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpPower);
        }

        // Speed limit
        if (rb.velocity.x > speedLimit)
        {
            rb.velocity = new Vector2(speedLimit, rb.velocity.y);
        }
        else if (rb.velocity.x < -speedLimit)
        {
            rb.velocity = new Vector2(-speedLimit, rb.velocity.y);
        }

        // Rotation
        if (freeAim)
        {
            if (playerInput != Vector2.zero)
            {
                playerAngle = -(TrigUtilities.VectorToDegrees(playerInput) - 90);
            }
        }
        else
        {
            if (!grounded)
            {
                playerAngle -= rotationSpeed * Time.deltaTime;
                if (playerAngle < 0)
                {
                    playerAngle += 360;
                }
            }
        }

        // Off-screen death
        if (GameManager.instance.IsTransformOffCamera(transform))
        {
            Die();
        }
    }
    public void TakeDamage(int damage, float damageAngle, float damageForce, PlayerData damageSource)
    {
        if (health > 0 && !invincible)
        {
            health -= damage;
            CMShakeHandler.instance.IncreaseShakeAmount(0.004f * damage);

            //Death
            if (health <= 0)
            {
                if (damageSource != this)
                {
                    damageSource.IncrementKills();
                }
                deaths++;

                CMShakeHandler.instance.IncreaseShakeAmount(0.5f);

                //Spawn corpse
                GameObject newCorpse = Instantiate(corpsePrefab, transform.position, Quaternion.identity);
                newCorpse.transform.localScale = transform.localScale;

                Rigidbody2D corpseRB = newCorpse.GetComponent <Rigidbody2D>();
                corpseRB.AddForce(TrigUtilities.DegreesToVector(damageAngle) * damageForce * Time.deltaTime, ForceMode2D.Impulse);
                corpseRB.drag           = rb.drag;
                corpseRB.sharedMaterial = rb.sharedMaterial;

                //Remove weapon
                if (weapon)
                {
                    Destroy(weapon.gameObject);
                }

                //Remove player temporarily
                LeanTween.delayedCall(gameObject, respawnTime, () => {
                    Respawn();
                });
                gameObject.SetActive(false);
            }

            //Normal damage
            else
            {
                playerMovement.ApplyKnockback(damageAngle, damageForce);
                healthbarImage.fillAmount = ((float)health / maxHealth);
                playerHurtAS.PlayRandomize(0.25f);
            }
        }
    }
    public void OnObjectSpawn()
    {
        //Apply force
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, explosionRadius);
        foreach (Collider2D collider in colliders)
        {
            if (collider.CompareTag("Player"))
            {
                CircleCollider2D playerCollider = collider.GetComponent <CircleCollider2D>();

                //Add the player's radius to the explosion radius because the distance between the explosion and the player might be farther than the explosion radius
                float updatedExplosionRadius = explosionRadius + playerCollider.radius;

                //Get angle/distance of explosion to target
                Vector2 forceDirection = collider.transform.position - transform.position;
                float   distance       = Vector2.Distance(transform.position, collider.transform.position);

                //Calculate damage the target will take
                int damage = (int)Mathf.Ceil(explosionDamage * (updatedExplosionRadius - distance) / updatedExplosionRadius);
                if (collider.gameObject == owner.gameObject && !canHitOwner)
                {
                    damage = 0;
                }

                //Tweak the explosion force depending on the distance from the epicenter
                explosionForce *= (explosionRadius - distance) / explosionRadius;

                //Apply the damage/force
                collider.GetComponent <PlayerData>().TakeDamage(damage, TrigUtilities.VectorToDegrees(forceDirection), explosionForce, owner);
            }
        }

        //Setup animation
        LeanTween.cancel(gameObject);
        sr.color             = new Color(sr.color.r, sr.color.g, sr.color.b, 1);
        transform.localScale = new Vector2(explosionRadius * 2, explosionRadius * 2);

        //Play animation
        LeanTween.alpha(gameObject, 0, 1).setEase(LeanTweenType.easeOutCubic);
        LeanTween.scale(gameObject, transform.localScale * 1.5f, 1).setEase(LeanTweenType.easeOutCubic).setOnComplete(() =>
        {
            DeactivateObject();
        });

        //Shake camera
        CMShakeHandler.instance.IncreaseShakeAmount(explosionRadius * 0.1f);

        //DrawDebugExplosion();
    }
    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Player") && (other.gameObject != owner.gameObject || (canHitOwner && !safetyTrigger)))
        {
            if (causeExplosion)
            {
                ObjectPooler.instance.SpawnExplosionFromPool(transform.position, damage, damageForce, explosionRadius, owner, canHitOwner);
            }
            else
            {
                other.GetComponent <PlayerData>().TakeDamage(damage, TrigUtilities.VectorToDegrees(moveVector.normalized), damageForce, owner);
            }

            Destroy(gameObject);
        }
    }
Exemple #8
0
    void HandlePlayerHit(RaycastHit2D playerHit)
    {
        lineRend.SetPosition(vertexNum, vertexStart);
        lineRend.SetPosition(vertexNum + 1, playerHit.point);
        lineRend.positionCount = 2 + vertexNum;

        fadingOut = true;

        if (causeExplosion)
        {
            ObjectPooler.instance.SpawnExplosionFromPool(playerHit.point, damage, damageForce, explosionRadius, owner, canHitOwner);
        }
        else
        {
            playerHit.transform.GetComponent <PlayerData>().TakeDamage(damage, TrigUtilities.VectorToDegrees(direction), damageForce, owner);
        }
    }
Exemple #9
0
    void Update()
    {
        //This convoluted algorithm makes it so that the larger the shakeAmount is, the faster it'll decrease (because a larger shakeAmount = a smaller denominator)
        //shakeAmount -= (Time.deltaTime / Mathf.Clamp(2 - (shakeAmount * 4), 0.1f, 2f));
        //if (shakeAmount < 0) shakeAmount = 0;

        shakeAmount *= 0.95f;
        if (shakeAmount < 0.1f)
        {
            shakeAmount = 0;
        }

        if (shakeAmount > 0)
        {
            float   angle  = Random.Range(0f, 360f);
            Vector2 offset = TrigUtilities.DegreesToVector(angle) * shakeAmount;
            transform.position = originalCameraPosition + new Vector3(offset.x, offset.y);
        }
        else
        {
            transform.position = originalCameraPosition;
        }
    }
Exemple #10
0
    protected virtual void CreateProjectile()
    {
        //Create basic projectile
        GameObject newBullet;

        if (projectileData.hitscan)
        {
            newBullet = Instantiate(hitscanProjectilePrefab, projectileStartPos.position, Quaternion.identity);
        }
        else
        {
            newBullet = Instantiate(physicalProjectilePrefab, projectileStartPos.position, Quaternion.identity);
        }
        ProjectileBase projectile = newBullet.GetComponent <ProjectileBase>();

        //Set general properties
        projectile.SetDirection(TrigUtilities.DegreesToVector(owner.GetPlayerMovement().GetPlayerAngle() + Random.Range(-accuracyDegreeOffsetRange, accuracyDegreeOffsetRange)));
        projectile.SetDamage(projectileData.damage);
        projectile.SetDamageForce(projectileData.damageForce);
        projectile.SetOwner(owner);
        projectile.SetCanHitOwner(projectileData.canHitOwner);
        projectile.SetColor(owner.GetColor().GetModifiedBrightness(3f));
        projectile.SetBounces(projectileData.bounces);
        projectile.SetCauseExplosion(projectileData.causeExplosion);
        projectile.SetExplosionRadius(projectileData.explosionRadius);
        projectile.SetExplodeEveryBounce(projectileData.explodeEveryBounce);

        //Set properties depending on if it's hitscan or physical
        if (projectileData.hitscan)
        {
            SetHitscanProperties(newBullet);
        }
        else
        {
            SetPhysicalProperties(newBullet);
        }
    }
Exemple #11
0
    void Start()
    {
        lineRend     = GetComponent <LineRenderer>();
        initialWidth = lineRend.startWidth;

        lineRend.startColor = color;
        lineRend.endColor   = color;

        decayTimer = decayTimerLength;

        vertexNum   = 0;
        vertexStart = transform.position;

        //Check if we spawned a bullet in something
        Collider2D[] colliders = Physics2D.OverlapPointAll(transform.position);
        foreach (Collider2D collider in colliders)
        {
            //Other player
            if (collider.CompareTag("Player") && collider.gameObject != owner.gameObject)
            {
                if (causeExplosion)
                {
                    ObjectPooler.instance.SpawnExplosionFromPool(transform.position, damage, damageForce, explosionRadius, owner, canHitOwner);
                }
                else
                {
                    collider.GetComponent <PlayerData>().TakeDamage(damage, TrigUtilities.VectorToDegrees(direction), damageForce, owner);
                }
                Destroy(gameObject);
            }

            //Wall
            else if (collider.CompareTag("Wall"))
            {
                if (causeExplosion)
                {
                    ObjectPooler.instance.SpawnExplosionFromPool(transform.position, damage, damageForce, explosionRadius, owner, canHitOwner);
                }
                Destroy(gameObject);
            }

            //Everything else
            else
            {
                continue;
            }
        }

        if (instantTravel)
        {
            lineRend.positionCount = 2 + bounces;

            do
            {
                CastRays();
            } while (!fadingOut);
        }
        else
        {
            lineRend.positionCount = 2;
        }
    }
 public Vector2 GetPlayerDirection()
 {
     return(TrigUtilities.DegreesToVector(playerAngle));
 }
 //Like ApplyForce, but is affected by the knockback multiplier
 public void ApplyKnockback(float angle, float force)
 {
     rb.AddForce(TrigUtilities.DegreesToVector(angle) * force * knockbackMultiplier);
 }
 public void ApplyForce(float angle, float force)
 {
     rb.AddForce(TrigUtilities.DegreesToVector(angle) * force);
 }
Exemple #15
0
 void Update()
 {
     rb.rotation = -TrigUtilities.VectorToDegrees(rb.velocity);
 }