Как сделать нажатие клавиши в паскале

Обновлено: 07.07.2024

не подскажете, как при помощи команды ReadKey сделать управление объектом с клавиатуры?

Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681

Перемещение стрелками круга.

then . что?
как компьтеру объяснить движение влево?
через move?
но там вроде отдельно х и у прописывать надо, а мне это никчему.
что-то типа move left?
ругается на неопознанную переменную.
кстати, спасибо за подсказку.)

но там вроде отдельно х и у прописывать надо, а мне это никчему.

нет, я не хотел тебя обидеть, просто в твоем коде паскаль ругается на Clear.
типа, неопознанная переменная.
и когда я пишу move (x, y); ему не нравится выражение в скобках.
не пойми меня неправильно)

и когда я пишу move (x, y); ему не нравится выражение в скобках.

Так ты для начала ничего в моем коде не меняй, а просто скопируй и запусти в турбо Паскале или во Free Pascal. Я же не просто так код скинул, а предварительно проверенный.

твой код он кушает, а вот когда я пытаюсь добавить его в свой, он сильно ругается.
либо компилится, но объект никуда не двигается.
либо вылетает при нажатии стрелки. пробовал и procedure, и case of end.
вот мой исходный код объекта:


Во-первых, это бред, потому что chr(ord(key))=key, т.к. ord возвращает код символа, а chr возвращает символ по коду.
Во-вторых, ты в этом коде предлагаешь обработку уже имеющегося значения переменной key, но WhoAmI не знает, как его получить можно.


Ага, теперь понятно. Ты его вписал в обработчик события OnKeyPress формы, вот он и заработал. В PascalABC формы есть, но работа с ними другая.


Эй, эй, чтобы определять, что что-то лучше чего-то, нужно определиться, по какому критерию мы их сравниваем. Критериев огромная куча, и сравнивать сразу по всем бессмысленно и бесполезно. Поэтому как Delphi, так и какой-либо диалект Паскаля может быть самым лучшим выбором для написания игр с какой-то определённой точки зрения. А если смотреть совсем со стороны и в общем смысле - то самого лучшего инструмента для разработки игр нет и никогда не будет.


Паскаль - это либо изначальный язык Pascal, либо обобщённое название всех диалектов. Object Pascal - вполне конкретный диалект Паскаля. Delphi - вообще отдельный язык программирования. Так что никакие это не одинаковые языки, хотя похожие места в них безусловно есть.

Всё зависит от того, как ты делаешь игру. Есть несколько способов, например, через готовые классы окон. Сейчас установлю себе PascalABC, гляну и напишу здесь.

А вообще, посмотри проекты из папки "C:\PABCWork.NET\Samples\Games", если устанавливал PascalABC вместе с примерами. Там несколько игр, посмотришь, как они устроены, некоторые алгоритмы интересные есть.


Ага, вот, нашёл. Посмотри исходник KillThem.pas (если у тебя нет его - вот он), там как раз кнопочное управление устроено. Если в двух словах, то создаётся окно, событиям окна присваиваются пользовательские процедуры-обработчики (OnKeyDown := KeyDown; OnKeyPress := KeyPress; OnKeyUp := KeyUp; в основном коде программы), в самом конце запускается таймер для анимации. Например, вот обработчики событий клавиш из этого исходника:

/// Обработчик нажатия клавиши
procedure KeyDown(Key: integer);
begin
case Key of
vk_Left: kLeftKey := True;
vk_Right: kRightKey := True;
vk_Space: if kSpaceKey=2 then kSpaceKey := 1;
end;
end;

/// Обработчик отжатия клавиши
procedure KeyUp(Key: integer);
begin
case Key of
vk_Left: kLeftKey := False;
vk_Right: kRightKey := False;
vk_Space: kSpaceKey := 2;
end;
end;

/// Обработчик нажатия символьной клавиши
procedure KeyPress(Key: char);
begin
if (Key in ['G','П','g','п']) and EndOfGame then
begin
NewGame.Visible := False;
EndOfGame := False;
t.Start;
CreateObjects;
kSpaceKey := 2;
kLeftKey := False;
kRightKey := False;
end;
end;

В первых двух процедурах аргумент Key - это число, соответствующее виртуальному коду клавиши (константа vk_key, где vk - virtual key, а key - собственно название клавиши), в третьем Key - символ. Ну и обрабатываются они кейсами и ифами, тут всё просто.

Если быть более точным, то обработчики нажатий/отжатий клавиш в играх обычно не напрямую обрабатывают их, а лишь устанавливают/сбрасывают соответствующие клавишам флаги (булевы переменные) или устанавливают число в переменной-переключателе (или счётчике). А вот эффект от этих действий проявляется в обработчике события таймера, чтобы синхронизировать все действия со временем. Т.е., например, флаг kLeftKey устанавливается сразу после нажатия клавиши "курсор влево", затем его проверяет специальная конструкция в процедуре таймера (здесь - TimerProc), потом пользователь отпускает эту кнопку и соответствующая процедура сбрасывает флаг kLeftKey, из-за чего производимые действия в процедуре таймера меняются должным образом. Точно так же - для каждой другой кнопки.

Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском . и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор. Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса). [!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя

Подскажите, как можно реализовать ввод символов с клавиатуры в графическом режиме (graph), по аналогии как это осуществляется в текстовом при помощи функции Read? Или нужно будет создать собственную процедуру с использованием readkey и функций обработки строковых переменных?



Я не претендую на абсолютную правильность (смотря что вы вводите), но по-моему, так и можно
После инициализации Графа можете запросить чего-тнибудь ввести и точно так же прочитать.

По-моему, стандартные процедуры Read/Readln не являются только процедурами CRT.

При использовании Read в текстовом режиме выполнение программы приостанавливается и происходит обращение к клавиатуре, после чего пользователь может вводить символы до тех пор пока не нажмёт энтер. В графическом этого не происходит. Read здесь работает для чтения файлов, к примеру.
Хотелось бы узнать способ реализации той же механики в графическом режиме.
CRT подключён, но дело видимо в специфики графического режима.



Или нужно будет создать собственную процедуру с использованием readkey и функций обработки строковых переменных?

Это более правильный метод. По крайней мере можно точно задать позицию, в которой будет производиться ввод данных (в случае с Read/ReadLn с этим сложнее). Поиск по разделу поможет тебе найти функцию ввода строки в граф. режиме, по-моему, ее здесь выкладывали.

Читайте также: