Управление клавиатурой в Паскале

Я новичок в Pascal и работаю над небольшой игрой для WIngraph. В какой-то момент игры персонаж (который является блоком) должен лечь (блок получает половину своей первоначальной высоты). Я хочу, чтобы это произошло, удерживая клавишу со стрелкой вниз, но способ, которым я это реализовал, на самом деле не работает. Еще одна проблема, с которой я столкнулся, заключается в том, что я не знаю, как читать ключи одновременно (это может понадобиться, например, при беге вправо и прыжках).

Вот как я это пытался написать:

procedure joystick;
begin
  key:=readkey;
  case key of 
  #0:begin  
  key:=readkey;  
    case key of  
    #80:with block do  
       begin  
        y1:=y2-100; //make it get half of its height  
        repeat  
         moveblock; //these are the drawing routines.   
         moveball;  //they are in another procedure, which is the 'main loop'   
         collisioncheck;  
         draw;      //i expected the code to run inside here with the block's  
         alternateball; //height changed, and as soon as the arrow key gets released  
         updateGraph(updateNow);  //it should go back to the 'main loop'  
         killball;  
         delay(10);  
        until keypressed = false; //<--thats what i think is not working  
        y1:=y2-200; //this would make the block get normal again  
       end;  
     end;  
   end;      
 end;  

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

Все работает, кроме ключа с зажатой клавишей.


person Thiago    schedule 01.06.2012    source источник
comment
Опубликуйте свой актуальный код. Без него мы не сможем понять, что вы делаете не так. (Подумайте об этом так - скажите своему автомеханику: «Моя машина издает забавный звук. Это красная машина, и она похожа на ту, что припаркована там. Что не так с моей машиной?» Вы ожидаете ответа? Надеюсь, что нет .) Отсюда мы не можем прочитать ваш код (или ваши мысли); у нас есть только то, что вы нам предоставляете для работы. Пожалуйста, отредактируйте свой вопрос и опубликуйте свой фактический код; отформатируйте его при публикации, сделав отступ в каждой строке на четыре (или более) пробела по мере необходимости, чтобы она была удобочитаемой, и просмотрите ниже, где вы ее печатаете. Спасибо.   -  person Ken White    schedule 01.06.2012
comment
вот код: pastebin.com/AqkD90kL   -  person Thiago    schedule 01.06.2012
comment
Почти готово. :-) Во-первых, ваш код должен находиться здесь, а не в pastebin. Если по какой-то причине pastebin не работает или ссылка исчезает, ваш вопрос теряет смысл. Во-вторых, вы разместили способ слишком большого количества кода; вам нужно разместить здесь только часть, касающуюся работы с ключами. StackOverflow не собирается читать все это - сократите его до той части, которая вызывает у вас проблемы, и разместите здесь с ваш вопрос. Мы хотели бы помочь вам, но здесь много вопросов, и вы должны помочь нам, задав хорошие вопросы. Спасибо. :-)   -  person Ken White    schedule 01.06.2012
comment
Я снова его поменял. Приносим извинения за неудобства, сообщите мне, если я снова сделал что-то не так. ;)   -  person Thiago    schedule 01.06.2012
comment
Вам понадобится более полный контроль над клавиатурой, чем то, что позволяет вам KeyPressed и ReadKey для достижения желаемого. Это руководство (документ Word) о том, как создать обработчик клавиатуры в Паскале, может быть хорошая отправная точка. Подозреваю, что вокруг должно быть много готовых модулей с исходным кодом, но мне удалось наткнуться только на этот сайт на русском языке (с некоторыми частями на английском), где вы можете скачать рабочие примеры с исходниками (не все они то, что вам нужно!).   -  person Andriy M    schedule 01.06.2012
comment
Попробуйте "turbo pascal" keyboard handler в своей любимой поисковой системе и посмотрите, удастся ли вам найти то, что вам подходит.   -  person Andriy M    schedule 01.06.2012
comment
Спасибо вам, ребята. Я пробовал этот документ с обработчиком клавиатуры, но даже прямая копия этого кода не компилировалась. (Пользуюсь последней версией FPC). Я постараюсь найти другие примеры Keyboard Handler и эту «клавиатуру».   -  person Thiago    schedule 02.06.2012
comment
Тогда вы должны были добавить тег freepascal. Я добавил это сейчас.   -  person Andriy M    schedule 02.06.2012


Ответы (2)


Это не работает, потому что после каждого keypressed() у вас должен быть readkey(). Функция keypressed() возвращает истину, пока вы снова не вызовете readkey().

Демо:

uses crt;
var c:char;
    i:longint;
begin
while c<>#27 do
  begin
  while not keypressed() do
    begin
    clrscr;
    writeln('not pressing anything');
    delay(500);
    end;
  i:=0;
  while keypressed() do
    begin
    clrscr;
    c:=readkey();
    if(c=#0) then
      c:=readkey();
    inc(i);
    writeln(c,' ',i);
    delay(300);
    end;
  end
end.
person mimarcel    schedule 01.06.2012

Если вы используете freepascal / Lazarus:

  • не используйте модуль crt вместе с wingraph, а используйте wincrt. Wingraph подключается к событиям графического интерфейса Win32, а (win32) crt подключается к работе через вызовы консольного API. Wincrt подключается к событиям GUI (перекачивание сообщений).
  • желательно вообще не использовать * crt, но лучше использовать единичную клавиатуру
  • Взгляните на примеры Free Pascal, они содержат несколько небольших игр (тетрис и реализация samegame), которые также могут работать с wingraph и юнит-клавиатурой. Есть даже какое-то устройство для рекордов и простая процедура редактирования строк поверх клавиатуры и крылышка.

В следующий раз предоставьте более точные сведения о платформе (и версии) разработки, которую вы используете.

person Marco van de Voort    schedule 02.06.2012