VB:Tutorials:WINAPI:Joystick Input

From GDWiki

Jump to: navigation, search

Tutorial by Nicholas Gorski (GMan)

This tutorial will use the Windows API to get joystick input.

Contents

[edit] API Definitions

Here is a list of what functions and type's we will need. I suggest adding a module or class to your project and adding these there.

[edit] Function's

Public Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Long, _ 
    pji As JOYINFOEX) As Long
 
Public Declare Function joyGetDevCapsA Lib "winmm.dll" (ByVal uJoyID As Long, _
    pjc As JOYCAPS, ByVal cjc As Long) As Long

joyGetPosEx returns input information.

joyGetDevCapsA returns information on the joystick.

[edit] Type's

Public Type JOYCAPS
    wMid As Integer
    wPid As Integer
    szPname As String * 32
    wXmin As Long
    wXmax As Long
    wYmin As Long
    wYmax As Long
    wZmin As Long
    wZmax As Long
    wNumButtons As Long
    wPeriodMin As Long
    wPeriodMax As Long
    wRmin As Long
    wRmax As Long
    wUmin As Long
    wUmax As Long
    wVmin As Long
    wVmax As Long
    wCaps As Long
    wMaxAxes As Long
    wNumAxes As Long
    wMaxButtons As Long
    szRegKey As String * 32
    szOEMVxD As String * 260
End Type
 
Public Type JOYINFOEX
    dwSize As Long
    dwFlags As Long
    dwXpos As Long
    dwYpos As Long
    dwZpos As Long
    dwRpos As Long
    dwUpos As Long
    dwVpos As Long
    dwButtons As Long
    dwButtonNumber As Long
    dwPOV As Long
    dwReserved1 As Long
    dwReserved2 As Long
End Type

[edit] Other public variables

Public JoyNum As Long
Public MYJOYEX As JOYINFOEX
Public MYJOYCAPS As JOYCAPS
Public CenterX As Long
Public CenterY As Long
Public JoyButtons(15) as Boolean
Public CurrentJoyX As Long
Public CurrentJoyY As Long

[edit] Coding the Input

Create a function named StartJoystick. All this does is get the CAPS and Center positions:

Public Function StartJoystick(Optional ByVal JoystickNumber As Long = 0) As Boolean
JoyNum = JoystickNumber
If joyGetDevCapsA(JoyNum, MYJOYCAPS, 404) <> 0 Then 'Get joystick info
    StartJoystick = False
Else
    Call joyGetPosEx(JoyNum, MYJOYEX)
    CenterX = MYJOYEX.dwXpos
    CenterY = MYJOYEX.dwYpos
    StartJoystick = True
End If
End Function

As you can see, it's not too complicated. The JoystickNumber variable is what joystick you want to get input from. This is usually zero, but can be one [or two for hardcore users...:)].

Next, add a function called PollJoystick. This function will get all the information from the joystick, then sort it out:

Public Sub PollJoystick()
Dim i As Long
Dim t As Long
 
MYJOYEX.dwSize = 64
MYJOYEX.dwFlags = 255
 
' Get the joystick information
Call joyGetPosEx(JoyNum, MYJOYEX)
 
t = MYJOYEX.dwButtons
For i = 15 To 0 Step -1
    JoyButtons(i) = False
    If (2 ^ i) <= t Then
        t = t - (2 ^ i)
        JoyButtons(i) = True
    End If
Next i
 
CurrentJoyX = MYJOYEX.dwXpos
CurrentJoyY = MYJOYEX.dwYpos
End Sub

Now you have the ability to get input from the joystick. But how do you use it? And what's with the complicated code? Well, that complicated code is what tells you what buttons are pressed. How? When you press button zero on your joystick, the joystick tells the computer 1. Press one, it says 2. But press two, it says four. Press three, and its 8. See the pattern? If not, here it is:

2^0=1
2^1=2
2^2=4
2^3=8
2^4=16
2^5=32

See? So press buttons zero, two and three, and the joystick tells the computer 11. How do we sort this out? Start with the highest number, then goto zero. If the current number is within the input number (11 in our example), then subtract that from from the number. So in our example, it would get the 2^3=8, so subtract it, leaving us with 3. Then it gets to 2^1=2, subtract it, leaving 1. So then 2^0=1, subtract it, leaving zero. Get it? If not, trust me (I'm bad at explaining algorithms).

[edit] Done

Download the source code to see it in action, in a stupid little game.

Files:VB6_WindowsApi_Joystick.zip

Personal tools
Categories