예제 #1
0
    // função que atribui um elemento da tabela periódica
    // ao card selecionado
    public void AtribuiBotao(string btn)
    {
        int    indice = BD.Banco(btn, atomos);
        Atomos atm    = atomos[indice];
        QRs    qr     = new QRs(atm);

        qrs.Add(qr);

        System.Reflection.FieldInfo campo = this.GetType().GetField(btn);
        Sprite result = (Sprite)campo.GetValue(this);

        qr.Cadastrar(btn, result);

        voltar();
        tabela.transform.localPosition = new Vector2(0, 10000);
    }
예제 #2
0
    void OnMouseDown()
    {
        // pega o pai (IT*) do gameObject que foi clicado
        Transform pai = gameObject.transform.parent;

        QRs    thisQr      = null;
        string nomeproduto = null;

        // pega o nome do produto relacionado ao pai
        for (int i = 0; i < GameMannager.qrs.Count; i++)
        {
            if (pai.name.Contains(GameMannager.qrs[i].qrName))
            {
                thisQr = GameMannager.qrs[i];
                for (int j = 0; j < thisQr.atomo.Count; j++)
                {
                    nomeproduto += thisQr.atomo[j].nome;
                }
                break;
            }
        }

        // criação do card
        if (GameObject.Find("infoCard") == null)
        {
            // carrega sprite do produto cadastrado
            Sprite spriteCard = Resources.Load <Sprite>("IN" + nomeproduto);
            if (spriteCard == null)
            {
                return;
            }

            // cria e posiciona o card no centro da tela
            GameObject infoCard = new GameObject("infoCard");
            infoCard.AddComponent <SpriteRenderer>();
            infoCard.GetComponent <SpriteRenderer>().sprite = spriteCard;
            infoCard.transform.position   = new Vector3(330, 655, -1999);
            infoCard.transform.localScale = new Vector3((float)0.05, (float)0.05, (float)0.05);
            infoCard.AddComponent <BoxCollider>();

            // adiciona no card o script para fechá-lo
            infoCard.AddComponent <InfoCard>();
        }
    }
