Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 3

Обработка одновременного нажатия двух клавиш

13.03.2016, 22:45. Показов 5016. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Я пишу маленькую игру на PascalABC.Net. Мне нужно обрабатывать нажатие двух клавиш одновременно (Например, вверх+вправо). Как это реализовать? Не предлагать переходить на Pascal или Delphi (на этих двух такое делать могу). Меня интересует сам процесс на PascalABC.Net.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.03.2016, 22:45
Ответы с готовыми решениями:

Обработка нажатия клавиш
Программа ниже по задумке после нажатия одной из клавиш совершать следующие действия: если при нажатая клавиша даёт символ А, Б, В или Г,...

Обработка нажатия клавиш
Доброго кодинга, форумчане. Требуется процедурка, реагирующая только на удержание клавиши. Задача в целом проста: надо чтоб круг на экране...

Обработка нажатия клавиш
Ситуация такая: сломалась клавиатура(при нажатии пробела нажимается "\ " или " ", и некоторые другие клавиши) Хочу написать...

8
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
14.03.2016, 12:03
Например так.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
uses graphabc;
var x,y:integer;
    f:boolean;
procedure KeyPress(ch:char);
begin
case ch of
'в','В','D','d':x:=x+5;
#27:f:=false;
end;
end;
procedure KeyDown(key:integer);
begin
if key=VK_Up then y:=y-5;
end;
begin
x:=200;
y:=150;
f:=true;
onkeypress:=KeyPress;
onkeydown:=KeyDown;
lockdrawing;
repeat
Window.Clear;
rectangle(x-50,y-50,x+50,y+50);
sleep(20);
redraw;
until not f;
end.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
14.03.2016, 12:59
Лучший ответ Сообщение было отмечено _Jaguar_ как решение

Решение

Или вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
uses
  graphabc;
 
var
  x, y: integer;
  f: boolean;
  
  isUp := false;
  isRight := false;
 
procedure KeyPress(ch: char);
begin
  if ch = #27 then f := false;
end;
 
procedure KeyDown(key: integer);
begin
  case key of
    VK_Up: isUp := true;
    VK_Right: isRight := true;
  end;
end;
 
procedure KeyUp(key: integer);
begin
  case key of
    VK_Up: isUp := false;
    VK_Right: isRight := false;
  end;
end;
 
begin
  x := 200;
  y := 150;
  f := true;
  onkeypress := KeyPress;
  onkeydown := KeyDown;
  OnKeyUp := KeyUp;
  lockdrawing;
  repeat
    Window.Clear;
    rectangle(x - 50, y - 50, x + 50, y + 50);
    sleep(75);
    
    if isUp then y := y - 5;
    if isRight then x := x + 5;
    
    redraw;
  until not f;
end.
4
56 / 56 / 26
Регистрация: 13.11.2013
Сообщений: 234
Записей в блоге: 1
14.03.2016, 14:29
Вы нуждаетесь в DirectInput для .net существует обёртка SlimDX вот пример
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{$apptype windows}
{$platformtarget x86}
{$reference System.Drawing.dll}
{$reference System.Windows.Forms.dll}
{$reference SlimDX.dll}
uses system,System.Collections.Generic,system.drawing,system.Windows.forms,slimdx,slimdx.directinput,GraphABC;
type
  KeysDownHand = procedure(sender: object; e: IList<SlimDX.DirectInput.Key>);
  KeyBoardKeys = class
    public event KeysDown: KeysDownHand;
  protected 
    _KeyBord: KeyBoard;
    _Tim: System.Windows.Forms.Timer;
    _Keys: IList<SlimDX.DirectInput.Key>;
    procedure TimProc(sender: object; e: EventArgs);
    begin
      _keys := (_keybord.GetCurrentState().PressedKeys);
      if (KeysDown<>nil) and (_keys.Count > 0) then KeysDown(self, _keys);
    end;
  
  public 
    
    constructor create(control_: control);
    begin
      var directI := new DirectInput.DirectInput;;
      _keybord := new keyboard(directi);
      
      _keybord.SetCooperativeLevel(control_, CooperativeLevel.Nonexclusive or CooperativeLevel.Background);
      _keybord.Acquire;
      
      _Tim := new Timer;
      _Tim.Interval := 50;
      _Tim.Tick += TimProc;
      _tim.Start();
      
    end;
    
    property KeyGetterTimer: Timer read _Tim;
    property KeyBordGet: keyBoard read _keybord;
    function GetPressedKeys: IList<SlimDX.DirectInput.Key> := _keys;
  end;
 
