Member 8437747 Ответов: 3

Новичок в C++, проблемы с GetAsyncKeyState, думаю, да


Привет, ребята. С тех пор как я закончил свой курс программирования (потому что я слишком молод, чтобы учиться в университете) Я начал экспериментировать и учиться сам, C++ привлек мое внимание.

Я начал несколько месяцев назад и, как всегда, начал экспериментировать. Поэтому я попытался создать простую доску, ограниченную стенами, представленными буквой"#", и символом, представленным буквой"+".

Я начал с создания доски, двумерного массива int board[5][20] и выполнения некоторых циклов for, которые создают доску с 2, представляющими стену, 1, представляющим игрока, 0, представляющим пространство emty.

for(int i=0; i<=4; i++)
{
        for(int x=0; x<=19; x++)
        {
                if(i == 0 || i == 4)
                {
                     board[i][x] = 2;
                }
                else
                {
                    if(x == 0 || x == 19)
                    {
                         board[i][x] = 2;
                    }
                    else
                    {
                        board[i][x] = 0;
                    }
                }
        }
}


Сейчас это основной цикл с цикл игры, обмен мгновенными сообщениями с помощью Windows.ч - GetAsyncKeyState
вот так, теперь, когда у меня нет никакого наставника или профессора, чтобы проинструктировать меня, я не знаю, как распределить эту функцию, и, возможно, я использую ее непропорционально.

int main()
{
    Board table(3,10);
    showGame(table);
    while(!GetAsyncKeyState(VK_ESCAPE))
    {
         showGame(table);
         if(GetAsyncKeyState(VK_UP))
         {
             table.moveUp();
         }
         if(GetAsyncKeyState(VK_DOWN))
         {
             table.moveDown();
         }
         if(GetAsyncKeyState(VK_RIGHT))
         {
             table.moveRight();
         }
         if(GetAsyncKeyState(VK_LEFT))
         {
             table.moveLeft();
         }
    }
    return 0;
}


Вот функции, которые перемещают игрока:

void Board::moveDown()
{
     int p1 = Y + 1;
     int move = board[Y][X] + board[p1][X];
     if(move == 1)
     {
             board[p1][X] = player;
             board[Y][X] = empty;
     }
}

void Board::moveUp()
{
     int p2 = Y - 1;
     int move = board[Y][X] + board[p2][X];
     if(move == 1)
     {
             board[p2][X] = player;
             board[Y][X] = empty;
     }
}

void Board::moveRight()
{
     int p3 = X + 1;
     int move = board[Y][X] + board[Y][p3];
     if(move == 1)
     {
             board[Y][p3] = player;
             board[Y][X] = empty;
     }
}

void Board::moveLeft()
{
     int p4 = X - 1;
     int move = board[Y][X] + board[Y][p4];
     if(move == 1)
     {
             board[Y][p4] = player;
             board[Y][X] = empty;
     }
}


Он создает доску, отображает ее вместе с игроком. Проблема в том, что он позволяет мне сделать только 1 ход, а затем либо не отображает изменение, либо не делает этого.

И это код, который читает доска:

system("CLS");
for(int i=0;i<=4; i++)
{
     for(int x=0;x<=19; x++)
     {
                  if(cb.board[i][x] == cb.valueWall())
                  {
                       cout << "#";
                  }
                  if(cb.board[i][x] == cb.valueEmpty())
                  {
                      cout << " ";
                  }
                  if(cb.board[i][x] == cb.valuePlayer())
                  {
                      cout << "+";
                  }
      }
      cout << "\n";
}

Wes Aday

Моя вина. Его похоронили. Возможно, вы захотите подробнее рассказать о том, в чем на самом деле заключается ваша проблема.

Wes Aday

Что именно происходит, когда вы запускаете его через отладчик? Выходит ли он из главного? Читает ли он клавиатуру?

3 Ответов

Рейтинг:
26

Argonia

Попробуйте установить Sleep () в цикле while. Лучше установить время (1)и случай разрыва внутри, когда GetAsyncKeyState(VK_ESCAPE) возвращает, что Esc был нажат . Я не очень хорошо умею объяснять, но проблема в том, что человеку нужно время, чтобы нажать на кнопку . Процессору требуется гораздо меньше времени для цикла хотя цикл while

Пожалуйста, смотрите эту ссылку
Вопрос о " GetAsyncKeyState"


Member 8437747

Спасибо за помощь, хотя использование сна не было проблемой (это был способ изменить переменную Y), это была полезная помощь, минимизировав скорость объекта

Рейтинг:
2

EZCodeProject

Все, что вам нужно сделать, это добавить [

& 0x8000
после каждого вызова GetAsyncKeyState.


Dave Kreskowiak

Ты ведь знаешь, что ответ на этот вопрос был дан пять лет назад, верно?

EZCodeProject

Откуда ты это знаешь? И если то, что вы говорите, действительно правда, то почему тогда Code Project позволяет посетителям / гостям и зарегистрированным пользователям отвечать на очень старые и древние вопросы? Следует сказать, что этот вопрос очень старый и древний, и запретить всем отвечать и оставлять комментарии. Вы так не думаете? Несмотря на то, что этому вопросу пять лет, кто-то его посещал :) Хотя OP больше не видит эту страницу, любой, у кого есть проблема с GetAsyncKeyState, потому что они не написали & 0x8000 после вызова, могут увидеть эту страницу и посмотрите мое решение. Два других решения не говорят, что это то, что программист должен делать при использовании GetAsyncKeyState, поэтому не имеет значения, сколько лет этому вопросу. Даже если ей будет 100 лет, кто-то (из следующего поколения) получит пользу от моего ответа, если эта страница тогда будет существовать.

Dave Kreskowiak

Я не писал этот сайт, поэтому не могу комментировать, как он должен работать.

Посмотрите на даты на столбах. Что вы добавили к обсуждению выше того, что уже было сказано? Ничего.

EZCodeProject

Если кто-то новичок в GetAsyncKeyState, который не знает, что он/она наберет & 0x8000, не зайдет на эту страницу и не увидит мое решение? Если да, то почему же тогда эта страница существует? Вы можете сказать администратору, чтобы он удалил эту страницу прямо сейчас и освободил больше памяти. :Д

Рейтинг:
1

Member 8437747

Мне пришлось добавить команду, которая изменяет начальные переменные XY, чтобы они не были одинаковыми каждый раз, когда я двигался


Sergey Alexandrovich Kryukov

Ответа не последовало. Пожалуйста, прекрати.
—СА