【unity】9.右键单击添加旗子(Button Right Click事件)

上一篇:【unity】8.深度优先搜索


修改点击监听事件

在之前的代码中,我们将给每个按钮设置监听事件写在了GameLogic中初始化按钮的地方,现在把这一段注释掉

    void InitButton(GameObject _button, int _row, int _col, int _buttonSize)
    {
        //前略

/*      //这里原本是给按钮设置listerner的地方,现在注释掉
        _button.GetComponent<Button>().onClick.AddListener(
            delegate{
                ClickMine(_button);
            }
        );*/
    }

将左右键点击函数设为public

然后新增函数SetFlag并将ClickMine函数修改为public:

    public Sprite flagImage;
    public Sprite noFlagImage;	

    public void ClickMine(GameObject _button)
    {
   		//以下略
    }

   	public void SetFlag(GameObject _button)
    {
        MinesweeperButton _mineSweeperButton = _button.GetComponent<MinesweeperButton>();
        int _row = _mineSweeperButton.GetRow();
        int _col = _mineSweeperButton.GetCol();
        //有旗的格子右键后设为无旗,无旗的格子右键后设为有旗
        _mineSweeperButton.SetHasFlag(!_mineSweeperButton.GetHasFlag());
        if (_mineSweeperButton.GetHasFlag())
        {
            _button.GetComponent<Image>().sprite = flagImage;
        }
        else
        {
            _button.GetComponent<Image>().sprite = noFlagImage;
        }
    }

添加旗子图像

其中flagImagenoFlagImage是有雷和没有雷的图像,在unity中选中GameLogic进行修改
在这里插入图片描述
flag图标自己画了一张,存放在Image文件夹下,UISprite直接使用unity自带的即可
在这里插入图片描述

将左右键监听事件写在button里

然后在MineSweeperButton.cs中添加如下代码,这段代码参考了这篇文章

public class MinesweeperButton : MonoBehaviour, IPointerClickHandler
{
	//前略
	
    GameLogic gameLogic;
    bool hasFlag = false;
    
    public void SetHasFlag(bool _hasFlag)
    {
        hasFlag = _hasFlag;
    }

    public bool GetHasFlag()
    {
        return hasFlag;
    }
        
	public UnityEvent leftClick;
    public UnityEvent rightClick;

    private void Start()
    {
        leftClick.AddListener(new UnityAction(ButtonLeftClick));
        rightClick.AddListener(new UnityAction(ButtonRightClick));
        gameLogic = FindAnyObjectByType<GameLogic>();
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left)
            leftClick.Invoke();
        else if (eventData.button == PointerEventData.InputButton.Right)
            rightClick.Invoke();
    }

    private void ButtonLeftClick()
    {
        gameLogic.ClickMine(gameObject);
    }

    private void ButtonRightClick()
    {
        gameLogic.SetFlag(gameObject);
    }
}

这段代码中,使用hasFlag来标记该格子中是否标记过旗子,然后把左右键的事件监听都放在按钮身上,在点击后调用GameLogic中的ClickMineSetFlag函数。为了能调用GameLogic的函数,这里在初始化时使用FindAnyObjectByType函数在游戏里寻找了这个类型。

注意必须要继承IPointerClickHandler类才能使用OnPointerClick相关功能。

有旗子的格子额外处理

为了让已经标了旗子的格子无法再使用左键点击,在GameLogicClickMine中添加判断:

    public void ClickMine(GameObject _button)
    {
        int _row = _button.GetComponent<MinesweeperButton>().GetRow();
        int _col = _button.GetComponent<MinesweeperButton>().GetCol();
        
        //没标记过旗子才能进行点击事件
        if (_button.GetComponent<MinesweeperButton>().GetHasFlag() == false)
        {
            if (bombList.Contains(_row * maxCol + _col))
            {
                _button.GetComponent<Image>().color = Color.red;
                _button.GetComponent<Button>().enabled = false;
            }
            else
            {
                DFSMine(_row, _col);
            }
        }
    }

运行效果

代码运行效果如下:
在这里插入图片描述


下一篇:【unity】10.胜利判定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值