Форум программистов, компьютерный форум CyberForum.ru

Перехват клавиш,"case"? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
bol2909
 Аватар для bol2909
2 / 2 / 1
Регистрация: 29.08.2010
Сообщений: 51
20.05.2011, 16:27     Перехват клавиш,"case"? #1
На днях столкнулся с такой проблемой.Хотел сделать что-то типо мини-игры в консоли и не знаю как сделать перехват клавиш.Например: если нажата стрелка вправо передвинуть человечка вправо.Ну вот примерно.Делаю консольное приложение,поэтому WinApi функции не подходят.Какую функцию использовать и желательно сразу пример какие библиотеки подключить для нее и синтаксис.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
20.05.2011, 16:32     Перехват клавиш,"case"? #2
Цитата Сообщение от bol2909 Посмотреть сообщение
Делаю консольное приложение
хотелось-бы взглянуть как вы человечка в консоли рисовать будете.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.05.2011, 16:36     Перехват клавиш,"case"? #3
Цитата Сообщение от bol2909 Посмотреть сообщение
Делаю консольное приложение,поэтому WinApi функции не подходят
Как раз API и подходят) ReadConsoleInput() в помощь.

Добавлено через 3 минуты
Цитата Сообщение от jonson Посмотреть сообщение
хотелось-бы взглянуть как вы человечка в консоли рисовать будете.
Графика а-ля Dendy) Писал когда-то консольную игру на ассемблере)
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
20.05.2011, 16:52     Перехват клавиш,"case"? #4
Цитата Сообщение от Kastaneda Посмотреть сообщение
Графика а-ля Dendy) Писал когда-то консольную игру на ассемблере)
интересно посмотреть, если осталась может скинете мне sasha_t@email.ua
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
20.05.2011, 16:59     Перехват клавиш,"case"? #5
Если работаешь в студии создай обычное win32 приложение и посмотри,а то лень писать. Там все это есть

Добавлено через 3 минуты
Если работаешь в студии создай обычное win32 приложение и посмотри,а то лень писать. Там есть обработка сообщений
bol2909
 Аватар для bol2909
2 / 2 / 1
Регистрация: 29.08.2010
Сообщений: 51
20.05.2011, 18:55  [ТС]     Перехват клавиш,"case"? #6
Спасибо всем,но хочу разобраться именно с консольными человечек рисуется символами.Если осилю это пойду дальше,дак кто-нибудь знает по поводу проблемы?
Может case и код клавиши токо я синтаксиса не помню
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
20.05.2011, 19:28     Перехват клавиш,"case"? #7
C++
1
2
3
4
while (1) {
int i=getch();
std::cout << i << '\n';
}
вот, на здоровье смотрите любые коды, которые вам интересны.

ПС: коды клавиш расширенные поэтому состоят из 2-х цифр, после перехвата клавиши (case) нужно будет сделать еще 1 getch() дабы в буфере не оставалась повисшей 2ой цифры
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2011, 12:15     Перехват клавиш,"case"?
Еще ссылки по теме:

C++ Определить, сколько в строке символов "*", ":", ";"
C++ Переменные "емкость", "Галлон", "Бензин"
C++ Ошибка: "jump to case label crosses initialization of"

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

Или воспользуйтесь поиском по форуму:
bol2909
 Аватар для bol2909
2 / 2 / 1
Регистрация: 29.08.2010
Сообщений: 51
21.05.2011, 12:15  [ТС]     Перехват клавиш,"case"? #8
Cпасибо,еще 1 вопрос клавишу надо удерживать все время что ли?Или я 1 раз нажму она покажет на 1 сек. и пойдет следующее действие?

Добавлено через 4 минуты
Извините тупанул сам же написал что передвинуть

Добавлено через 5 минут
Кто еще будет смотреть тему нашел вот такое меню как в DOS:
C++
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
85
86
87
88
89
90
91
92
93
94
#include <conio.h>
#include <stdio.h>
#include <windows.h>
 
