/// <summary> /// Метод для удаления первой буквы в очереди из неё /// (в случае, если нужная клавиша была верно нажата) /// </summary> public void DropFirstLetterFormStream() { // Блокируем доступ другим потокам - для того, чтобы не было параллельной работы с LettersStream lock (UpdatingStateLock) { LettersStream.Dequeue(); } }
/// <summary> /// Получить символ, в данный момент находящийся в окружности выбора букв (если такого нет - '\0') /// </summary> /// <returns>Символ, находящийся в окружности выбора букв. Если такой отсутствует, возвращается символ '\0'</returns> public char GetRoundedChar() { if (LettersStream.Count == 0) { return('\0'); } Letter firstLetter = LettersStream.Peek(); int letterX = (int)firstLetter.position.X + g_fontSize / 2; // получаем координату X серединки буквы if (letterX < g_circleRectLeftUpPoint.X + g_circleDiametr && letterX > g_circleRectLeftUpPoint.X) { return(firstLetter.letter); } else { return('\0'); } }
/// <summary> /// Добавление букв в поток букв /// </summary> /// <param name="letters">Символы добавляемых букв</param> /// <param name="interval">Коэффициент, задающий межбуквенный интервал в потоке (чем он меньше, тем меньше интервал)</param> public void AddLettersToStream(char[] letters, int interval) { int circleRadius = Height / 2; int intervalVal = interval * circleRadius; // = радиус кольца на интервальный коэффициент int curLetterX = Width; foreach (var c in letters) { char letter = char.ToUpper(c); // Добавляемая буква появляется на правой границе элемента управления float xPos = curLetterX; float yPos = (circleRadius + 15) - rand.Next(circleRadius - 10); Color color = KeyboardHelper.GetKeyColorForChar(letter); // Формируем новую букву и добавляем её Letter addingLetter = new Letter(letter, new PointF(xPos, yPos), color); LettersStream.Enqueue(addingLetter); curLetterX += intervalVal; } }
/// <summary> /// Свдинуть отображаемые буквы влево /// </summary> /// <param name="pushValue">Величина сдвига (в пикселях). По умолчанию величина равна двум</param> private void PushQueueForward(int pushValue = 2) { // Если отображаемых букв нет - двигать нечего, выходим if (!LetterStreamIsEmpty) { // Обходим очередь и уменьшаем координату X каждой вершины на величину сдвига foreach (var letter in LettersStream) { letter.position.X -= pushValue; } // Если первая буква ушла за линию - она исчезает if (LettersStream.Peek().position.X <= 0) { LettersStream.Dequeue(); // Оповещаем о том, что одна буква ушла из очереди, т.к. была пропущена LetterMissedEvt?.Invoke(); } } }