public bool IsClickedFirst = false;
public Block FirstBlock;
public Vector2 FirstBlockPos;
然后添加如下基本函数:
private void SelectFirstBlock()
{
grid.FirstBlock = this;
grid.FirstBlockPos = new Vector2(transform.position.x, transform.position.y);
SelectedBlock();
}
函数会记录第一次点击的宝石,并选择当前宝石。
private bool IsNeighbor()
{
if (Mathf.Abs(transform.position.x - grid.FirstBlockPos.x) +
Mathf.Abs(transform.position.y - grid.FirstBlockPos.y) == 1)
return true;
return false;
}
函数用于判断当前宝石和第一块宝石是不是相邻的宝石,相邻的宝石可以交换。
private void SwapArray(int x1, int y1, int x2, int y2)
{
int n = grid.MapNum[x1, y1];
grid.MapNum[x1, y1] = grid.MapNum[x2, y2];
grid.MapNum[x2, y2] = n;
Block b = grid.Map[x1, y1];
grid.Map[x1, y1] = grid.Map[x2, y2];
grid.Map[x2, y2] = b;
}
函数会将两块宝石在宝石地图中的位置交换。
private void SwapBlocks()
{
SwapArray((int)transform.position.x, (int)transform.position.y,
(int)grid.FirstBlockPos.x, (int)grid.FirstBlockPos.y);
Vector2 thisPos = transform.position;
transform.position = grid.FirstBlockPos;
grid.FirstBlock.transform.position = thisPos;
grid.FirstBlockPos = thisPos;
}
函数用于交换两颗宝石,首先交换他们在宝石地图数组中的位置,然后在交换他们在现实世界中的位置。
然后我们修改函数:
private void OnMouseUpAsButton()
{
grid.IsClickedFirst = !grid.IsClickedFirst;
if (grid.IsClickedFirst)
{
// 添加选择图标
SelectFirstBlock();
}
else
{
// 取消选择图标
UnSelectedBlock();
// 判断是否相邻
if (!IsNeighbor())
{
grid.IsClickedFirst = !grid.IsClickedFirst;
SelectFirstBlock();
return;
}
// 交换宝石位置
SwapBlocks(false);
}
}
现在我们就可以交换两颗相邻宝石的位置了。
美化动画
现在交换两颗宝石我们是直接改变其位置,有一个插件可以轻松的实现一系列动画,现在我们要使用动画插件来使我们的交换动作看起来更顺畅。打开Asset Store窗口,搜索:
我们看到两个,一个是付费版本,一个是免费版本,我们使用免费版本就可以了,点击进去,点击‘导入’,会弹出一个窗口,选择全部,并导入:
导入完成后,会多出一个文件夹:
现在我们就可以使用了,首先在Block.cs中加入命名空间:
using System.Collections;
using DG.Tweening;
然后修改函数:
private void SwapBlocks()
{
SwapArray((int)transform.position.x, (int)transform.position.y,
(int)grid.FirstBlockPos.x, (int)grid.FirstBlockPos.y);
Vector2 thisPos = transform.position;
Vector2 thatPos = grid.FirstBlockPos;
grid.FirstBlockPos = thisPos;
Sequence seq = DOTween.Sequence();
Tweener move1 = transform.DOMove(thatPos, 0.5f);
Tweener move2 = grid.FirstBlock.transform.DOMove(thisPos, 0.5f);
seq.Insert(0f, move1);
seq.Insert(0f, move2);
}
这里我们使用到了序列,move1和move2是两颗宝石移动的动画,将两个动画插入到序列为0秒的位置,意思就是这两个动画同时进行,每个动画的时间是0.5秒。
现在我们运行程序,就可以看到两颗宝石交换的动画了:
下一节教程中,我将讲解消除宝石算法。
评论(0)