#define MaxNo_Menu 5
 
#define KEY_ENTER 13
#define KEY_UP    72
#define KEY_RIGHT 75
#define KEY_LEFT  77
#define KEY_DOWN  80
 
#define FOREGROUND_WHITE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
#define BACKGROUND_WHITE BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE
 
 
HANDLE hOut;
 
void gotoxy( int col, int row ) {
   
   COORD pos;
   pos.X = col; pos.Y = row;
   SetConsoleCursorPosition( hOut, pos );
 
}
 
 
int main() {
  
   bool  isExit = false;
   char* menu_list[MaxNo_Menu] = { "ADD", "EDIT", "DELETE", "SAVE", "EXIT" };
   int   i,
         xpos = 10,
         ypos[MaxNo_Menu] = { 3, 5, 7, 9, 11 };
   CONSOLE_CURSOR_INFO conCurInf;
   
   hOut = GetStdHandle( STD_OUTPUT_HANDLE );   
   GetConsoleCursorInfo( hOut, &conCurInf );
 
   // Hide the cursor
   conCurInf.bVisible = false;
   SetConsoleCursorInfo( hOut, &conCurInf );
 
   // List the menu
   for (i=0; i< MaxNo_Menu; ++i) {
      gotoxy( xpos, ypos[i] );
      cprintf( "%s",menu_list[i] );
   }
 
   // Make menu available to choose
   i = 0;
   gotoxy( xpos, ypos[i] );
   SetConsoleTextAttribute( hOut, BACKGROUND_WHITE );
   cprintf("%s",menu_list[i] );
 
   while ( !isExit ) {
      gotoxy( xpos, ypos[i] );
      switch( getch() ) {
         case KEY_UP: 
            SetConsoleTextAttribute( hOut, FOREGROUND_WHITE );
            cprintf( "%s",menu_list[i] );
            i = i > 0 ? --i : MaxNo_Menu-1 ;
            gotoxy( xpos, ypos[i] );
            SetConsoleTextAttribute( hOut, BACKGROUND_WHITE );
            cprintf( "%s",menu_list[i] );
            break;
         case KEY_DOWN: 
            SetConsoleTextAttribute( hOut, FOREGROUND_WHITE );
            cprintf( "%s",menu_list[i] );
            i = i < MaxNo_Menu-1 ? ++i : 0 ;
            gotoxy( xpos, ypos[i] );
            SetConsoleTextAttribute( hOut, BACKGROUND_WHITE );
            cprintf( "%s", menu_list[i] );
            break;
         case KEY_ENTER: 
            gotoxy (10,21);
            if(i==0) { printf(" you choose ADD    ");  }
            if(i==1) { printf(" you choose EDIT   ");  }
            if(i==2) { printf(" you choose DELETE ");  }
            if(i==3) { printf(" you choose SAVE   ");  }
            if(i==4) { printf(" you choose EXIT   "); isExit = true; }
         break;
 
     }
   }
   SetConsoleTextAttribute( hOut, FOREGROUND_WHITE );
   // Show the cursor
   conCurInf.bVisible = true;
   SetConsoleCursorInfo( hOut, &conCurInf );
   printf( "\n" );
 
   return 0;
 
}
Добавлено через 16 часов 34 минуты
А и еще я понял очень важную вещь,если вы только начинаете программирование на C++,то лучше не писать меню в консоли,а сделать что-нибудь попроще.Если вы уже давно занимаетесь программированием,то пора переходить к изучению WinApi или MFC(библиотеки для c++).Если хотите пойти в область написания игр следует начать изучение DirectX или OpenGL и создавать свои окна,а не работать в консоли.Вот неплохой сайт по книгам для разработки игр:Книги по разработке игр
Yandex
Объявления
21.05.2011, 12:15     Перехват клавиш,"case"?
Ответ Создать тему
Опции темы

Текущее время: 03:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru