Terve!
En oikein tiedä (jälleen kerran) osaanko selittää ongelmaa ihan oikein, mutta yritetään. Tarkotuksena olisi siis tehdä nopeusreaktiopeli (neljä valoa, jotka syttyy randomilla, sammuta valo painamalla sitä).
Olen nyt tässä kolme päivää kamppaillut sen ongelman kanssa, että miten voisin "pitää kirjaa" siitä mikä valo on syttynyt viimeisimpänä? Eli kun valoja pitäisi painaa siinä järjestyksessä kun ne on syttynyt, muuten tulee game over.
Miten siis saan pidettyä kirjaa siitä missä järjestyksessä valot on syttynyt ja verrattua sitä niin, että Input-tieto menee yks yhteen valojen syttymysjärjestyksen kanssa?
En millään keksi mihin tietoa laitan ja mihin vertaan sitä.
Tossa on vähän tota koodia.
List<int> buttonOrder; public GameObject[] buttonObjects; //tähän pitäisi lisätä tarkistus siitä että valojen "sammuttamisjärjestys" on oikea if (hit.collider.gameObject.GetComponentInChildren<Light>().enabled == true) { scoreManager.AddScore(1); hit.collider.gameObject.GetComponentInChildren<Light>().enabled = false; buttonOrder.RemoveAt(buttonOrder.Count - 1); }
void TurnLightsOnOrOff() { randomLight = Random.Range(0, buttonObjects.Length); if (buttonObjects[randomLight].GetComponentInChildren<Light>().enabled == false) { buttonObjects[randomLight].GetComponentInChildren<Light>().enabled = true; buttonOrder.Add(buttonOrder.Count); } else { return; } }
Käytät ilmeisesti(?) Unityä. Yksi ratkaisu on, että laitat jokaisen valonapin Tagiksi valon numeron (1-4) ja sitten laitat sen sinne listaan. Eli
buttonOrder.Add(buttonOrder.Count);
tilalle
buttonOrder.Add(buttonObjects[randomLight].Tag);
Tarkistaessa testaat oliko klikattu nappi ensimmäisenä listassa.
// oletan että hit.collider on klikattu nappi if (hit.collider.gameObject.Tag == buttonOrder[0]) { // oikea nappi // otetaan klikattu nappi pois listasta buttonOrder.RemoveAt(0); // tänne kaikki pisteytykset tms. } else { // väärä nappi }
En ole testannut, mutta toivottavasti toimii.
Edit:
Grezin toteutus on lyhyempi eikä siinä tarvita turhia tageja.
Sullahan nähdäkseni on jo tuo List<int> buttonOrder. Tuossa buttonOrder.Add:issa vaan varmaankin pitäisi olal randomLight tuon buttonOrder.Count asemesta.
Ja sitten tarkistus menisi tyyliin
if (buttonOrder.Count > 0 && buttonObjects[buttonOrder[0]] == hit.collider.gameObject) { //Oikea valinta. Poistetaan listalta buttonOrder.RemoveAt(0); } else { //Väärä valinta }
Kiitoksia Grez ja kiitoksia ErroR++! Kerkesin jo testaamaan tuon Errorin ehdotuksen ja sillä lähti toimimaan! Tuo Grezin ehdotus oli lähempänä semmosta ku ite yritin hakea, testaanpas nyt sekin vielä! Tai siis kyllähän se toimii ku Grez on nii hyvä kuiteski ;)
Mutta joo, kiitoksia molemmille! :)
Jono soveltuisi tähän aika näppärästi.
Queue<int> buttons; // Lisätään nappula. buttons.Enqueue(randomLight); // Painoiko käyttäjä oikeaa? if (buttons.Count > 0 && buttons.Peek() == hit.collider.gameObject) { // Joo, poistetaan jonosta. buttons.Dequeue(); } else { // Ei. }
Säieturvallinen vaihtoehto (.NET 4+).
ConcurrentQueue<int> buttons; // Lisätään nappula. buttons.Enqueue(randomLight); // Painoiko käyttäjä oikeaa? int nextButton; if (buttons.TryDequeue(out nextButton) && nextButton == hit.collider.gameObject) { // Joo, ja se poistettiin jo jonosta. } else { // Ei. }
Aihe on jo aika vanha, joten et voi enää vastata siihen.