Controller Devices: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 30: Line 30:
:: [[_BUTTON]](number) returns -1 when a button is pressed and 0 when released.
:: [[_BUTTON]](number) returns -1 when a button is pressed and 0 when released.


{{FixedStart}}'                                  '''Keyboard Device Button Numbers'''
{{FixedStart}}
'                                  '''Keyboard Device Button Numbers'''
'
'
' '''Esc F1  F2  F3  F4  F5  F6  F7  F8  F9  F10  F11 F12      SysReq ScrL Pause'''
' ''' Esc F1  F2  F3  F4  F5  F6  F7  F8  F9  F10  F11 F12      SysReq ScrL Pause'''
' 177 436 433 434 439 440 437 438 395 396 393 394 399      402  392   ---
'   2  60  61  62  63  64  65  66 67  68  --   88  89        --   71    70
' '''`~  1!  2@  3#  4$  5%  6^  7&  8*  9(  0)  -_  =+ BkSpc  Insert Home PgUp  NumL    /    *    -'''
'   '''`~  1!  2@  3#  4$  5%  6^  7&  8*  9(  0)  -_  =+ BkSpc  Insert Home PgUp  NumL    /    *    -'''
' 246 155 156 153 154 159 160 157 158 147 134 135 151 174    447   448   446   386   417 418  423
42  3  4  5  6  7  8  9  10  11  12  13  14  15    339  328   330   326   310 56  75
' '''Tab  Q  W  E  R  T  Y  U  I  O  P  [{  ]}  \|  Delete End  PgDn  7/Home 8/▲  9/PU  + '''
' ''' Tab  Q  W  E  R  T  Y  U  I  O  P  [{  ]}  \|  Delete End  PgDn  7/Home 8/▲  9/PU  +'''
' 163 219 221 207 220 218 211 223 195 197 198 241 247 242    213   445   435   429    430  419  424
16  17  18  19  20  21  22  23  24  25  26  27 28  44    340  336  338  72    73   74   79
' '''CapL  A  S  D  F  G  H  J  K  L  ;:  '"  Enter                    4/◄-    5  6/-►  E'''
' ''' CapL  A  S  D  F  G  H  J  K  L  ;:  '"  Enter                    4/◄-    5  6/-►  E'''
' 391 203 217 202 208 205 206 196 193 194 145 141   167                      426   431  432   '''n'''
'   59  31  32  33  34  35 36 37  38  39   40  41   29                      76    77   78    '''n'''
' '''Shift  Z  X  C  V  B  N  M  ,<  .>  /?      Shift          ▲          1/End  2/▼  3/PD  t'''
' ''' Shift  Z  X  C  V  B  N  M  ,<  .>  /?      Shift          ▲          1/End  2/▼  3/PD  t'''
' 390   212 222 201 224 204 200 199 130 136 133      389          443        427   428 432   '''e'''
43   45 46  47  48  49  50  51  52  53  54        55          329        80    81   82    '''e'''
' '''Ctrl Win  Alt    Spacebar    Alt  Win  Menu Ctrl            ◄-    ▼    -►    0/Insert    ./Del r'''
' ''' Ctrl Win  Alt    Spacebar    Alt  Win  Menu Ctrl            ◄-    ▼    -►    0/Insert    ./Del r'''
' 412 413  410      182       409 414 405 411            442  444   441    86        420  421
'   30  348 --       58        --  349? 350 286            332 337 334    83          84   285
'
'
{{FixedEnd}}
{{FixedEnd}}
Line 120: Line 121:
: Displays all keyboard, mouse and game controller button, axis and wheel control input values when each device is being used.
: Displays all keyboard, mouse and game controller button, axis and wheel control input values when each device is being used.
{{CodeStart}}
{{CodeStart}}
{{Cl|PRINT}} "Use relative mouse movement mode with ESC key exit only?(Y/N) ";
{{Cl|PRINT}} {{Text|<nowiki>"Use relative mouse movement mode with ESC key exit only?(Y/N) "</nowiki>|#FFB100}};
K$ = {{Cl|UCASE$}}({{Cl|INPUT$}}(1))
K$ = {{Cl|UCASE$}}({{Cl|INPUT$}}({{Text|1|#F580B1}}))
{{Cl|PRINT}} K$
{{Cl|PRINT}} K$
{{Cl|PRINT}}
{{Cl|PRINT}}


{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} {{Cl|_DEVICES}} 'DEVICES MUST be read first!
{{Cl|FOR}} i = {{Text|1|#F580B1}} {{Cl|TO}} {{Cl|_DEVICES}} {{Text|<nowiki>'DEVICES MUST be read first!</nowiki>|#919191}}
  {{Cl|PRINT}} {{Cl|STR$}}(i) + ") " + {{Cl|_DEVICE$}}(i) + " Buttons:"; {{Cl|_LASTBUTTON}}(i); ",Axis:"; {{Cl|_LASTAXIS}}(i); ",Wheel:"; {{Cl|_LASTWHEEL}}(i)
    {{Cl|PRINT}} {{Cl|STR$}}(i) + {{Text|<nowiki>") "</nowiki>|#FFB100}} + {{Cl|_DEVICE$}}(i) + {{Text|<nowiki>" Buttons:"</nowiki>|#FFB100}}; {{Cl|_LASTBUTTON}}(i); {{Text|<nowiki>",Axis:"</nowiki>|#FFB100}}; {{Cl|_LASTAXIS}}(i); {{Text|<nowiki>",Wheel:"</nowiki>|#FFB100}}; {{Cl|_LASTWHEEL}}(i)
{{Cl|NEXT}}
{{Cl|NEXT}}
{{Cl|IF...THEN|IF}} K$ = "Y" {{Cl|THEN}} dummy = {{Cl|_MOUSEMOVEMENTX}} 'enable relative mouse movement reads
{{Cl|IF}} K$ = {{Text|<nowiki>"Y"</nowiki>|#FFB100}} {{Cl|THEN}} dummy = {{Cl|_MOUSEMOVEMENTX}} {{Text|<nowiki>'enable relative mouse movement reads</nowiki>|#919191}}
{{Cl|PRINT}}
{{Cl|PRINT}}


{{Cl|DO...LOOP|DO}}
{{Cl|DO}}
  x& = {{Cl|_DEVICEINPUT}} 'determines which device is currently being used
    x& = {{Cl|_DEVICEINPUT}} {{Text|<nowiki>'determines which device is currently being used</nowiki>|#919191}}
  {{Cl|IF...THEN|IF}} x& = 1 {{Cl|THEN}}
    {{Cl|IF}} x& = {{Text|1|#F580B1}} {{Cl|THEN}}
    {{Cl|PRINT}} "Keyboard: ";
        {{Cl|PRINT}} {{Text|<nowiki>"Keyboard: "</nowiki>|#FFB100}};
    {{Cl|FOR...NEXT|FOR}} b = 1 {{Cl|TO}} {{Cl|_LASTBUTTON}}(x&)
        {{Cl|FOR}} b = {{Text|1|#F580B1}} {{Cl|TO}} {{Cl|_LASTBUTTON}}(x&)
      bb = {{Cl|_BUTTONCHANGE}}(b)
            bb = {{Cl|_BUTTONCHANGE}}(b)
      {{Cl|IF...THEN|IF}} bb {{Cl|THEN}} {{Cl|PRINT}} b; bb; {{Cl|_BUTTON}}(b);
            {{Cl|IF}} bb {{Cl|THEN}} {{Cl|PRINT}} b; bb; {{Cl|_BUTTON}}(b);
    {{Cl|NEXT}}
        {{Cl|NEXT}}
    {{Cl|PRINT}}
        {{Cl|PRINT}}
  {{Cl|END IF}}
    {{Cl|END IF}}
  {{Cl|IF...THEN|IF}} x& > 1 {{Cl|THEN}} '  skip keyboard reads
    {{Cl|IF}} x& > {{Text|1|#F580B1}} {{Cl|THEN}} {{Text|<nowiki>'  skip keyboard reads</nowiki>|#919191}}
    {{Cl|PRINT}} "Device:"; x&;
        {{Cl|PRINT}} {{Text|<nowiki>"Device:"</nowiki>|#FFB100}}; x&;
    {{Cl|FOR...NEXT|FOR}} b = 1 {{Cl|TO}} {{Cl|_LASTBUTTON}}(x&)
        {{Cl|FOR}} b = {{Text|1|#F580B1}} {{Cl|TO}} {{Cl|_LASTBUTTON}}(x&)
      {{Cl|PRINT}} {{Cl|_BUTTONCHANGE}}(b); {{Cl|_BUTTON}}(b);
            {{Cl|PRINT}} {{Cl|_BUTTONCHANGE}}(b); {{Cl|_BUTTON}}(b);
    {{Cl|NEXT}}
        {{Cl|NEXT}}
    {{Cl|FOR...NEXT|FOR}} a = 1 {{Cl|TO}} {{Cl|_LASTAXIS}}(x&)
        {{Cl|FOR}} a = {{Text|1|#F580B1}} {{Cl|TO}} {{Cl|_LASTAXIS}}(x&)
      {{Cl|PRINT}} {{Cl|_AXIS}}(a); 'mouse axis returns -1 to 1 with 0 center screen
            {{Cl|PRINT}} {{Cl|_AXIS}}(a); {{Text|<nowiki>'mouse axis returns -1 to 1 with 0 center screen</nowiki>|#919191}}
    {{Cl|NEXT}}
        {{Cl|NEXT}}
    {{Cl|FOR...NEXT|FOR}} w = 1 {{Cl|TO}} {{Cl|_LASTWHEEL}}(x&)
        {{Cl|FOR}} w = {{Text|1|#F580B1}} {{Cl|TO}} {{Cl|_LASTWHEEL}}(x&)
      {{Cl|PRINT}} {{Cl|_WHEEL}}(w); 'wheels 1 and 2 of mouse return relative pixel moves when enabled
            {{Cl|PRINT}} {{Cl|_WHEEL}}(w); {{Text|<nowiki>'wheels 1 and 2 of mouse return relative pixel moves when enabled</nowiki>|#919191}}
    {{Cl|NEXT}}
        {{Cl|NEXT}}
    {{Cl|PRINT}}
        {{Cl|PRINT}}
  {{Cl|END IF}}
    {{Cl|END IF}}
{{Cl|LOOP}} {{Cl|UNTIL}} {{Cl|INKEY$}} = {{Cl|CHR$}}(27) 'escape key exit
{{Cl|DO...LOOP|LOOP UNTIL}} {{Cl|INKEY$}} = {{Cl|CHR$}}({{Text|27|#F580B1}}) {{Text|<nowiki>'escape key exit</nowiki>|#919191}}


{{Cl|END}}
{{Cl|END}}

Revision as of 21:49, 3 April 2023

QB64 supports all kinds of keyboard, mouse, joystick, gamepad, steering wheel and other multi-stick controller input devices.

  • In order to read the device controls, the number of input devices MUST first be found using _DEVICES.
  • After the device count is determined we can find out the type of device, the device name and the type of controls available using the _DEVICE$(device_number) function. The function returns a STRING containing information about each numbered device.


"[CONTROLLER][[DEVICENAME] device description][BUTTON][AXIS][WHEEL]"


  • _DEVICEINPUT can indicate a used device number or true when a specified device number is active.
device = _DEVICEINPUT would return 1 for a keyboard event and 2 for a mouse event.
mouse = _DEVICEINPUT(2) would return -1(true) when the mouse was moved, clicked or scrolled.


KEYBOARD

Normally the number 1 device, it usually only has BUTTON controls. Program window must be in focus to read key activity.


[KEYBOARD][BUTTON]


_LASTBUTTON(1) will normally return 512 buttons.
_BUTTONCHANGE(number) returns -1 when pressed, 1 when released and 0 when there is no event since the last read.
_BUTTON(number) returns -1 when a button is pressed and 0 when released.
'                                  Keyboard Device Button Numbers
'
'   Esc F1  F2  F3  F4  F5  F6  F7  F8  F9  F10  F11 F12      SysReq ScrL Pause
'    2  60  61  62  63  64  65  66  67  68  --   88  89        --    71    70
'   `~  1!  2@  3#  4$  5%  6^  7&  8*  9(  0)  -_  =+ BkSpc  Insert Home PgUp   NumL    /    *    -
'   42   3   4   5   6   7   8   9  10  11  12  13  14  15     339   328   330   326    310  56   75
'   Tab  Q   W   E   R   T   Y   U   I   O   P   [{  ]}  \|   Delete End  PgDn   7/Home 8/▲  9/PU  +
'   16  17  18  19  20  21  22  23  24  25  26   27 28  44     340   336   338   72     73   74   79
'   CapL  A   S   D   F   G   H   J   K   L   ;:  '"   Enter                     4/◄-    5   6/-►  E
'   59   31  32  33  34  35  36  37  38  39   40  41    29                       76     77   78    n
'   Shift  Z   X   C   V   B   N   M  ,<  .>  /?       Shift          ▲          1/End  2/▼  3/PD  t
'   43    45  46  47  48  49  50  51  52  53  54        55           329         80     81   82    e
'   Ctrl Win  Alt    Spacebar    Alt  Win  Menu Ctrl            ◄-    ▼    -►    0/Insert    ./Del r
'   30   348  --       58        --   349? 350  286             332  337  334    83          84   285
'

(Return to Table of Contents)


MOUSE

Normally the number 2 device, a mouse usually has [[[AXIS]]], [[[BUTTON]]] and [[[WHEEL]]] controls. Pointer must be in program screen area.


[MOUSE][BUTTON][AXIS][WHEEL]


_LASTAXIS(2) normally returns 2 axis representing the horizontal and vertical mouse, trackball, touch pad or touchscreen axis.
_AXIS(number) returns a SINGLE value from -1 to 1 with 0 representing the axis center in normal movement mode.
_AXIS(1) returns the horizontal axis position in normal movement mode only.
_AXIS(2) returns the vertical axis position in normal movement mode only.
Program window pointer AXIS values change from 0 at the center to -1 or + 1 values at the window borders.


_LASTBUTTON(2) will normally return 3 buttons when mouse has a center or scroll wheel button.
_BUTTONCHANGE(number) returns -1 when pressed, 1 when released and 0 when there is no event since the last read.
_BUTTON(number) returns -1 when corresponding button is pressed and 0 when released.
_BUTTON(1) returns Left button presses like _MOUSEBUTTON(1) and _BUTTONCHANGE(1) returns events.
_BUTTON(2) returns Center button presses like _MOUSEBUTTON(3) and _BUTTONCHANGE(2) returns events.
_BUTTON(3) returns Right button presses like _MOUSEBUTTON(2) and _BUTTONCHANGE(3) returns events.
Note that middle _BUTTON(2) is equivalent to _MOUSEBUTTON(3)!


_LASTWHEEL(2) will normally return 3 wheels where the first two return relative coordinate movements when set.
_WHEEL(number) returns -1 when wheel is scrolled up or forward and 1 when wheel is scrolled down or backward.
_WHEEL(1) returns relative horizontal pixel moves after _MOUSEMOVEMENTX or Y enables relative mode.
_WHEEL(2) returns relative vertical pixel moves after _MOUSEMOVEMENTX or Y enables relative mode.
_WHEEL(3) returns -1 when scroll wheel is moved forward or up and 1 when scrolled backward or down.
Relative WHEEL move values are negative when mouse is moved up or left. Positive when mouse is moved down or right.
WHEEL values can be added for a cumulative movement value when needed. Scroll reads can be off program screen.

(Return to Table of Contents)


CONTROLLER

[[NAME][manufacturer name]] may follow in the controller _DEVICE$ string. Devices can be joysticks, game pads or multi-stick.


[CONTROLLER][[DeviceName]description][BUTTON][AXIS][WHEEL]


Normally device numbers 3 or higher, controllers may have any number of [[[AXIS]]], [[[BUTTON]]] and/or [[[WHEEL]]] controls.


_LASTAXIS(device_number) normally returns dual axis representing the horizontal and vertical axis or view point("top hat").
_AXIS(number) returns a SINGLE value from -1 to 1 with 0 representing the axis center.
_AXIS(1) returns the horizontal axis position.
_AXIS(2) returns the vertical axis position.
Note: Some slide controls may only have one axis!


_LASTBUTTON(device_number) will return the number of buttons or triggers a device has.
_BUTTONCHANGE(number) returns -1 when pressed, 1 when released and 0 when there is no event since the last read.
_BUTTON(number) returns -1 when button number is pressed and 0 when released.


_LASTWHEEL(device_number) will return the number of wheel controls a device has.
_WHEEL(number) returns -1 when wheel is scrolled up or forward and 1 when wheel is scrolled down or backward.

(Return to Table of Contents)


Examples

Displays all keyboard, mouse and game controller button, axis and wheel control input values when each device is being used.
PRINT "Use relative mouse movement mode with ESC key exit only?(Y/N) ";
K$ = UCASE$(INPUT$(1))
PRINT K$
PRINT

FOR i = 1 TO _DEVICES 'DEVICES MUST be read first!
    PRINT STR$(i) + ") " + _DEVICE$(i) + " Buttons:"; _LASTBUTTON(i); ",Axis:"; _LASTAXIS(i); ",Wheel:"; _LASTWHEEL(i)
NEXT
IF K$ = "Y" THEN dummy = _MOUSEMOVEMENTX 'enable relative mouse movement reads
PRINT

DO
    x& = _DEVICEINPUT 'determines which device is currently being used
    IF x& = 1 THEN
        PRINT "Keyboard: ";
        FOR b = 1 TO _LASTBUTTON(x&)
            bb = _BUTTONCHANGE(b)
            IF bb THEN PRINT b; bb; _BUTTON(b);
        NEXT
        PRINT
    END IF
    IF x& > 1 THEN '  skip keyboard reads
        PRINT "Device:"; x&;
        FOR b = 1 TO _LASTBUTTON(x&)
            PRINT _BUTTONCHANGE(b); _BUTTON(b);
        NEXT
        FOR a = 1 TO _LASTAXIS(x&)
            PRINT _AXIS(a); 'mouse axis returns -1 to 1 with 0 center screen
        NEXT
        FOR w = 1 TO _LASTWHEEL(x&)
            PRINT _WHEEL(w); 'wheels 1 and 2 of mouse return relative pixel moves when enabled
        NEXT
        PRINT
    END IF
LOOP UNTIL INKEY$ = CHR$(27) 'escape key exit

END
Code by Ted Weissgerber
Note: When there is no device control to read, a FOR n = 1 TO 0 loop will not run thus avoiding a control function read error.
Using _MOUSEMOVEMENTX or Y will hide the mouse cursor and return relative mouse movements with the 1 and 2 _WHEEL controls.
_MOUSESHOW will return the mouse coordinate reads to the _AXIS control after it is used!

(Return to Table of Contents)


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link