今天给大家分享一个小游戏,应公司需求今天花了点时间做了个华容道拼图小游戏,请大家多少指点,直接上代码
using UnityEngine; using DG.Tweening; using UnityEngine.UI; using System.Collections.Generic; public enum MoveDirectionType { UP, DOWN, LEFT, RIGHT, NONE, } public class KlotskiItem : MonoBehaviour { private void Awake() { myAwake(); } private MyButton btn_click; private CallBack<Vector2[],int,bool> callBack = null; private int index = -1; private Image klotskiIcon; private ManagerVars vars; private Vector2 dot; private float widthAndHeight = 240; private Text txt_test; private Vector2[] allAroundDot = new Vector2[4]; private Vector2 defaultDot; private void myAwake() { vars = ManagerVars.getManagerVars(); btn_click = GetComponent<MyButton>(); btn_click.OnPointerDown(pointerDown); klotskiIcon = GetComponent<Image>(); txt_test = transform.Find("Text").GetComponent<Text>(); } /// <summary> /// 按钮按下事件触发 /// </summary> private void pointerDown() { //Debug.LogError(dot); if (GameApp.klotskiFristMove) { if (dot.x == 2 && dot.y == 2) { toMove(MoveDirectionType.RIGHT); dot.x = 3; refreshDot(dot); GameApp.klotskiFristMove = false; } } else { if (dot.x == 3 && dot.y == 2) { // 把第一步归为,检查第一个空出的位置是否被占用,并且检查师傅完成拼图 allAroundDot[0] = new Vector2(-10,-10); allAroundDot[1] = new Vector2(-10, -10); allAroundDot[2] = new Vector2(2, 2); allAroundDot[3] = new Vector2(-10, -10); callBack(allAroundDot, index,true); } else { if (callBack != null) { findAllAroundDot(); callBack(allAroundDot, index,false); } } } } /// <summary> /// 设置属性信息 /// </summary> /// <param name="_index"></param> /// <param name="_iconLocation"></param> /// <param name="_dot"></param> /// <param name="clickCallCack"></param> public void settingData(int _index,int _iconLocation,Vector2 _dot, Vector2 _defaultDot, CallBack<Vector2[],int,bool> clickCallCack) { index = _index; refreshDot(_dot); defaultDot = _defaultDot; callBack = clickCallCack; klotskiIcon.sprite = vars.getKlotskiSpriteDicByName("1_0"+ _iconLocation); } /// <summary> /// 更新坐标点 /// </summary> /// <param name="_dot"></param> private void refreshDot(Vector2 _dot) { dot = _dot; txt_test.text = dot.ToString(); } public void move(MoveDirectionType mdt) { toMove(mdt); switch (mdt) { case MoveDirectionType.UP: dot.y -= 1; break; case MoveDirectionType.DOWN: dot.y += 1; break; case MoveDirectionType.LEFT: dot.x -= 1; break; case MoveDirectionType.RIGHT: dot.x += 1; break; } refreshDot(dot); } /// <summary> /// 图片移动 /// </summary> /// <param name="mdt"></param> private void toMove(MoveDirectionType mdt) { if (mdt == MoveDirectionType.NONE) return; Vector3 newPosition = Vector3.zero; newPosition = transform.localPosition; switch (mdt) { case MoveDirectionType.UP: newPosition.y += widthAndHeight; break; case MoveDirectionType.DOWN: newPosition.y -= widthAndHeight; break; case MoveDirectionType.LEFT: newPosition.x -= widthAndHeight; break; case MoveDirectionType.RIGHT: newPosition.x += widthAndHeight; break; } transform.localPosition = newPosition; } /// <summary> /// 检查对应位置 /// </summary> /// <param name="_dot"></param> /// <returns></returns> public bool checkDot(Vector2 _dot) { return dot.x == _dot.x && dot.y == _dot.y; } /// <summary> /// 获取当前图片四周位置 /// </summary> private void findAllAroundDot() { settingDot(dot.x, dot.y - 1,0); settingDot(dot.x, dot.y + 1, 1); settingDot(dot.x - 1, dot.y, 2); settingDot(dot.x + 1, dot.y, 3); } /// <summary> /// 把符合要求的点放入列表 /// </summary> /// <param name="_x"></param> /// <param name="_y"></param> private void settingDot(float _x,float _y,int _index) { Vector2 newDot = Vector2.zero; if (checkJudge(_x) && checkJudge(_y)) { newDot.x = _x; newDot.y = _y; allAroundDot[_index] = newDot; } else { newDot.x = -10; newDot.y = -10; allAroundDot[_index] = newDot; } } /// <summary> /// 检查范围 /// </summary> /// <param name="_value"></param> /// <returns></returns> private bool checkJudge(float _value) { return _value >= 0 && _value < 3; } public bool checkPositionIsEqual() { return dot.x == defaultDot.x && dot.y == defaultDot.y; } }
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class KlotskiPanel : MonoBehaviour
{
private void Awake()
{
myAwake();
}
public Vector2[] defaultDot;
private Button btn_back;
private Button btn_reset;
private List<KlotskiItem> allKlotskiItem;
private float _X,_Y;
private int maxCount = 9;
private float widthAndHeight = 240;
private Vector3 newDot = Vector3.zero;
private int[] allLocation = { 2,3,6,5,1,8,7,4,9};
private ManagerVars vars;
private void myAwake() {
btn_back = transform.Find("back").GetComponent<Button>();
btn_back.onClick.AddListener(()=> { gameObject.SetActive(false); });
btn_reset = transform.Find("reset").GetComponent<Button>();
btn_reset.onClick.AddListener(resetEvent);
vars = ManagerVars.getManagerVars();
allKlotskiItem = new List<KlotskiItem>();
_X = -300;
_Y = 240;
gameObject.SetActive(false);
//init();
}
private void init()
{
gameObject.SetActive(true);
if (!GameApp.isStartKlotskiGame)
{
GameApp.isStartKlotskiGame = true;
resetEvent();
}
}
private void resetEvent() {
GameApp.klotskiFristMove = true;
// 初始化九宫格位置点
for (int i = 0; i < maxCount; i++)
{
Vector2 dot = new Vector2((i % 3), (i / 3));
newDot.x = (i % 3) * widthAndHeight + _X;
newDot.y = _Y - (i / 3) * widthAndHeight;
instantiateItem(i, dot);
}
}
private void instantiateItem(int _index, Vector2 _dot) {
int length = allKlotskiItem.Count;
KlotskiItem ki = null;
if (_index < length)
{
ki = allKlotskiItem[_index];
}
else {
GameObject go = Instantiate(vars.klotskiItem);
go.transform.SetParent(transform, false);
ki = go.GetComponent<KlotskiItem>();
allKlotskiItem.Add(ki);
}
ki.gameObject.transform.localPosition = newDot;
int location = allLocation[_index];
ki.settingData(_index, location, _dot, defaultDot[location - 1], clickCallCack);
}
//private void instantiateItem(int _index,Vector2 _dot) {
// GameObject go = Instantiate(vars.klotskiItem);
// go.transform.SetParent(transform, false);
// go.transform.localPosition = newDot;
// KlotskiItem ki = go.GetComponent<KlotskiItem>();
// allKlotskiItem.Add(ki);
//}
private void clickCallCack(Vector2[] _allAround,int _index,bool isWin) {
int length = _allAround.Length;
for (int i = 0; i < length; i++)
{
Vector2 dot = _allAround[i];
if (dot.x != -10 && dot.y != -10)
{
bool ret = checkAllKlotskiItem(dot);
if (!ret)
{
allKlotskiItem[_index].move((MoveDirectionType)i);
if (isWin)
{
checkGameWin();
}
break;
}
}
}
}
private bool checkAllKlotskiItem(Vector2 _dot) {
bool ret = false;
int length = allKlotskiItem.Count;
for (int i = 0; i < length; i++)
{
KlotskiItem ki = allKlotskiItem[i];
ret = ki.checkDot(_dot);
if (ret) break;
}
return ret;
}
private void checkGameWin() {
int length = allKlotskiItem.Count;
for (int i = 0; i < length; i++)
{
KlotskiItem ki = allKlotskiItem[i];
bool ret = ki.checkPositionIsEqual();
if (!ret) {
GameApp.klotskiFristMove = true;
Debug.LogError("未完成拼图");
return;
}
}
Debug.LogError("胜利");
}
}