【问题标题】:Memory Game - How to match with different images?记忆游戏 - 如何匹配不同的图像?
【发布时间】:2019-02-26 08:36:04
【问题描述】:

我知道这听起来可能很奇怪,但我需要制作一个记忆游戏来匹配不同的图像而不是两个相同的图像,例如,第一和伸出食指的手

这是我匹配两个相同图像的实际代码,它克隆了使相同图像出现两次的卡片

下面的场景控制器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneController : MonoBehaviour {

public const int gridRows = 2;
public const int gridCols = 5;
public const float offsetX = 4f;
public const float offsetY = 5f;

[SerializeField] private MainCard originalCard;
[SerializeField] private Sprite[] images;

private void Start()
{
    Vector3 startPos = originalCard.transform.position; //The first position of the cards, all other cards are based on this one

    int[] numbers = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4};
    numbers = ShuffleArray(numbers); 

    for(int i = 0; i < gridCols; i++)
    {
        for(int j = 0; j < gridRows; j++)
        {
            MainCard card;
            if(i == 0 && j == 0)
            {
                card = originalCard;
            }
            else
            {
                card = Instantiate(originalCard) as MainCard;
            }

            int index = j * gridCols + i;
            int id = numbers[index];
            card.ChangeSprite(id, images[id]);

            float posX = (offsetX * i) + startPos.x;
            float posY = (offsetY * j) + startPos.y;
            card.transform.position = new Vector3(posX, posY, startPos.z);
        }
    }
}

private int[] ShuffleArray(int[] numbers)
{
    int[] newArray = numbers.Clone() as int[];
    for(int i = 0; i < newArray.Length; i++)
    {
        int tmp = newArray[i];
        int r = Random.Range(i, newArray.Length);
        newArray[i] = newArray[r];
        newArray[r] = tmp;
    }
    return newArray;
}

//-------------------------------------------------------------------------------------------------------------------------------------------

private MainCard _firstRevealed;
private MainCard _secondRevealed;

private int _match = 5;
[SerializeField] private TextMesh matchLabel;

public bool canReveal
{
    get { return _secondRevealed == null; }
}

public void CardRevealed(MainCard card)
{
    if(_firstRevealed == null)
    {
        _firstRevealed = card;
    }
    else
    {
        _secondRevealed = card;
        StartCoroutine(CheckMatch());
    }
}

private IEnumerator CheckMatch()
{
    if(_firstRevealed.id == _secondRevealed.id)
    {
        _match--;
        matchLabel.text = "Pares Restantes: " + _match;
        if(_match == 1){
            matchLabel.text = "Somente " + _match + " Par Restante";
        }
        if(_match == 0){
            SceneManager.LoadScene("Sucesso");
        }
    }
    else
    {
        yield return new WaitForSeconds(0.5f);

        _firstRevealed.Unreveal();
        _secondRevealed.Unreveal();
    }

    _firstRevealed = null;
    _secondRevealed = null;

}

public void Menu()
{
    SceneManager.LoadScene("Menu");
}

public void Fases()
{
    SceneManager.LoadScene("Fases");
}

public void Sair()
{
    Application.Quit ();
}

public void Level1()
{
    SceneManager.LoadScene("Level 1");
}

public void Sucesso()
{
    SceneManager.LoadScene("Sucesso");
}

}

下面的主卡类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainCard : MonoBehaviour {

[SerializeField] private SceneController controller;
[SerializeField] private GameObject Card_Back;


public void OnMouseDown()
{
    if(Card_Back.activeSelf && controller.canReveal)
    {
        Card_Back.SetActive(false);
        controller.CardRevealed(this);
    }
}


private int _id;
public int id
{
    get { return _id; }
}

public void ChangeSprite(int id, Sprite image)
{
    _id = id;
    GetComponent<SpriteRenderer>().sprite = image; //Isso pega o Sprite Renderer e muda a propriedade do Sprite
}

public void Unreveal()
{
    Card_Back.SetActive(true);
}

}

PS:对不起我的英语

【问题讨论】:

  • 您告诉我们您想要做什么(您的项目意图),但没有告诉我们实际的问题。哪个 sn-p 代码不工作,为什么不工作,你期望什么结果,它给你什么结果,你尝试了什么?
  • 嗯,我只是想知道怎么做,我没有实际问题,一切都在那里工作,但不是用相同的卡片进行匹配(这是我的代码正在做的事情) 想搭配不同的卡,但是不知道怎么做
  • 每张卡片都是一个带有卡片脚本的预制件。当翻转两张牌时,该脚本有一个值(位,字符串,枚举......),比较每张牌上的值。如果相同,无论它们显示什么,您都会得到匹配。

标签: c# image unity3d


【解决方案1】:

您可以像这个简单的例子一样将每个图像封装在一个类的对象中:

class CardImage : MonoBehaviour
{
    public Sprite cardSprite;
    public int cardNumber;
}

然后在你的游戏逻辑中,你可以像这样检查 cardNumber 字段来比较两张牌:

if (card1.cardNumber == card2.cardNumber)
{
// Do what you have to do when two cards are equal
}

有关 OOP 和封装的更多信息,请参阅 this

【讨论】:

  • 好的,但是我的代码不是让每张卡片都有一个精灵,而是克隆第一张也是唯一一张卡片,我只需选择统一的精灵并检查精灵是否相等,所以我不t 认为我可以拥有 card1 和 card2,还有一个问题,cardNumber 会是 id 吗?顺便说一句,我在我的问题中添加了我的 MainCard 类。这是我如何将精灵统一起来的图片link
  • @Lucwar 是的,它可能是 id,你可以通过他们的 id 而不是他们的精灵来检查卡片。重要的一点是,相同的卡片必须具有相同的 id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多