一、创建方格
1.创建GameController脚本,负责处理游戏逻辑。
-- 开始创建 16 个方格。
2.创建NumberSprite脚本,用于定义每个方格行为(设置图片,移动效果、合并效果)
3.创建ResourceManager类,用于管理资源,提供获取资源方法。(GetImage)
GameController脚本↓
using UnityEngine.UI;
using Console2048;
using UnityEngine.EventSystems;
using MoveDirection = Console2048.MoveDirection;
/// <summary>
///
/// </summary>
public class GameController : MonoBehaviour,IPointerDownHandler,IDragHandler
{
private GameCore core;
private NumberSprite[,] spriteActionArray;
//一、创建方格
private void Start()
{
core = new GameCore();
spriteActionArray = new NumberSprite[4, 4];
Init();
GenerateNumber();
GenerateNumber();
}
private void Init()
{
for (int r = 0; r < 4; r++)
{
for (int c = 0; c < 4; c++)
{
spriteActionArray[r, c] = CreateSprite(r, c);
}
}
}
private NumberSprite CreateSprite(int r,int c)
{
GameObject go = new GameObject(r.ToString() + c.ToString());
go.AddComponent<Image>();
go.transform.SetParent(transform,false);
var script = go.AddComponent<NumberSprite>();//执行Awake方法,Start会在"下一帧"才执行
script.SetImage(0);
return script;
}
//二、生成新数字
private void GenerateNumber()
{
Location loc;
int number;
core.GenerateNumber(out loc, out number);
//?修改loc位置上的精灵
//transform.Find(loc.RIndex.ToString()+loc.CIndex.ToString())
spriteActionArray[loc.RIndex, loc.CIndex].SetImage(number);
//播放生成动画
spriteActionArray[loc.RIndex, loc.CIndex].CreateEffect();
}
//四、输入检测
private Vector2 beginPoint;
private bool isDown = false;//是否按下
public void OnPointerDown(PointerEventData eventData)
{
beginPoint = eventData.position;
isDown = true;
}
//拖拽时每帧执行
public void OnDrag(PointerEventData eventData)
{
if (!isDown) return;
Vector3 touchOffset = eventData.position - beginPoint;
float x = Mathf.Abs(touchOffset.x);
float y = Mathf.Abs(touchOffset.y);
//int? a=null; 可空值类型
MoveDirection? dir = null;
if (x > y && x >50)
{
dir = touchOffset.x > 0 ? MoveDirection.Right : MoveDirection.Left;
}
if (y > x && y >50)
{
dir = touchOffset.y > 0 ? MoveDirection.Up : MoveDirection.Down;
}
if (dir != null)
{
core.Move(dir.Value);//获取可空值类型中的值类型数据
isDown = false;
}
}
//三、更新界面
private void Update()
{
if (core.IsChange)
{
//更新界面
UpdateMap();
GenerateNumber();
if (core.IsOver())
{
}
core.IsChange = false;
}
}
private void UpdateMap()
{
for (int r = 0; r < 4; r++)
{
for (int c = 0; c < 4; c++)
{
spriteActionArray[r, c].SetImage(core.Map[r, c]);
}
}
}
}
NumberSprite脚本↓
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
/// <summary>
/// 数字精灵,附加到每个方格中,定义每个方格行为
/// </summary>
public class NumberSprite : MonoBehaviour
{
private Image img;
private void Awake()
{
img = GetComponent<Image>();
}
public void SetImage(int number)
{
//0 --> 精灵 查找资源
img.sprite = ResourceManager.GetImage(number);
}
//合并效果
//移动效果
//生成效果
public void CreateEffect()
{
//小 --> 大
iTween.ScaleFrom(gameObject, Vector3.zero, 0.3f);
}
}
ResourceManager类↓
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 资源管理类
/// </summary>
public class ResourceManager
{
private static Dictionary<int,Sprite> spriteDIC;
//类被加载时执行1次
static ResourceManager()
{
//根据?名字 查找?图片
//键值对集合 / 字典集合
spriteDIC = new Dictionary<int, Sprite>();
Sprite[] spriteArray = Resources.LoadAll<Sprite>("2048Atlas");
//将数组元素存储到字典集合中
foreach (var item in spriteArray)
{
int intName = int.Parse(item.name);
spriteDIC.Add(intName, item);
}
}
public static Sprite GetImage(int number)
{
return spriteDIC[number];
}
}