const
  Step = 4;
  r = 20;
 
var
  kb: KeyBoardKeys;
  pos: point;
 
procedure DrawCircle();
begin
  clearWindow;
  circle(pos.X, pos.Y, r);
  redraw();
end;
 
procedure kd(sender: object; E: IList<SlimDX.DirectInput.Key> );
begin
  for var i := 0 to e.Count - 1 do
  begin
    if (e[i] = key.LeftArrow) or (e[i] = key.A)  then pos.X -= step;
    if (e[i] = key.RightArrow) or (e[i] = key.D)  then pos.X += step;
    if (e[i] = key.UpArrow) or (e[i] = key.W)   then pos.Y -= step;
    if (e[i] = key.DownArrow) or (e[i] = key.S) then pos.Y += step;
  end;
  DrawCircle;
end;
 
procedure crAll();
begin
  kb := new KeyBoardKeys(GraphABc.MainForm);
  kb.KeysDown += kd;
end;
 
begin
  lockDrawing;
  
  pos := new Point((WindowWidth - r) div 2, (WindowHeight - r) div 2);
  SetBrushColor(clOrange);
  DrawCircle();
  
  GraphABC.MainForm.Invoke(crALl);
end.
И архив с библиотекой
Вложения
Тип файла: zip Project1.zip (4.84 Мб, 10 просмотров)
2
1 / 1 / 0
Регистрация: 03.01.2020
Сообщений: 84
20.01.2020, 16:28
Цитата Сообщение от volvo Посмотреть сообщение
#27
что это за символ/команда?
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
20.01.2020, 16:32
Pascal
1
2
3
begin
  Writeln(#27);
end.
Попробуйте следующим образом определить символ.
0
1 / 1 / 0
Регистрация: 03.01.2020
Сообщений: 84
20.01.2020, 16:36
спс, значит это все таки символ
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
20.01.2020, 16:45
#27 это код клавиши Escape, а то что выводит какой-то символ, Вам это не поможет ибо на клавиатуре его нет.
2
1 / 1 / 0
Регистрация: 03.01.2020
Сообщений: 84
20.01.2020, 16:55
огоромное спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2020, 16:55
Помогаю со студенческими работами здесь

Корректная обработка нажатия клавиш
Программа в цикле считывает символ с помощью ReadKey(); Если зажать символ будет много строк. Если ставить, паузу символы будут...

Обработка одновременного нажатия клавиш клавиатуры
Мне необходимо написать примитивный &quot;теннис&quot; для двух игроков. Для начала я отрисовал две платформы и организовал из передвижение по...

Перехват одновременного нажатия двух клавиш мыши (левая и правая)
Доброго времени суток! Я реализую игру &quot;сапёр&quot; и во время её создания у меня возникла проблема: не могу перехватить клик двумя кнопками...

Оброботка одновременного нажатия 2-х клавиш
Здравствуйте. Столкнулся с проблемой обработки нажатия 2-х клавиш . Если по 1-ой, то проблем конечно нет , а вот с 2-мя уже похуже обстоят...

Обработка нажатия двух клавиш одновременно
нажатие одной какой то клавиши реализовал так bool MainWindow::event(QEvent *event){ if (event-&gt;type() == QEvent::KeyPress ) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru