您的位置:首页 > 移动开发 > Unity3D

Unity绘制GUI连连看(尚未完善效果和重置)

2015-08-20 09:22 543 查看


OneImage.cs

public class OneImage : MonoBehaviour
{
public int row, col;
public Rect rect;
public Texture texture;
public bool walkable = true;
public bool isinit = false;
public bool selected = false;

public OneImage()
{ }

public OneImage(Rect rect,int row,int col)
{
this.row = row;
this.col = col;
this.rect = rect;
this.walkable = true;
}
}


LinkLinkSee.cs

public class LinkLinkSee : MonoBehaviour
{
public int rows, cols;
public Texture black, wayTexture;
public Texture[] textures;
private OneImage[][] images;

bool game = true;
int upStep = 0;

void Start()
{
StartCoroutine("GameInit");
}

IEnumerator GameInit()
{
game = false;
rows += upStep;
cols += upStep;

int realRows = rows + 2;
int realCols = cols + 2;

float w = Screen.height / realRows;
float x = Screen.width / 2 - ((w * realCols + realCols) / 2);
float y = Screen.height / 2 - (w * realRows / 2);

images = new OneImage[realRows][];
for (int row = 0; row < realRows; row++)
{
images[row] = new OneImage[realCols];
for (int col = 0; col < realCols; col++)
{
images[row][col] = new OneImage(new Rect(x, y, w, w), row, col);
images[row][col].texture = black;
x += w + 1;
}
x = Screen.width / 2 - ((w * realCols + realCols) / 2);
y += w + 1;
}

for (int row = 1; row < realRows - 1; row++)
{
for (int col = 1; col < realCols - 1; col++)
{
if (images[row][col].isinit)
{
continue;
}
else
{
int textureIndex = Random.Range(0, textures.Length);
images[row][col].texture = textures[textureIndex];
images[row][col].isinit = true;
images[row][col].walkable = false;

int newRow = 1, newCol = 1;
int max = rows * cols;
while (images[newRow][newCol].isinit)
{
newRow = Random.Range(row, realRows - 1);
newCol = Random.Range(1, realCols - 1);
max--;
if (max <= 0)
break;
}
images[newRow][newCol].texture = textures[textureIndex];
images[newRow][newCol].isinit = true;
images[newRow][newCol].walkable = false;
yield return null;
}
}
}
game = true;
}

void OnGUI()
{
if (game)
{
bool isOver = true;
for (int row = 0; row < rows + 2; row++)
{
for (int col = 0; col < cols + 2; col++)
{
OneImage img = images[row][col];

if (!img.walkable)
{
isOver = false;
}

GUI.DrawTexture(img.rect, img.texture);
//GUI.Label(img.rect, img.walkable.ToString());
}
}
if (isOver)
{
game = false;
upStep++;
StartCoroutine("GameInit");
}
}
else
{
for (int row = 0; row < rows + 2; row++)
{
for (int col = 0; col < cols + 2; col++)
{
OneImage img = images[row][col];
GUI.DrawTexture(img.rect, img.texture);
}
}
}
}

private OneImage ChoseFirst = new OneImage(), ChoseSecond = new OneImage();
List<OneImage> FWay;
List<OneImage> SWay;

void Update()
{
if (Input.GetMouseButtonDown(0)&&game)
{
try
{
if (!ChoseFirst.selected)
{
ChoseFirst = GetChose(Input.mousePosition);
ChoseFirst.selected = true;
}
else
{
ChoseSecond = GetChose(Input.mousePosition);
if (CompareImg(ChoseFirst, ChoseSecond))
{
ChoseFirst.selected = false;
}
else
{
if (ChoseSecond.texture == ChoseFirst.texture)
{
FindWay(ChoseFirst, ChoseSecond);
ChoseFirst.selected = false;
}
else
{
ChoseFirst = ChoseSecond;
ChoseFirst.selected = true;
}
}
}
}
catch
{
ChoseFirst = new OneImage();
ChoseSecond = new OneImage();
}
}
}

private OneImage GetChose(Vector2 mousePos)
{
mousePos.y = Screen.height - mousePos.y;
for (int i = 0; i < rows + 2; i++)
{
for (int j = 0; j < cols + 2; j++)
{
if (images[i][j].rect.Contains(mousePos))
{
return images[i][j];
}
}
}
return null;
}

private void FindWay(OneImage F, OneImage S)
{
if (F.row == S.row && Mathf.Abs(F.col - S.col) == 1 || F.col == S.col && Mathf.Abs(F.row - S.row) == 1)
{
F.texture = wayTexture;
F.walkable = true;
S.texture = wayTexture;
S.walkable = true;
}
else
{
FWay = GetSingleWay(F);
SWay = GetSingleWay(S);

List<List<OneImage>> WayWay = new List<List<OneImage>>();
foreach (OneImage img in FWay)
{
List<OneImage> way = GetSingleWay(img);
foreach (OneImage one in way)
{
foreach (OneImage sone in SWay)
{
if (CompareImg(sone, one))
{
WayWay.Add(way);
break;
}
}
}
}

if (WayWay.Count > 0)//找到的路线数量>0
{
F.texture = S.texture = this.wayTexture;
F.walkable = S.walkable = true;
}
}
}

private List<OneImage> GetSingleWay(OneImage img)
{
List<OneImage> singleWay = new List<OneImage>();
for (int i = img.row; i >= 0; i--)
{
if (CompareImg(images[i][img.col], img) || images[i][img.col].walkable)
{
singleWay.Add(images[i][img.col]);
}
else
break;
}

for (int i = img.row; i < rows + 2; i++)
{
if (CompareImg(images[i][img.col], img) || images[i][img.col].walkable)
{
singleWay.Add(images[i][img.col]);
}
else
break;
}

for (int i = img.col; i >= 0; i--)
{
if (CompareImg(images[img.row][i], img) || images[img.row][i].walkable)
{
singleWay.Add(images[img.row][i]);
}
else
break;
}

for (int i = img.col; i < cols + 2; i++)
{
if (CompareImg(images[img.row][i], img) || images[img.row][i].walkable)
{
singleWay.Add(images[img.row][i]);
}
else
break;
}

return singleWay;
}

private bool CompareImg(OneImage F, OneImage S)
{
if (F.row == S.row && F.col == S.col)
return true;
else
return false;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: