Exemplo n.º 1
0
    private void DoMelee()
    {
        if (meleeAttackTimer > 0f)
        {
            return;
        }

        meleeAttackTimer = meleeAttackDelay;

        RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, moveDir, meleeDistance);

        bool didHit = false;

        foreach (RaycastHit2D hit in hits)
        {
            if (hit.collider.gameObject != this.gameObject)
            {
                // first hit other than me

                // deal damage to player
                CharacterController2D otherPlayer = hit.collider.GetComponent <CharacterController2D>();
                if (otherPlayer != null)
                {
                    didHit = true;
                    otherPlayer.Hit(3);

                    if (otherPlayer.hitpoints == 0)
                    {
                        otherPlayer.gameObject.SetActive(false);
                        otherPlayer.ReleaseCapturedPlayers();
                        capturedPlayers.Add(otherPlayer.playerID);
                    }
                }

                //Debug.Log(hit.collider.gameObject.name);
                break;
            }
        }

        // create melee
        GameObject newMelee = Instantiate(meleePrefab);

        newMelee.transform.position   = transform.position + (Vector3)moveDir.normalized * 0.5f;
        newMelee.transform.localScale = Vector3.one;
        newMelee.transform.Rotate(new Vector3(0, 0, Vector2.SignedAngle(Vector2.right, moveDir.normalized)));
        DespawnAnimation dAnim = newMelee.GetComponent <DespawnAnimation>();

        dAnim.spriteList     = SpriteManager.instance.GetModifiedSprites(SpriteManager.MELEE_SPRITES);
        dAnim.incrementIndex = true;
        dAnim.FrameTimer     = 1 / 20f;

        GameLogic.instance.soundGenerator.AddSwordSound();
    }
