Game control

From Second Life Wiki
Jump to navigation Jump to search

Description

Event: game_control( key id, integer button_levels, list axes ){ ; }

Triggered when compatible viewer sends fresh GameControlInput message, but only for scripts on attachments or seat.

• key id avatar UUID
• integer button_levels bitfield of buttons held down
• list axes list of axes float values in range [-1, 1]
Constant Value
GAME_CONTROL_BUTTON_A 0x00000001
GAME_CONTROL_BUTTON_B 0x00000002
GAME_CONTROL_BUTTON_X 0x00000004
GAME_CONTROL_BUTTON_Y 0x00000008
GAME_CONTROL_BUTTON_BACK 0x00000010
GAME_CONTROL_BUTTON_GUIDE 0x00000020
GAME_CONTROL_BUTTON_START 0x00000040
GAME_CONTROL_BUTTON_LEFTSTICK 0x00000080
GAME_CONTROL_BUTTON_RIGHTSTICK 0x00000100
GAME_CONTROL_BUTTON_LEFTSHOULDER 0x00000200
GAME_CONTROL_BUTTON_RIGHTSHOULDER 0x00000400
GAME_CONTROL_BUTTON_DPAD_UP 0x00000800
GAME_CONTROL_BUTTON_DPAD_DOWN 0x00001000
GAME_CONTROL_BUTTON_DPAD_LEFT 0x00002000
GAME_CONTROL_BUTTON_DPAD_RIGHT 0x00004000
GAME_CONTROL_BUTTON_MISC1 0x00008000
GAME_CONTROL_BUTTON_PADDLE1 0x00010000
GAME_CONTROL_BUTTON_PADDLE2 0x00020000
GAME_CONTROL_BUTTON_PADDLE3 0x00040000
GAME_CONTROL_BUTTON_PADDLE4 0x00080000
GAME_CONTROL_BUTTON_TOUCHPAD 0x00100000
Constant Value
GAME_CONTROL_AXIS_LEFTX 0x00000000
GAME_CONTROL_AXIS_LEFTY 0x00000001
GAME_CONTROL_AXIS_RIGHTX 0x00000002
GAME_CONTROL_AXIS_RIGHTY 0x00000003
GAME_CONTROL_AXIS_TRIGGERLEFT 0x00000004
GAME_CONTROL_AXIS_TRIGGERRIGHT 0x00000005

Caveats

  • If enabled at the client: avatar movements may be translated into GameControl input.
  • There is room for 32 buttons [bits 0 through 31] however at most only 16 buttons can be simultaneously held down at any one time.
  • There are always 6 axes values, even when the controller device has more or less
    • All axes elements will be in range [-1,1]
    • By default,
      • Left-tilting a thumbstick on GAME_CONTROL_AXIS_LEFTX or GAME_CONTROL_AXIS_RIGHTX yields a positive value, while right-tilting yields a negative value
      • Up-tilting a thumbstick on GAME_CONTROL_AXIS_LEFTY or GAME_CONTROL_AXIS_RIGHTY yields a positive value, while down-tilting yields a negative value
      • Pulling a trigger will increase the value of GAME_CONTROL_AXIS_TRIGGERLEFT or GAME_CONTROL_AXIS_TRIGGERRIGHT, while releasing will decrease the value


Examples

<syntaxhighlight lang="lsl2"> integer prev_button_levels = 0; integer print_list(string name, integer type, list data) {

   integer data_length = llGetListLength(data);
   string text = name + " : ";
   if (data_length > 0)
   {
       integer use_comma = FALSE;
       integer i = 0;
       for (i = 0; i < data_length; i++)
       {
           if (!use_comma)
           {
               use_comma = TRUE;
           }
           else
           {
               text += ",";
           }
           if (type == TYPE_INTEGER)
           {
               integer b = (llList2Integer(data, i));
               text += (string)(b);
               llOwnerSay("pack i=" + (string)(i) + " b=" + (string)(b));
           }
           else if (type == TYPE_FLOAT)
           {
               text += (string)(llList2Float(data, i));
           }
       }
   }
   llOwnerSay(text); 
   return data_length;

}

string bits2nybbles(integer bits) {

   integer lsn; // least significant nybble
   string nybbles = "";
   do
       nybbles = llGetSubString("0123456789ABCDEF", lsn = (bits & 0xF), lsn) + nybbles;
   while (bits = (0xfffFFFF & (bits >> 4)));
   return nybbles;

}

default {

   state_entry()
   {
       llOwnerSay("Ready for game_control events");
   }
   game_control(key id, integer button_levels, list axes)
   {
       integer button_edges = button_levels ^ prev_button_levels;
       prev_button_levels = button_levels;
       string button_levels_hex = bits2nybbles(button_levels);
       string button_edges_hex = bits2nybbles(button_edges);
       llOwnerSay("game_control :");
       llOwnerSay("  button_levels=0x" + button_levels_hex);
       llOwnerSay("  button_edges=0x" + button_edges_hex);
       print_list("  axes", TYPE_FLOAT, axes);
   }

} </syntaxhighlight>

See Also

Events

•  control

Articles

LSL Game Control Beta

Deep Notes

Signature

event void game_control( key id, integer button_levels, list axes );