本文整理汇总了C++中input_manager类的典型用法代码示例。如果您正苦于以下问题:C++ input_manager类的具体用法?C++ input_manager怎么用?C++ input_manager使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了input_manager类的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: newwin
void input_context::display_help()
{
inp_mngr.set_timeout(-1);
// Shamelessly stolen from help.cpp
WINDOW *w_help = newwin(FULL_SCREEN_HEIGHT - 2, FULL_SCREEN_WIDTH - 2,
1 + (int)((TERMY > FULL_SCREEN_HEIGHT) ? (TERMY - FULL_SCREEN_HEIGHT) / 2 : 0),
1 + (int)((TERMX > FULL_SCREEN_WIDTH) ? (TERMX - FULL_SCREEN_WIDTH) / 2 : 0));
// has the user changed something?
bool changed = false;
// keybindings before the user changed anything.
input_manager::t_action_contexts old_action_contexts(inp_mngr.action_contexts);
// current status: adding/removing/showing keybindings
enum { s_remove, s_add, s_add_global, s_show } status = s_show;
// copy of registered_actions, but without the ANY_INPUT and COORDINATE, which should not be shown
std::vector<std::string> org_registered_actions(registered_actions);
std::vector<std::string>::iterator any_input = std::find(org_registered_actions.begin(),
org_registered_actions.end(), ANY_INPUT);
if (any_input != org_registered_actions.end()) {
org_registered_actions.erase(any_input);
}
std::vector<std::string>::iterator coordinate = std::find(org_registered_actions.begin(),
org_registered_actions.end(), COORDINATE);
if (coordinate != org_registered_actions.end()) {
org_registered_actions.erase(coordinate);
}
// colors of the keybindings
static const nc_color global_key = c_ltgray;
static const nc_color local_key = c_ltgreen;
static const nc_color unbound_key = c_ltred;
// (vertical) scroll offset
size_t scroll_offset = 0;
// height of the area usable for display of keybindings, excludes headers & borders
const size_t display_height = FULL_SCREEN_HEIGHT - 9 - 2; // -2 for the border
// width of the legend
const size_t legwidth = FULL_SCREEN_WIDTH - 4 - 2;
// keybindings help
std::ostringstream legend;
legend << "<color_" << string_from_color(unbound_key) << ">" << _("Unbound keys") << "</color>\n";
legend << "<color_" << string_from_color(local_key) << ">" <<
_("Keybinding active only on this screen") << "</color>\n";
legend << "<color_" << string_from_color(global_key) << ">" << _("Keybinding active globally") <<
"</color>\n";
legend << _("Press - to remove keybinding\nPress + to add local keybinding\nPress = to add global keybinding\n");
input_context ctxt("HELP_KEYBINDINGS");
ctxt.register_action("UP", _("Scroll up"));
ctxt.register_action("DOWN", _("Scroll down"));
ctxt.register_action("PAGE_DOWN");
ctxt.register_action("PAGE_UP");
ctxt.register_action("REMOVE");
ctxt.register_action("ADD_LOCAL");
ctxt.register_action("ADD_GLOBAL");
ctxt.register_action("QUIT");
ctxt.register_action("ANY_INPUT");
if (category != "HELP_KEYBINDINGS") {
// avoiding inception!
ctxt.register_action("HELP_KEYBINDINGS");
}
std::string hotkeys = ctxt.get_available_single_char_hotkeys(display_help_hotkeys);
while(true) {
werase(w_help);
draw_border(w_help);
draw_scrollbar(w_help, scroll_offset, display_height, org_registered_actions.size() - display_height, 8);
mvwprintz(w_help, 0, (FULL_SCREEN_WIDTH - utf8_width(_("Keybindings"))) / 2 - 1,
c_ltred, " %s ", _("Keybindings"));
fold_and_print(w_help, 1, 2, legwidth, c_white, legend.str());
for (size_t i = 0; i + scroll_offset < org_registered_actions.size() && i < display_height; i++) {
const std::string &action_id = org_registered_actions[i + scroll_offset];
bool overwrite_default;
const action_attributes &attributes = inp_mngr.get_action_attributes(action_id, category,
&overwrite_default);
char invlet;
if (i < hotkeys.size()) {
invlet = hotkeys[i];
} else {
invlet = ' ';
}
if (status == s_add_global && overwrite_default) {
// We're trying to add a global, but this action has a local
// defined, so gray out the invlet.
mvwprintz(w_help, i + 8, 2, c_dkgray, "%c ", invlet);
} else if (status == s_add || status == s_add_global) {
mvwprintz(w_help, i + 8, 2, c_blue, "%c ", invlet);
} else if (status == s_remove) {
mvwprintz(w_help, i + 8, 2, c_blue, "%c ", invlet);
} else {
mvwprintz(w_help, i + 8, 2, c_blue, " ");
}
nc_color col;
if (attributes.input_events.empty()) {
//.........这里部分代码省略.........
开发者ID:Acherontius,项目名称:Cataclysm-DDA,代码行数:101,代码来源:input.cpp
示例2: ctxt
void input_context::display_menu()
{
inp_mngr.reset_timeout();
// Shamelessly stolen from help.cpp
input_context ctxt( "HELP_KEYBINDINGS" );
ctxt.register_action( "UP", _( "Scroll up" ) );
ctxt.register_action( "DOWN", _( "Scroll down" ) );
ctxt.register_action( "PAGE_DOWN" );
ctxt.register_action( "PAGE_UP" );
ctxt.register_action( "REMOVE" );
ctxt.register_action( "ADD_LOCAL" );
ctxt.register_action( "ADD_GLOBAL" );
ctxt.register_action( "QUIT" );
ctxt.register_action( "ANY_INPUT" );
if( category != "HELP_KEYBINDINGS" ) {
// avoiding inception!
ctxt.register_action( "HELP_KEYBINDINGS" );
}
std::string hotkeys = ctxt.get_available_single_char_hotkeys( display_help_hotkeys );
int maxwidth = max( FULL_SCREEN_WIDTH, TERMX );
int width = min( 80, maxwidth );
int maxheight = max( FULL_SCREEN_HEIGHT, TERMY );
int height = min( maxheight, ( int ) hotkeys.size() + LEGEND_HEIGHT + BORDER_SPACE );
catacurses::window w_help = catacurses::newwin( height - 2, width - 2, maxheight / 2 - height / 2,
maxwidth / 2 - width / 2 );
// has the user changed something?
bool changed = false;
// keybindings before the user changed anything.
input_manager::t_action_contexts old_action_contexts( inp_mngr.action_contexts );
// current status: adding/removing/showing keybindings
enum { s_remove, s_add, s_add_global, s_show } status = s_show;
// copy of registered_actions, but without the ANY_INPUT and COORDINATE, which should not be shown
std::vector<std::string> org_registered_actions( registered_actions );
org_registered_actions.erase( std::remove_if( org_registered_actions.begin(),
org_registered_actions.end(),
[]( const std::string & a ) {
return a == ANY_INPUT || a == COORDINATE;
} ), org_registered_actions.end() );
// colors of the keybindings
static const nc_color global_key = c_light_gray;
static const nc_color local_key = c_light_green;
static const nc_color unbound_key = c_light_red;
// (vertical) scroll offset
size_t scroll_offset = 0;
// height of the area usable for display of keybindings, excludes headers & borders
const size_t display_height = height - LEGEND_HEIGHT - BORDER_SPACE; // -2 for the border
// width of the legend
const size_t legwidth = width - 4 - BORDER_SPACE;
// keybindings help
std::ostringstream legend;
legend << "<color_" << string_from_color( unbound_key ) << ">" << _( "Unbound keys" ) <<
"</color>\n";
legend << "<color_" << string_from_color( local_key ) << ">" <<
_( "Keybinding active only on this screen" ) << "</color>\n";
legend << "<color_" << string_from_color( global_key ) << ">" << _( "Keybinding active globally" )
<<
"</color>\n";
legend << _( "Press - to remove keybinding\nPress + to add local keybinding\nPress = to add global keybinding\n" );
std::vector<std::string> filtered_registered_actions = org_registered_actions;
std::string filter_phrase;
std::string action;
long raw_input_char = 0;
string_input_popup spopup;
spopup.window( w_help, 4, 8, legwidth )
.max_length( legwidth )
.context( ctxt );
while( true ) {
werase( w_help );
draw_border( w_help, BORDER_COLOR, _( "Keybindings" ), c_light_red );
draw_scrollbar( w_help, scroll_offset, display_height,
filtered_registered_actions.size(), 10, 0, c_white, true );
fold_and_print( w_help, 1, 2, legwidth, c_white, legend.str() );
for( size_t i = 0; i + scroll_offset < filtered_registered_actions.size() &&
i < display_height; i++ ) {
const std::string &action_id = filtered_registered_actions[i + scroll_offset];
bool overwrite_default;
const action_attributes &attributes = inp_mngr.get_action_attributes( action_id, category,
&overwrite_default );
char invlet;
if( i < hotkeys.size() ) {
invlet = hotkeys[i];
} else {
invlet = ' ';
}
if( status == s_add_global && overwrite_default ) {
// We're trying to add a global, but this action has a local
// defined, so gray out the invlet.
//.........这里部分代码省略.........
开发者ID:greenalgae3183,项目名称:Cataclysm-DDA,代码行数:101,代码来源:input.cpp
示例3: init
void input_manager::init() {
init_keycode_mapping();
std::ifstream data_file;
picojson::value input_value;
std::string file_name = "data/raw/keybindings.json";
data_file.open(file_name.c_str());
if(!data_file.good()) {
throw "Could not read " + file_name;
}
data_file >> input_value;
data_file.close();
if(!input_value.is<picojson::array>()) {
throw file_name + "is not an array";
}
//Crawl through once and create an entry for every definition
const picojson::array& root = input_value.get<picojson::array>();
for (picojson::array::const_iterator entry = root.begin();
entry != root.end(); ++entry) {
if( !(entry->is<picojson::object>()) ){
debugmsg("Invalid keybinding setting, entry not a JSON object");
continue;
}
// JSON object representing the action
const picojson::value& action_object = *entry;
const std::string& action_id = action_object.get("id").get<std::string>();
std::string context = "default";
if(action_object.contains("category")) {
context = action_object.get("category").get<std::string>();
}
// Iterate over the bindings JSON array
const picojson::array& keybindings = action_object.get("bindings").get<picojson::array>();
for (picojson::array::const_iterator subentry = keybindings.begin();
subentry != keybindings.end(); ++subentry) {
const picojson::value& keybinding = *subentry;
const std::string& input_method = keybinding.get("input_method").get<std::string>();
input_event new_event;
if(input_method == "keyboard") {
new_event.type = CATA_INPUT_KEYBOARD;
} else if(input_method == "gamepad") {
new_event.type = CATA_INPUT_GAMEPAD;
}
if(keybinding.get("key").is<std::string>()) {
const std::string& key = keybinding.get("key").get<std::string>();
new_event.sequence.push_back(inp_mngr.get_keycode(key));
} else if(keybinding.get("key").is<picojson::array>()) {
picojson::array keys = keybinding.get("key").get<picojson::array>();
for(int i=0; i<keys.size(); i++) {
const std::string& next_key = keybinding.get("key").get(i).get<std::string>();
new_event.sequence.push_back(inp_mngr.get_keycode(next_key));
}
}
if(context == "default") {
action_to_input[action_id].push_back(new_event);
} else {
action_contexts[context][action_id].push_back(new_event);
}
}
if(!action_object.contains("name")) {
actionID_to_name[action_id] = action_id;
} else {
actionID_to_name[action_id] = action_object.get("name").get<std::string>();
}
}
}
开发者ID:8Z,项目名称:Cataclysm-DDA,代码行数:81,代码来源:input.cpp
示例4: while
const std::string &input_context::handle_input()
{
next_action.type = CATA_INPUT_ERROR;
while(1) {
next_action = inp_mngr.get_input_event(NULL);
if (next_action.type == CATA_INPUT_TIMEOUT) {
return TIMEOUT;
}
const std::string &action = input_to_action(next_action);
// Special help action
if(action == "HELP_KEYBINDINGS") {
display_help();
return ANY_INPUT;
}
if(next_action.type == CATA_INPUT_MOUSE) {
if(!handling_coordinate_input) {
continue; // Ignore this mouse input.
}
coordinate_input_received = true;
coordinate_x = next_action.mouse_x;
coordinate_y = next_action.mouse_y;
} else {
coordinate_input_received = false;
}
if(action != CATA_ERROR) {
return action;
}
// If we registered to receive any input, return ANY_INPUT
// to signify that an unregistered key was pressed.
if(registered_any_input) {
return ANY_INPUT;
}
// If it's an invalid key, just keep looping until the user
// enters something proper.
}
}
开发者ID:Levvy055,项目名称:Cataclysm-DDA,代码行数:43,代码来源:input.cpp
示例5: get_available_single_char_hotkeys
std::string input_context::get_available_single_char_hotkeys(std::string requested_keys)
{
for (std::vector<std::string>::const_iterator registered_action = registered_actions.begin();
registered_action != registered_actions.end();
++registered_action) {
const std::vector<input_event> &events = inp_mngr.get_input_for_action(*registered_action,
category);
for( const auto &events_event : events ) {
// Only consider keyboard events without modifiers
if( events_event.type == CATA_INPUT_KEYBOARD && 0 == events_event.modifiers.size() ) {
requested_keys.erase( std::remove_if( requested_keys.begin(), requested_keys.end(),
ContainsPredicate<std::vector<long>, char>(
events_event.sequence ) ),
requested_keys.end() );
}
}
}
return requested_keys;
}
开发者ID:Acherontius,项目名称:Cataclysm-DDA,代码行数:21,代码来源:input.cpp
示例6: action_uses_input
bool input_context::action_uses_input( const std::string &action_id,
const input_event &event ) const
{
const auto &events = inp_mngr.get_action_attributes( action_id, category ).input_events;
return std::find( events.begin(), events.end(), event ) != events.end();
}
开发者ID:greenalgae3183,项目名称:Cataclysm-DDA,代码行数:6,代码来源:input.cpp
注:本文中的input_manager类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论