Unity学习笔记:2048游戏前端逻辑(1)

一、创建方格
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];
    }
 
}

猜你喜欢

转载自blog.csdn.net/huanyu0127/article/details/105813594