예제 #3
0
    // função repetida todo segundo, que checa se dois ou mais QRs
    // entraram em colisão para ocorrer a reação
    private void colisaoupdate()
    {
        bool existenoelementosreacao = false;
        bool podeaddlista            = false;

        // atravessa todos os QRs cadastrados
        for (int a = 0; a < qrs.Count; a++)
        {
            if (qrs[a].card == null)
            {
                continue;
            }
            // se o QR tem um átomo atrelado a ele
            else
            {
                // se o QR estiver fora de cena, remove da lista
                if (!qrs[a].card.GetComponent <SpriteRenderer>().enabled)
                {
                    elementosreacao.Remove("PL" + qrs[a].qrName);
                    continue;
                }

                // pega todos os colisores próximos ao QR de indice "a",
                // num raio definido pelo "Vector3"
                Collider[] hitColliders = Physics.OverlapBox(qrs[a].card.transform.position, new Vector3((float)90, (float)90, (float)90));

                // se o próprio QR for o único elemento da lista, remove-o
                // pare impedir uma reação desnecessária
                if (hitColliders.Length == 1)
                {
                    bool tanalista = false;
                    int  b         = 0;
                    for (; b < elementosreacao.Count; b++)
                    {
                        if (hitColliders[0].gameObject.name.Equals(elementosreacao[b]))
                        {
                            tanalista = true;
                            break;
                        }
                    }
                    if (tanalista)
                    {
                        elementosreacao.RemoveAt(b);
                    }
                }

                // atravessa o array com todos os colisores pegos
                for (int i = 0; i < hitColliders.Length; i++)
                {
                    // se o colisor pertencer a um card (PL*) dentro de cena
                    if (hitColliders[i].gameObject.name.Contains("PL") && hitColliders[i].gameObject.activeInHierarchy && qrs[a].card.activeInHierarchy)
                    {
                        // se for o primeiro elemento da lista,
                        // simplesmente adicioná-lo
                        if (elementosreacao.Count == 0)
                        {
                            elementosreacao.Add("PL" + qrs[a].qrName);
                        }
                        // se não for o único elemento, checa se esse QR
                        // já está presente na lista antes de adicioná-lo
                        else
                        {
                            for (int n = 0; n < elementosreacao.Count; n++)
                            {
                                for (int j = 0; j < hitColliders.Length; j++)
                                {
                                    if (hitColliders[j].gameObject.name.Contains(elementosreacao[n]))
                                    {
                                        podeaddlista = true;
                                        break;
                                    }
                                }
                                if (podeaddlista)
                                {
                                    break;
                                }
                            }
                            if (!podeaddlista)
                            {
                                continue;
                            }

                            podeaddlista = false;

                            for (int x = 0; x < elementosreacao.Count; x++)
                            {
                                if (hitColliders[i].gameObject.name.Contains(elementosreacao[x]))
                                {
                                    existenoelementosreacao = true;
                                    break;
                                }
                            }
                            if (existenoelementosreacao)
                            {
                                existenoelementosreacao = false;
                                continue;
                            }

                            // adiciona
                            elementosreacao.Add(hitColliders[i].gameObject.name);
                        }
                    }
                }
            }
        }

        // se não houve alteração na lista "elementosreacao",
        // ou se ela tiver apenas um elemento, retornar
        if (elementosreacao.Equals(elementosreacaoaux) || elementosreacao.Count == 1)
        {
            return;
        }
        else
        {
            // inicializa a lista dos átomos
            atomosdareacao = new List <Atomos>();

            // pega os objetos (cards) identificados pelos nomes
            // na lista "elementosreacao"
            for (int b = 0; b < elementosreacao.Count; b++)
            {
                for (int n = 0; n < qrs.Count; n++)
                {
                    if (qrs[n].card.name.Contains(elementosreacao[b]))
                    {
                        // cada átomo guardado no objeto de um QR
                        // que participa da reação é colocado em um novo objeto
                        // e salvo na lista "atomosdareacao"
                        for (int j = 0; j < qrs[n].atomo.Count; j++)
                        {
                            Atomos novoAtomo = new Atomos();
                            novoAtomo.nome                = qrs[n].atomo[j].nome;
                            novoAtomo.cor                 = qrs[n].atomo[j].cor;
                            novoAtomo.tamanho             = qrs[n].atomo[j].tamanho;
                            novoAtomo.valencia            = qrs[n].atomo[j].valencia;
                            novoAtomo.nox                 = qrs[n].atomo[j].nox;
                            novoAtomo.tipo                = qrs[n].atomo[j].tipo;
                            novoAtomo.eletroNeg           = qrs[n].atomo[j].eletroNeg;
                            novoAtomo.eletronsAtuais      = qrs[n].atomo[j].valencia;
                            novoAtomo.eletronsDisponiveis = qrs[n].atomo[j].valencia;
                            atomosdareacao.Add(novoAtomo);
                        }
                    }
                }
            }

            // se não houverem ao menos dois átomos para reagir, retornar
            if (atomosdareacao.Count <= 1)
            {
                return;
            }

            bool fazreacao = true;

            // checa se existem no máximo dois tipos
            // de atomos diferentes para a reação
            string atomo1 = "", atomo2 = "";
            for (int a = 0; a < atomosdareacao.Count; a++)
            {
                if (a == 0)
                {
                    atomo1 = atomosdareacao[0].nome;
                }
                else if (!atomosdareacao[a].nome.Equals(atomo1))
                {
                    if (atomo2.Equals(""))
                    {
                        atomo2 = atomosdareacao[a].nome;
                    }
                    else if (!atomosdareacao[a].nome.Equals(atomo2))
                    {
                        fazreacao = false;
                    }
                }
            }

            // array equivalente à lista "atomosdareacao"
            Atomos[] atomosreaction;

            // se houverem apenas dois tipos de átomo,
            // executar a reação
            if (fazreacao)
            {
                // organiza a "atomosdareacao" em ordem alfabética
                // e a converte em array
                atomosdareacao.Sort((x, y) => string.Compare(x.nome, y.nome, System.StringComparison.Ordinal));
                atomosreaction = atomosdareacao.ToArray();

                // executa a reação
                bool reagiu = ReacaoQuimica.reacao(atomosreaction, atomosdareacao.Count);

                // se a reação for bem sucedida
                if (reagiu)
                {
                    int    diferenca   = 0;
                    string eleanterior = "";
                    nomeproduto = "";

                    // guarda os membros do "atomosdareacao"
                    // na string "nomeproduto" (em ordem alfabética)
                    for (int i = 0; i < atomosdareacao.Count; i++)
                    {
                        nomeproduto = nomeproduto + atomosdareacao[i].nome;
                    }


                    QRs final = qrs.Find(x => elementosreacao[0].Contains(x.qrName));
                    novocard = elementosreacao[0];
                    elementosreacao.RemoveAt(0);

                    List <int> indexremover = new List <int>();

                    // indica quais QRs serão limpos
                    for (int a = 0; a < qrs.Count; a++)
                    {
                        for (int b = 0; b < elementosreacao.Count; b++)
                        {
                            if (qrs[a].qrName != null && elementosreacao[b].Contains(qrs[a].qrName))
                            {
                                for (int m = 0; m < qrs[a].atomo.Count; m++)
                                {
                                    qrs.Find(x => novocard.Contains(x.qrName)).atomo.Add(qrs[a].atomo[m]);
                                }
                                indexremover.Add(a);
                            }
                        }
                    }

                    // organiza os QRs a limpar
                    indexremover.Sort();

                    // limpa os QRs
                    for (int i = indexremover.Count - 1; i >= 0; i--)
                    {
                        // indica que o QR pode ser usado para uma nova reação
                        GameObject qrLivreReacao = GameObject.Find("IT" + qrs[indexremover[i]].qrName);
                        qrLivreReacao.GetComponent <DefaultTrackableEventHandler>().qrlivre = true;

                        // corrige os filhos de cada QR
                        foreach (Transform child in GameObject.Find("IT" + qrs[indexremover[i]].qrName).transform)
                        {
                            // apaga o modelo e o botão invisível
                            if (child.gameObject.name.Contains("GM") || child.gameObject.name.Equals("botao"))
                            {
                                Destroy(child.gameObject);
                            }
                            // limpa o texto e o sprite
                            else if (child.gameObject.name.Contains("PL"))
                            {
                                GameObject.Find(child.gameObject.name).GetComponent <SpriteRenderer>().sprite      = null;
                                GameObject.Find(child.gameObject.name).GetComponentInChildren <TextMeshPro>().text = "";
                            }
                        }

                        // remove da lista de QRs cadastrados
                        qrs.RemoveAt(indexremover[i]);
                    }

                    // limpa a lista e adiciona o QR do produto a ela
                    elementosreacao.Clear();
                    elementosreacao.Add(novocard);

                    nomeproduto = nomeproduto.ToUpper();

                    // carrega o modelo da molécula
                    if (produto = Resources.Load("GM" + nomeproduto) as GameObject)
                    {
                        // apaga o modelo (GM*) e o botão do card
                        foreach (Transform child in GameObject.Find("IT" + novocard.Remove(0, 2)).transform)
                        {
                            if (child.gameObject.name.Contains("GM"))
                            {
                                Destroy(child.gameObject);
                            }
                            if (child.gameObject.name.Contains("botao"))
                            {
                                Destroy(child.gameObject);
                            }
                            if (child.gameObject.name.Contains("RP"))
                            {
                                Destroy(child.gameObject);
                            }
                        }

                        // instancia o modelo da molécula como filho
                        // do QR e corrige sua posição
                        qrs.Find(x => novocard.Contains(x.qrName)).gm = produto;
                        GameObject gm = Instantiate(produto) as GameObject;
                        gm.name                    = "GM" + nomeproduto;
                        gm.transform.parent        = GameObject.Find("IT" + novocard.Remove(0, 2)).transform;
                        gm.transform.localPosition = new Vector3(0, 1, 0);
                        gm.transform.localScale    = new Vector3((float)1, (float)1, (float)1);

                        // carrega o sprite com o nome do elemento
                        // em cima do QR
                        System.Reflection.FieldInfo campo = this.GetType().GetField("PL" + nomeproduto);
                        Sprite result = (Sprite)campo.GetValue(this);
                        GameObject.Find(novocard).GetComponent <SpriteRenderer>().sprite = result;
                        GameObject.Find(novocard).transform.localScale  = new Vector3((float)0.15, (float)0.15, (float)0.15);
                        qrs.Find(x => novocard.Contains(x.qrName)).card = GameObject.Find(novocard);

                        // carrega a representação gráfica da molécula
                        // e a mostra temporáriamente
                        if (GameObject.Find("RP" + nomeproduto) == null)
                        {
                            if (representacao = Resources.Load("RP" + nomeproduto) as GameObject)
                            {
                                StartCoroutine("Wait");
                            }
                        }

                        // cria um botão invisível para registrar
                        // o clique que abre o cartão com informações
                        // da molécula
                        GameObject botao = new GameObject();
                        botao.name                    = "botao";
                        botao.transform.parent        = gm.transform.parent;
                        botao.transform.rotation      = new Quaternion(0, 0, 0, 0);
                        botao.transform.localRotation = new Quaternion(0, 0, 0, 0);
                        botao.transform.localPosition = new Vector3(0, (float)0.3, 0);
                        botao.transform.localScale    = new Vector3(1, 1, 1);
                        botao.AddComponent <InfoElemento>();

                        BoxCollider botaoCollider = botao.AddComponent <BoxCollider>();
                        botaoCollider.size = new Vector3(1, (float)0.4, 1);
                    }
                    // se não houver uma representação gráfica da molécula
                    else
                    {
                        Wait3(3);
                        string ultimo = "";

                        if (atomosdareacao[0].eletroNeg > atomosdareacao[diferenca].eletroNeg)
                        {
                            int val = atomosdareacao.Count - diferenca;
                            ultimo = atomosdareacao[diferenca].nome + val + atomosdareacao[0].nome + diferenca;
                        }
                        else if (atomosdareacao[0].eletroNeg < atomosdareacao[diferenca].eletroNeg)
                        {
                            int val = atomosdareacao.Count - diferenca;
                            ultimo = atomosdareacao[0].nome + diferenca + atomosdareacao[diferenca].nome + val;
                        }
                        else if (diferenca == 0)
                        {
                            ultimo = atomosdareacao[0].nome + atomosdareacao.Count;
                        }

                        foreach (Transform child in GameObject.Find("IT" + novocard.Remove(0, 2)).transform)
                        {
                            if (child.gameObject.name.Contains("GM"))
                            {
                                Destroy(child.gameObject);
                                break;
                            }
                        }


                        // cria card genérico
                        System.Reflection.FieldInfo camp = this.GetType().GetField("cardlaranja");
                        Sprite cardorange = (Sprite)camp.GetValue(this);
                        GameObject.Find(novocard).GetComponent <SpriteRenderer>().sprite = cardorange;
                        GameObject.Find(novocard).transform.localScale  = new Vector3((float)0.15, (float)0.15, (float)0.15);
                        qrs.Find(x => novocard.Contains(x.qrName)).card = GameObject.Find(novocard);

                        // escreve o nome da molécula acima do card criado
                        foreach (Transform child in GameObject.Find(novocard).transform)
                        {
                            if (child.gameObject.name.Contains("Text"))
                            {
                                child.gameObject.GetComponent <TextMeshPro>().text = ultimo;

                                return;
                            }
                        }
                    }
                }
                else
                {
                    // se não reagiu
                    naoReage.transform.localPosition = new Vector2(0, 0);
                }
            }
        }
    }