Правильна ли моя логика программирования здесь? - PullRequest
0 голосов
/ 21 октября 2010
const char IsPressed = 1; // 1
const char WasHeldDown = 2; // 10
const char IsFirstPress = 4; // 100

char* keystates[256];

Class::CalculateKeyStates()
{
    for(int i = 0; i < 256; ++i)
    {
        if(this->IsDown(i))
        {
            keystates[i] |= IsPressed; // turn on
            if(keystates[i] & WasHeldDown)
            {
                //keystates[i] |= IsFirstPress;
                keystates[i] &= ~IsFirstPress; // turn off
            }
            else
            {
                keystates[i] |= WasHeldDown + IsFirstPress; // Turn on
            }
        }
        else
        {
            keystates[i] = 0; // Turn ALL off
        }
    }
}

Эта функция будет функцией-членом класса Class.Другая функция-член, IsDown, будет возвращать true, если рассматриваемый ключ не работает, и false, если нет.

Можете ли вы найти какой-либо способ дальнейшего улучшения этой функции?

Спасибо

РЕДАКТИРОВАТЬ:

Я немного подробнее расскажу о том, что и почему делается.Это модификация небольшого кода, который работает через массив keyStates (который представлял собой структуру из трех элементов bool), устанавливая для IsPressed значение false для всех ключей.затем снова установите для параметра Ispressed значение this-> IsDown, а затем в третий раз зацикливайтесь, проверяя, удерживалась ли клавиша, если она больше не нажимается при первом нажатии, установите для этого значения значение false.если он не удерживался, затем установите первое нажатие на true и также удерживайте на true, поэтому в следующий раз он будет помечен как удерживаемый.

EDIT2:

Добавлены некоторые комментарии ккод и исправил одну строку

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Лично я бы определил состояния клавиш как непересекающиеся состояния и написал бы простой конечный автомат, таким образом:

enum keystate
{
    inactive,
    firstPress,
    active
};

keystate keystates[256];

Class::CalculateKeyStates()
{
    for (int i = 0; i < 256; ++i)
    {
        keystate &k = keystates[i];

        switch (k)
        {
        inactive:
            k = (isDown(i)) ? firstPress : inactive;
            break;
        firstPress:
            k = (isDown(i)) ? active : inactive;
            break;
        active:
            k = (isDown(i)) ? active : inactive;
            break;
        }
    }
}

Это легче расширить и легче читать, если оно становится более сложным.

0 голосов
/ 21 октября 2010

Я не уверен, чего вы хотите достичь с помощью IsFirstPress, так как состояние клавиши не может запоминать все предыдущие нажатия в любом случае. Если вы хотите отметить этим битом, что вы впервые узнали, что ключ не работает, значит, ваша логика неверна в соответствующем операторе if.

keystates[i] & WasHeldDown оценивается как true, если вы уже установили бит WasHeldDown ранее для этого ключевого состояния. В этом случае вам может понадобиться удалить бит IsFirstPress, скопировав его: keystates[i] ^= IsFirstPress

0 голосов
/ 21 октября 2010

Вы всегда устанавливаете IsFirstPress, если клавиша нажата, что может быть не тем, что вы хотите.

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