Q:

Помощь в изучении кода C#

Изучаю процесс создания игры Flappy Bird в Visual Studio 2013 (XNA).
Процесс создания доступен на YouTube.
Конкретно, я не совсем точно понимаю, что автор описывает в InputManagers.cs
Привожу пример кода:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Input;

namespace FlappyBird.Managers
{
    public class InputManager
    {

        private KeyboardState _oldKS;
        private KeyboardState _KS;

        public InputManager()
        {
            Statics.INPUT = this;
        }

        public void Update()
        {
            if (_KS != null)
                _oldKS = _KS;
            _KS = Keyboard.GetState();
        }

        public bool isKeyPressed(Keys k)
        {
            return (_oldKS.IsKeyUp(k) && _KS.IsKeyDown(k));
        }

        public bool isKeyRelease(Keys k)
        {
            return (_oldKS.IsKeyUp(k) && _KS.IsKeyDown(k));
        }

        public KeyboardState currentState()
        {
            return this._KS;
        }
    }
}

Я понимаю, что этот код имеет к какое то отношение к клавиатуре. Но что именно он делает, я не могу понять.

A:

Ну, ничего сложного нет.
Центр класса — функция Update, в которой класс сохраняет текущее и предыдущее состояния клавиатуры (предыдущее = состояние при предыдущем вызове функции Update).
На этом основываются функции isKeyPressed и isKeyRelease (должно быть, понятно, Released), которые сравнивают нажатые клавиши в предыдущем и текущем состоянии, и возвращают флаг, если было изменение. Они крешатся, если до их вызова не был вызван Update как минимум дважды.
Класс написан не очень хорошо ещё и по другой причине. Он несамостоятелен, так как требует своевременного вызова функции Update внешним кодом для своей нормальной работы. Правильнее было бы самому взять на себя ответственность, и не зависеть от внешних факторов.
Ну и имплементация синглтона оставляет желать лучшего. Правильно делать синглтон так, как описано здесь.

