记忆力小游戏
2018-03-07 10:32
225 查看
这是一款经典的记忆力小游戏 针对初学者
/*
精灵是显示在屏幕上的2D图像,和显示在3D模型表面的图像不同(贴图)
Edit|ProjectSetting|Editor中的Default Behaviour Mode设置 2D 设置编辑器为2D模式会让导入的图像设置为Sprite X和Y是在2D屏幕上影响对象定位的唯一坐标,然而Z坐标依然影响对象堆叠在其他对象上,Z值越低,离摄像机越近 图集能通过两种方式优化性能: 1)通过把它们紧凑地打包在一起减少空间的浪费 2)通过减少视频卡的绘制调用(draw call)(每加载一个新图像将导致视频卡多做一些工作) 像素完美(Pixel-perfect)意味着屏幕上的一个像素对应图像中的一个像素(否则,视频卡将会让图像 在缩放到适应屏幕时变得模糊) 假设你想要在1024*768屏幕上实现完美像素,这意味着摄像机的高度应该是384像素。除以100(因为像素对应单位的缩放) 并得到摄像机大小为3.84
*/
public class MemoryCard : MonoBehaviour {
[SerializeField] private GameObject cardBack; // 2 通过这个对象来添加图像 [SerializeField] private SceneController controller; private int _id; public int id { get { return _id; } } public void SetCard(int id,Sprite image) { _id = id; GetComponent<SpriteRenderer>().sprite = image; } //通过代码添加图像 //[SerializeField] //private Sprite image; // Use this for initialization void Start () { // GetComponent<SpriteRenderer>().sprite = image; } // Update is called once per frame void Update () { } public void OnMouseDown() { //检查控制器的canReveal属性,确保同时只有两张卡片是翻开的 if (cardBack.activeSelf&&controller.canReveal) { cardBack.SetActive(false); controller.CardRevealed(this); } } /// <summary> /// 一个公有方法,因此SceneController可以再次隐藏卡片 /// </summary> public void Unreveal() { cardBack.SetActive(true); }
}
using System.Collections;using System.Collections.Generic;
using UnityEngine;
public class SceneController : MonoBehaviour {
[SerializeField] private TextMesh scoreLabel; public const 4000 int gridRows = 2; public const int gridCols = 4; public const float offsetX = 2; public const float offsetY = 2.5f; //引用场景中的卡片 [SerializeField] private MemoryCard originalCard; [SerializeField] private Sprite[] images; private int _score = 0; // Use this for initialization void Start () { //int id = Random.Range(0,images.Length); //originalCard.SetCard(id,images[id]); //第一张卡片的位置,所有其他卡片将从这里开始偏移 Vector3 startPos = originalCard.transform.position; //使用ID对为所有四种卡片精灵声明一个整型数组 int[] numbers = { 0, 0, 1, 1, 2, 2, 3, 3 }; numbers = ShuffleArray(numbers); for (int i = 0; i < gridCols; i++)//列 { for (int j = 0; j< gridRows; j++)//行 { MemoryCard card; if (i==0&&j==0) { card = originalCard; } else { card = Instantiate(originalCard) as MemoryCard; } //i=0 1 2 3 //j=0 1 //-------------- // 0 4 1 5 2 6 3 7 // int index = j * gridCols + i; //int id = Random.Range(0, images.Length); int id = numbers[index];//从打乱的列表中取出ID而不是随机生成 card.SetCard(id, images[id]); float posX = (offsetX * i) + startPos.x; float posY = -(offsetY * j) + startPos.y; //对于2D图形,你只需要偏移X和Y;保持z轴一致 card.transform.position = new Vector3(posX,posY,startPos.z); } } } private MemoryCard _firstRevealed; private MemoryCard _secondRevealed; //当已经存在第二张翻开的卡片时,getter方法返回false; public bool canReveal { get { return _secondRevealed == null; } } public void CardRevealed(MemoryCard card) { if (_firstRevealed == null) { _firstRevealed = card; } else { _secondRevealed = card; // Debug.Log(_firstRevealed.id+_secondRevealed.id); StartCoroutine(CheckMatch()); } } // Update is called once per frame void Update () { } //洗牌算法(费谢尔算法) private int[] ShuffleArray(int[] numbers) { //浅克隆 不会影响原来的值 int[] newArray = numbers.Clone() as int[]; for (int i = 0; i < newArray.Length; i++) { // 0 int temp = newArray[i];//0 1 2 3 4 5 6 7 // 1 //0 0 1 1 2 2 3 3 int r = Random.Range(i,newArray.Length); newArray[i] = newArray[r]; newArray[r] = temp; } return newArray; } private IEnumerator CheckMatch() { if (_firstRevealed.id == _secondRevealed.id) { _score++; scoreLabel.text = "Score: " + _score; } else { yield return new WaitForSeconds(0.5f); _firstRevealed.Unreveal(); _secondRevealed.Unreveal(); } _firstRevealed = null; _secondRevealed = null; }
}
相关文章推荐
- 记忆力训练--网页小游戏
- 一个测试记忆力的小游戏
- 记忆力小游戏
- 用51单片机设计一款记忆力测试小游戏
- 考验记忆力的翻牌小游戏
- Unity-3D捕鱼达人小游戏开发 —— 起因和开始的设置以及准备工作
- 猜数字小游戏
- 小游戏——抢红包
- python小游戏
- C语言小游戏:简易版扫雷
- python开发华容道小游戏
- 仿写“跳一跳”微信小游戏
- 【开源】微信小程序、小游戏以及 Web 通用 Canvas 渲染引擎 - Cax
- C++实现产生随机数和相应的猜拳小游戏实例代码
- 综合实践_猜数字小游戏
- 用Visual Basic自编小游戏
- J2ME 2D小游戏入门之旅(七) 不足多多,你认为呢?
- J2ME 2D小游戏入门之旅(六) 计时器和奖惩与评价
- 如何提高你的记忆力之一
- 科学家称要保持好记忆力需要少看电视多看书