上一篇:【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;
}
}
添加旗子图像
其中flagImage
和noFlagImage
是有雷和没有雷的图像,在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
中的ClickMine
和SetFlag
函数。为了能调用GameLogic
的函数,这里在初始化时使用FindAnyObjectByType
函数在游戏里寻找了这个类型。
注意必须要继承IPointerClickHandler类
才能使用OnPointerClick
相关功能。
有旗子的格子额外处理
为了让已经标了旗子的格子无法再使用左键点击,在GameLogic
的ClickMine
中添加判断:
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.胜利判定