1 registered members (AndrewAMD),
645
guests, and 4
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Capturing Keyboard Input
#216150
07/15/08 12:50
07/15/08 12:50
|
Joined: Oct 2003
Posts: 1,550 United Kingdom
indiGLOW
OP
Serious User
|
OP
Serious User
Joined: Oct 2003
Posts: 1,550
United Kingdom
|
Is there a better way to capture all keyboard input other than using the key_for_str method?
I note that it does not capture ALL keys, cloning some of them over onto the numberpad and extra buttons?
TIA for any assistance
The Art of Conversation is dead : Discuss
|
|
|
Re: Capturing Keyboard Input
[Re: indiGLOW]
#216158
07/15/08 13:27
07/15/08 13:27
|
Joined: Jul 2002
Posts: 4,436 Germany, Luebeck
Xarthor
Expert
|
Expert
Joined: Jul 2002
Posts: 4,436
Germany, Luebeck
|
maybe try "on_anykey" and use the scan code from there? example:
string key_name_str;
function key_Show(_ScanCode)
{
str_for_key(key_name_str,_ScanCode);
error(key_name_str);
}
on_anykey = key_Show;
|
|
|
Re: Capturing Keyboard Input
[Re: Xarthor]
#216178
07/15/08 15:53
07/15/08 15:53
|
Joined: Jul 2005
Posts: 1,930 Austria
Dark_samurai
Serious User
|
Serious User
Joined: Jul 2005
Posts: 1,930
Austria
|
He means something like getch() which returns the correct char.
The problem with str_for_key is, that it ignores shift, only converts numbers and chars correct,... So this function is total useless for a real input code.
Maybe with a plugin there is a possible solution, but getch() doesn't work with a plugin and I don't know any other functions like this.
Dark_Samurai
ANet - A stable and secure network plugin with multi-zone, unlimited players, voip, server-list features,... (for A7/A8)! get free version
|
|
|
Re: Capturing Keyboard Input
[Re: Dark_samurai]
#216182
07/15/08 16:17
07/15/08 16:17
|
Joined: Feb 2006
Posts: 2,185
mpdeveloper_B
Expert
|
Expert
Joined: Feb 2006
Posts: 2,185
|
Here's a simple keypress function:
function press_key(num)
{
return(key_pressed(num));
}
I use it by mapping key codes ( See the Manual's Keymapping section for scan codes) to varibles, like this:
var_info upp1 = 72;
var_info leftp1 = 75;
var_info rightp1 = 77;
var_info downp1 = 80;
///when used in a function you'd use it like this:
//in place of:
//if (key_cuu) { ....blah blah blah code }
//you would use:
//if (press_key(upp1)) { ....blah blah blah code }
If you want the key changing code, which includes strings that you can use to show which key is mapped, i'll post it too (the code captures all keyboard stuff and mouse, I should be able to modify it for joystick as well) edit: oh yes, I also have Gamepad mapping which allows you to switch between the Joystick (gamepad) Digital and Analog, if you need that as well.
- aka Manslayer101
|
|
|
Re: Capturing Keyboard Input
[Re: mpdeveloper_B]
#216187
07/15/08 16:47
07/15/08 16:47
|
Joined: Jul 2005
Posts: 1,930 Austria
Dark_samurai
Serious User
|
Serious User
Joined: Jul 2005
Posts: 1,930
Austria
|
I guess he want's to make an own inkey function because the standard inkey function is "not so good" to say it harmless ^^
Have you ever tried making an own inkey function using key_for_str?
Dark_Samurai
ANet - A stable and secure network plugin with multi-zone, unlimited players, voip, server-list features,... (for A7/A8)! get free version
|
|
|
Re: Capturing Keyboard Input
[Re: Dark_samurai]
#216204
07/15/08 17:55
07/15/08 17:55
|
Joined: Jul 2007
Posts: 959 nl
flits
User
|
User
Joined: Jul 2007
Posts: 959
nl
|
maby somthing like this
function return_pressed_key() { if(key_a){return = 30;} //until z if(key_o){return = 11;} //1-9 if(key_shift){return = 54;}//42 if(mouse_left){return = 280;} //enz. enz enz }
"empty"
|
|
|
Re: Capturing Keyboard Input
[Re: flits]
#216209
07/15/08 18:14
07/15/08 18:14
|
Joined: Oct 2003
Posts: 1,550 United Kingdom
indiGLOW
OP
Serious User
|
OP
Serious User
Joined: Oct 2003
Posts: 1,550
United Kingdom
|
Currently I am using str_for_key and key_for_str, and have also created a simple load / save, allowing key mapping to be done easily. It just feels a little.... un-robust, with these keys missing. It also has some trouble with special keys and mouse input. So I would very much appreciate some alternative way of doing this. Maybe there is a .DLL that better handles input? @Flits: I am not sure how your code helps, please explain. Sorry for my noobish ness
The Art of Conversation is dead : Discuss
|
|
|
Re: Capturing Keyboard Input
[Re: indiGLOW]
#216218
07/15/08 19:04
07/15/08 19:04
|
Joined: Jul 2007
Posts: 959 nl
flits
User
|
User
Joined: Jul 2007
Posts: 959
nl
|
instead of using strings i use vars and then you can convert it to string ore use lastpressed
the great thing is you can use mouse buttons and yostick buttons
"empty"
|
|
|
Re: Capturing Keyboard Input
[Re: flits]
#216230
07/15/08 21:59
07/15/08 21:59
|
Joined: Feb 2006
Posts: 2,185
mpdeveloper_B
Expert
|
Expert
Joined: Feb 2006
Posts: 2,185
|
so you do want to be able to change your mapping of keys?
- aka Manslayer101
|
|
|
Re: Capturing Keyboard Input
[Re: mpdeveloper_B]
#216587
07/17/08 19:05
07/17/08 19:05
|
Joined: Oct 2003
Posts: 1,550 United Kingdom
indiGLOW
OP
Serious User
|
OP
Serious User
Joined: Oct 2003
Posts: 1,550
United Kingdom
|
The simplest way to explain it, is by posting my code first. Note I have posted the entire code below, including the read/write of the keymap ini, for persistant settings.
// Input Handling
// Default Keys
// Basic Movement & Camera/Flight Control
var k_moveForward;
var k_moveBackward;
var k_moveLeft;
var k_moveRight;
var k_moveUp;
var k_moveDown;
// Complex Character Movement
var k_leanLeft;
var k_leanRight;
var k_rollLeft;
var k_rollRight;
var k_takeCover;
// Move Varients
var k_sprintMove;
var k_toggleStance;
var k_jumpMove;
// Action Buttons
var k_interAction;
var k_fireMode;
var k_firePrimary;
var k_fireSecondary;
var k_throwObject;
// Hot Swap
var k_weapon1; // Melee Slot
var k_weapon2; // Pistol Slot
var k_weapon3; // Assault Slot
var k_weapon4; // Grenade Slot
var k_weapon5; // Equip Slot (C4 etc)
var k_nextWeap; // Next Weapon
var k_prevWeap; // Previous Weapon
// Add more later
// Editor Quick Tools
define e_select = 2; // 1
define e_move = 3; // 2
define e_place = 4; // 3
define e_link = 5; // 4
// Editor Specific Keys
define e_Parachute = 25;
string keystring1;
string keystring2;
var keycode = 0;
font arial_font = "Arial",1,12;
panel keydisplay
{
layer = 100;
pos_x = 200;
pos_y = 200;
digits 100,-100,keystring1,arial_font,0,0;
digits 100,-90,keystring2,arial_font,0,0;
digits 100,50,5.3,arial_font,1,keycode;
flags = visible;
}
// Read "indiled.ini"
text mapping_ini{strings=300;}
starter GetKeyMapping
{
var i;
txt_load(mapping_ini,"system\\keymap.ini");
// Find & Assign 'Mode' - Reset Search Each Time
i=0;while(str_cmpi(mapping_ini.string[i],"forward")!=1){i+=1;}
i+=1;k_moveForward = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"backward")!=1){i+=1;}
i+=1;k_moveBackward = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"stepleft")!=1){i+=1;}
i+=1;k_moveLeft = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"stepright")!=1){i+=1;}
i+=1;k_moveRight = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"up")!=1){i+=1;}
i+=1;k_moveUp = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"down")!=1){i+=1;}
i+=1;k_moveDown = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"leanleft")!=1){i+=1;}
i+=1;k_leanLeft = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"leanright")!=1){i+=1;}
i+=1;k_leanRight = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"rollleft")!=1){i+=1;}
i+=1;k_rollLeft = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"rollright")!=1){i+=1;}
i+=1;k_rollRight = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"takecover")!=1){i+=1;}
i+=1;k_takeCover = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"sprint")!=1){i+=1;}
i+=1;k_sprintMove = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"togglestance")!=1){i+=1;}
i+=1;k_toggleStance = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"jump")!=1){i+=1;}
i+=1;k_jumpMove = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"interaction")!=1){i+=1;}
i+=1;k_interaction = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"FireMode")!=1){i+=1;}
i+=1;k_fireMode = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"FirePrimary")!=1){i+=1;}
i+=1;k_firePrimary = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"FireSecondary")!=1){i+=1;}
i+=1;k_firePrimary = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"Throw")!=1){i+=1;}
i+=1;k_throwObject = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"Slot1")!=1){i+=1;}
i+=1;k_weapon1 = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"Slot2")!=1){i+=1;}
i+=1;k_weapon2 = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"Slot3")!=1){i+=1;}
i+=1;k_weapon3 = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"Slot4")!=1){i+=1;}
i+=1;k_weapon4 = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"Slot5")!=1){i+=1;}
i+=1;k_weapon5 = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"next")!=1){i+=1;}
i+=1;k_nextWeap = key_for_str(mapping_ini.string[i]);
i=0;while(str_cmpi(mapping_ini.string[i],"prev")!=1){i+=1;}
i+=1;k_prevWeap = key_for_str(mapping_ini.string[i]);
WriteKeyMapping();
}
var_nsave ini_filehandle;
string _keystring;
function WriteKeyMapping
{
ini_filehandle = file_open_write ("system\\keymap.ini");
file_str_write (ini_filehandle,"[KeyMapping]");file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"\n"); // Nice Formatting
file_str_write(ini_filehandle,"Forward,");str_for_key(_keystring,k_moveForward);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Backward,");str_for_key(_keystring,k_moveBackward);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"StepLeft,");str_for_key(_keystring,k_moveLeft);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"StepRight,");str_for_key(_keystring,k_moveRight);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Up,");str_for_key(_keystring,k_moveUp);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Down,");str_for_key(_keystring,k_moveDown);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"\n"); // Nice Formatting:)
file_str_write(ini_filehandle,"LeanLeft,");str_for_key(_keystring,k_leanLeft);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"LeanRight,");str_for_key(_keystring,k_leanRight);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"RollLeft,");str_for_key(_keystring,k_rollLeft);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"RollRight,");str_for_key(_keystring,k_rollRight);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"TakeCover,");str_for_key(_keystring,k_takeCover);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"\n"); // Nice Formatting :)
file_str_write(ini_filehandle,"Sprint,");str_for_key(_keystring,k_sprintMove);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"ToggleStance,");str_for_key(_keystring,k_toggleStance);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Jump,");str_for_key(_keystring,k_jumpMove);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"\n"); // Nice Formatting :)
file_str_write(ini_filehandle,"Interaction,");str_for_key(_keystring,k_interAction);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"FireMode,");str_for_key(_keystring,k_fireMode);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"FirePrimary,");str_for_key(_keystring,k_firePrimary);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"FireSecondary,");str_for_key(_keystring,k_fireSecondary);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Throw,");str_for_key(_keystring,k_throwObject);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"\n"); // Nice Formatting :)
file_str_write(ini_filehandle,"Slot1,");str_for_key(_keystring,k_weapon1);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Slot2,");str_for_key(_keystring,k_weapon2);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Slot3,");str_for_key(_keystring,k_weapon3);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Slot4,");str_for_key(_keystring,k_weapon4);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Slot5,");str_for_key(_keystring,k_weapon5);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Next,");str_for_key(_keystring,k_nextWeap);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_str_write(ini_filehandle,"Prev,");str_for_key(_keystring,k_prevWeap);file_str_write(ini_filehandle,_keystring);file_str_write(ini_filehandle,"\n");
file_close (ini_filehandle);
}
function KeyPress()
{
keycode = key_lastpressed;
// Catch Complex Keys
if(str_for_key(keystring1,keycode)==null){
str_cpy(keystring1, "Special Key");<<<<-- Here we find the major problem
}
// Quick Tools Links
if(keycode == e_select){SelectTool();}
if(keycode == e_move){MoveTool();}
if(keycode == e_place){PlaceTool();}
if(keycode == e_link){LinkTool();}
// Editor Shortcuts
if(keycode == e_parachute){Parachute();}
// E.G Get Movement Intention for Debug Cam
if(keycode == k_moveForward){CamEnt.camforce_x += 1;}
if(keycode == k_moveBackward){CamEnt.camforce_x -= 1;}
if(keycode == k_moveRight){CamEnt.camforce_y -= 1;}
if(keycode == k_moveLeft){CamEnt.camforce_y += 1;}
if(keycode == k_moveUp){CamEnt.camforce_z += 1;}
if(keycode == k_moveDown){CamEnt.camforce_z -= 1;}
}
on_anykey = KeyPress;
The problem is capturing all keys, the key_mapping does not support the numpad keys, unless I am missing something here. It appears that the mapping lists 7,9,1 and 3 as the alt counterparts.... It's also worth throwing into the mix that my keypress approach doesn't seem to be a good approach, and I welcome any suggestions on how to improve / replace it. Really I am trying to get a solid input and then link it to my camera movement and other functionality etc. TIA for any help, and thanks to those who have helped already
The Art of Conversation is dead : Discuss
|
|
|
|