Exemplo n.º 2
0
    private void Update()
    {
        crosshair.enabled = attackPressed;
        chargeRenderer.gameObject.SetActive(attackPressed);
        // charge attack
        if (attackPressed)
        {
            attackCharge = Mathf.Min(attackCharge + Time.deltaTime * attackChargeRate, attackMaxCharge);

            crosshair.SetPosition(0, transform.position + (Vector3)attackDir.normalized * 0.4f);
            crosshair.SetPosition(1, transform.position + (Vector3)attackDir.normalized * 1f);
            crosshair.startWidth = crosshair.endWidth = Mathf.Clamp01(attackCharge / attackMaxCharge) * 0.3f;

            chargeRenderer.sprite = chargeSprites[Mathf.FloorToInt(Mathf.Clamp01(attackCharge / attackMaxCharge) * (chargeSprites.Count - 4))];
        }
        else
        {
            // not pressing attack joystick

            if (attackCharge > 0)
            {
                RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, attackDir);

                foreach (RaycastHit2D hit in hits)
                {
                    if (hit.collider.gameObject != this.gameObject && hit.collider.GetComponent <RobotPartPhysics>() == null && hit.collider.GetComponent <MagnetCollider>() == null)
                    {
                        // first hit other than me

                        // create laser
                        GameObject newLaser = Instantiate(laserPrefab);
                        newLaser.transform.position = new Vector2(transform.position.x, transform.position.y);
                        SpriteRenderer sr = newLaser.GetComponent <SpriteRenderer>();
                        newLaser.transform.Rotate(Vector3.forward, Vector2.SignedAngle(Vector2.right, attackDir.normalized));
                        sr.size = new Vector2(hit.distance, 1);
                        sr.material.SetTexture("_SwapTex", mainColorSwapTex);
                        DespawnAnimation dAnim = newLaser.GetComponent <DespawnAnimation>();
                        dAnim.incrementIndex = false;
                        dAnim.FrameTimer     = 0.2f;
                        dAnim.spriteList     = SpriteManager.instance.GetModifiedSprites(SpriteManager.LASER_SPRITES);
                        dAnim.spriteIndex    = Mathf.FloorToInt(Mathf.Clamp01(attackCharge / attackMaxCharge) * (dAnim.spriteList.Count - 1));

                        GameObject chargePuff = Instantiate(chargeRenderer.gameObject, transform);
                        chargePuff.SetActive(true);
                        chargePuff.GetComponent <SpriteRenderer>().sortingOrder = 20;
                        DespawnAnimation dAnim2 = chargePuff.AddComponent(typeof(DespawnAnimation)) as DespawnAnimation;
                        dAnim2.incrementIndex = true;
                        dAnim2.FrameTimer     = 0.07f;
                        dAnim2.spriteList     = chargeSprites;
                        dAnim2.spriteIndex    = 7;

                        // deal damage to player
                        CharacterController2D otherPlayer = hit.collider.GetComponent <CharacterController2D>();
                        if (otherPlayer != null)
                        {
                            otherPlayer.Hit(attackCharge);
                        }

                        //Debug.Log(hit.collider.gameObject.name);
                        break;
                    }
                }

                GameLogic.instance.soundGenerator.AddLaserSound();

                attackCharge = 0;
            }
        }

        if (attackCharge > 0 && !hasCharged)
        {
            GameLogic.instance.soundGenerator.AddLaserChargeSound(); hasCharged = true;
        }
        else if (attackCharge == 0)
        {
            hasCharged = false;
        }

        Vector2 direction = movePressed ? moveDir : Vector2.zero;

        // Use GetAxisRaw to ensure our input is either 0, 1 or -1.
        if (testWithKeyboard)
        {
            direction.x = Input.GetAxisRaw("Horizontal");
            direction.y = Input.GetAxisRaw("Vertical");
            moveDir     = direction;


            attackPressed = Input.GetMouseButton(0);

            attackDir = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
            attackDir.Normalize();

            if (Input.GetKeyDown(KeyCode.Space))
            {
                DoMelee();
            }
        }

        if (direction != Vector2.zero)
        {
            stopWalkNoise = false;
            GameLogic.instance.soundGenerator.AddWalkSound();

            legFrameTimer -= Time.deltaTime;
            if (legFrameTimer <= 0)
            {
                legFrameTimer += LegFrameInterval;
                legIndex       = ++legIndex % legSprites.Count;
            }

            if (legIndex == 0 || legIndex == 5)
            {
                GameObject dust = Instantiate(dustPrefab, GameLogic.instance.playerParentTransform);
                dust.transform.position = transform.position + new Vector3(legIndex == 0 ? -0.45f : 0.45f, -0.35f);
                DespawnAnimation dAnim = dust.GetComponent <DespawnAnimation>();
                dAnim.spriteList     = SpriteManager.instance.GetModifiedSprites(SpriteManager.WALK_DUST_SPRITES);
                dAnim.incrementIndex = true;
                dAnim.spriteIndex    = 0;
                dAnim.FrameTimer     = 0.3f;
            }

            wireFrameTimer -= Time.deltaTime; // double up on wire frame time when walking
        }
        else if (stopWalkNoise == false)
        {
            GameLogic.instance.soundGenerator.StopWalkSound(); stopWalkNoise = true;
        }

        wireFrameTimer -= Time.deltaTime;
        if (wireFrameTimer <= 0)
        {
            wireFrameTimer += WireFrameInterval;
            wireIndex       = ++wireIndex % wireSprites.Count;
        }

        shinyRenderer.gameObject.SetActive(false);
        if (hitpoints == MAX_HP)
        {
            shinyTimer -= Time.deltaTime;

            if (shinyTimer <= 0)
            {
                shinyIndex = Mathf.FloorToInt(Mathf.Abs(shinyTimer) * 16);

                if (shinyIndex >= shinySprites.Count)
                {
                    shinyTimer = Random.Range(2f, 3f);
                }
                else
                {
                    shinyRenderer.sprite = shinySprites[shinyIndex];
                    shinyRenderer.gameObject.SetActive(true);
                }
            }
        }

        velocity = direction;
        velocity.Normalize();
        robot.AddForce(velocity * speed, ForceMode2D.Impulse);

        //if (Input.GetAxisRaw("Jump") != 0 && !isHit) {
        //    //isHit = true;
        //    GameObject robotPart = Instantiate(partPrefab, partParentTransform);

        //}

        bodyIndex = Mathf.Clamp(bodySprites.Count - Mathf.RoundToInt(bodySprites.Count * ((float)hitpoints / MAX_HP)), 0, bodySprites.Count - 1);

        bodyRenderer.sprite = bodySprites[bodyIndex];
        shinyRenderer.GetComponent <SpriteMask>().sprite = bodySprites[bodyIndex];
        legRenderer.sprite  = legSprites[legIndex];
        wireRenderer.sprite = wireSprites[wireIndex];
        wireRenderer.gameObject.SetActive(bodyIndex >= bodySprites.Count - 2);

        Vector3 scale = Vector3.one;

        scale.x = moveDir.x < 0 ? -1 : 1;
        bodyRenderer.transform.localScale  = scale;
        legRenderer.transform.localScale   = scale;
        wireRenderer.transform.localScale  = scale;
        shinyRenderer.transform.localScale = scale;

        if (hitpoints == 0)
        {
            isBlinking = true;
            if (blinkTimer <= -0.2f)
            {
                blinkTimer = 0.2f;
                SetRobotColor(Color.red, false);
            }
        }

        if (isBlinking)
        {
            blinkTimer -= Time.deltaTime;
            if (blinkTimer <= 0)
            {
                SetRobotColor(Color.clear, true);
                isBlinking = false;
            }
        }

        if (meleeAttackTimer > 0f)
        {
            meleeAttackTimer -= Time.deltaTime;
        }
    }