您的位置:首页 > 其它

记忆力小游戏

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;
}


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