Работа с дублирующимися символами - PullRequest
0 голосов
/ 03 ноября 2018

Я делаю дуэльную игру на Диком Западе, основанную на наборе мертвых. У вас есть слово, чтобы написать в определенное количество времени. Вы выиграете, если вы наберете слово вовремя, вы проиграете, если вы введете его неправильно / нажмете не ту кнопку или если время истечет.

В настоящее время у меня все работает нормально. Небольшая проблема, однако, связана с тем, как я имею дело с отображением букв, которые вы должны печатать на экране.

Каждый символ хранится в массиве, который циклично отображается и отображается на экране. Когда игрок нажимает правильную кнопку, соответствующий дисплей должен стать красным, что он делает большую часть времени. Время, когда это не так, когда есть повторяющиеся символы.

Например, если я набираю слово «дантист», когда я набираю первую букву «t», она не станет красной. Однако, когда я добираюсь до второго т и нажимаю его, оба становятся красными. Я предполагаю, что это потому, что я зацикливаюсь на каждом отображаемом символе и проверяю, нажимается ли соответствующий ввод, и потому что есть два, и я могу набрать только один символ за раз, когда один всегда ложный, который «перекрывает» тот, который является правда. Я не уверен, как реализовать решение с учетом того, как я в настоящее время работаю, поэтому любая помощь приветствуется!

Код:

    if (Duelling)
    {
        if (currentWord.Count > 0 && Input.inputString == currentWord[0].ToLower())
        {
            print(Input.inputString);
            string pressedKey = currentWord[0];
            currentWord.Remove(currentWord[0]);
        }
        else if (Input.inputString != "" && Input.inputString != currentWord[0].ToLower())
        {
            DuelLost();
        }
        if (currentWord.Count <= 0)
        {
            DuelWon();
        }

        foreach(Transform Keypad in keyDisplay.transform)
        {

            //print(Keypad.Find("KeyText").GetComponent<Text>().text);
            Keypad.Find("KeyText").GetComponent<Text>().color = currentWord.Contains(Keypad.Find("KeyText").GetComponent<Text>().text) ? Color.black : Color.red; 
        }
    }

1 Ответ

0 голосов
/ 03 ноября 2018

Я полагаю, что проблема заключается в логике обновления цвета. Contains естественно возвращает true, если ваш массив, ну, содержит текст, который вы ищете. Так как вторая буква «в» дантиста по-прежнему присутствует в массиве после ввода первой, компонент не будет менять свой цвет. При вводе второго T все экземпляры Ts удаляются из списка, и, поскольку вы все время перебираете все свои текстовые компоненты, оба они становятся красными.

Без обид, но вы идете об этом довольно ... грубо. Позвольте мне предложить более элегантный метод:

public String currentWord;

private List<Text> letterViews = new List<Text>();
private int curIndex = 0;

void Start() {
    // Populate the list of views ONCE, don't look for them every single time
    letterViews = ... // How you do this is entirely up to you
}

void Update() {
    // ...

    if (Duelling) {
        // If we've gone through the whole word, we're good
        if (curIndex >= currentWord.Length) DuelWon();

        // Now check input:
        // Note that inputString, which I've never used before, is NOT a single character, but
        // you're using only its first character; I'll do the same, as your solution seems to work.
        if (Input.inputString[0] == currentWord[currentIndex]) {
            // If the correct character was typed, make the label red and increment index
            letterViews[currentIndex].color = Color.red;
            currentIndex++;
        }
        else DuelLost();
    }
}

Полагаю, это гораздо более простое решение. DuelWon и DuelLost должны сбросить индекс до 0, очистить текст во всех letterViews и превратить их в черный цвет, возможно.

Как заполнить список представлений: вы можете сделать его общедоступным и вручную связать их вручную через инспектор (скучно), или вы можете сделать это итеративно, используя Transform.GetChild(index). Возможно, у вас достаточно текстовых представлений, чтобы вместить ваши самые длинные слова; Я рекомендую заполнить список ими всеми. Вы делаете это только один раз, при этом вы не теряете производительность и можете повторно использовать их для любых слов в своем словаре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...