项目实训(七)

本文详细介绍了豌豆射手在游戏中的攻击功能实现,包括如何选择最近的僵尸进行攻击,以及子弹的生成、运动和碰撞检测。在攻击过程中,子弹会对僵尸造成伤害并显示击中效果,同时僵尸会根据受到的伤害改变颜色。此外,还讨论了僵尸受伤时的生命值变化和视觉反馈。
摘要由CSDN通过智能技术生成

本次介绍豌豆射手功能的实现,由于后续会需要很多的植物,所以将植物基本的方法定义到植物基类中进行实现。豌豆射手的脚本中只编写他独特的功能代码。豌豆射手功能为射出子弹对僵尸造成攻击。

豌豆射手与向日葵相同的初始化功能都在基类中实现不进行过多介绍,主要是初始化分为两种,一种为鼠标点击的初始化,一种为种植后的初始化,另外还有植物初始生命、所需阳光等基本属性的设置。

他所独特的功能为攻击僵尸,同时也涉及到对子弹的管理,首先主要介绍攻击方法的实现,豌豆射手只能攻击距离其最近的第一个僵尸,并且当且仅当僵尸位于植物右方并且在草坪上时。代码实现如下。

private void Attack()
    {
        if (canAttack == false) return;

        // 从僵尸管理器 获取一个离我最近的僵尸
        ZombieBase zombie = ZombieManager.Instance.GetZombieByLineMinDistance((int)currGrid.Point.y, transform.position);
        // 没有僵尸 跳出
        if (zombie == null) return;
        // 僵尸必须在草坪上 否则跳出
        if (zombie.CurrGrid.Point.x == 8 && Vector2.Distance(zombie.transform.position, zombie.CurrGrid.Position) > 1.5f) return;
        // 如果僵尸不左边跳出
        if (zombie.transform.position.x < transform.position.x) return;
        // 在枪口实例化一个子弹
        Bullet bullet = PoolManager.Instance.GetObj(GameManager.Instance.GameConf.Bullet1).GetComponent<Bullet>();
        //bullet.transform.SetParent(transform);
        bullet.Init(attackValue, transform.position + creatBulletOffsetPos);
        CDEnter();
        canAttack = false;
    }

当满足攻击条件时可以进行实例化子弹,并且每次攻击之间需要设定冷却时间。首先子弹发射后应该在空中以一定速度旋转前进,当与僵尸发生碰撞后进行图片的转换并进行图片销毁,并且僵尸生命值发生变化。

public void Init(int attackValue,Vector2 pos)
    {
        transform.position = pos;
        rigidbody = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        rigidbody.AddForce(Vector2.right*300);
        this.attackValue = attackValue;
        rigidbody.gravityScale = 0;
        isHit = false;
        // 修改成正常状态的图片
        spriteRenderer.sprite = GameManager.Instance.GameConf.Bullet1Nor;
    }
private void OnTriggerEnter2D(Collider2D coll)
    {
        if (coll.GetComponentInParent<ZombieBase>() == null) return;
        if (isHit) return;
        if (coll.tag == "Zombie")
        {
            isHit = true;
                
            // 让僵尸受伤
            coll.GetComponentInParent<ZombieBase>().Hurt(attackValue);
            // 修改成击中图片
            spriteRenderer.sprite = GameManager.Instance.GameConf.Bullet1Hit;

            // 暂停自身的运动
            rigidbody.velocity = Vector2.zero;

            // 下落
            rigidbody.gravityScale = 1;

            // 销毁自身
            Invoke("Destroy", 0.5f);

        }
    }

其中僵尸被攻击时如果没有死亡生命值下降并且展现出变色效果表示受到攻击。

public void Hurt(int attackValue)
    {
        hurtNum += 1;
        Hp -= attackValue;
        if (State!=ZombieState.Dead)
        {
            if(spriteRenderer.color != new Color(0.16f, 0.17f, 0.74f))   //如果没有减速 则变色
            StartCoroutine(ColorEF(0.2f, new Color(0.4f, 0.4f, 0.4f), 0.05f, null));
            //StartCoroutine(SlowColor( new Color(0.4f, 0.4f, 0.4f), 2f, null));

        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值