Stap 3: Krijgen INPUT van GAMEPAD
Nu, dat we hoe de gegevens te verzenden naar de Arduino weten, alleen moeten we om te leren hoe te verwerven van de input van de XBOX-gamepad.
In deze sectie zullen we leren de basisprincipes van XInput en schrijven een zeer eenvoudig programma, waarin de stand van de gamepad in de console output. Ook zullen we sommige belangrijke aspecten van voorbehandeling de invoerwaarden Voorkom problematisch analoge stick invoerbereik ("dode zones") leren.
DE BASISPRINCIPES
XInput API biedt het vervoermiddel krijgen input van de XBOX 360 controllers en bevat een scala aan hulpmiddelen worden de effecten van de controller (klucht feedback), verwerken van audio input/output voor gaming headsets en andere coole dingen doen.
XInput ondersteunt maximaal 4 controllers, maar in onze situatie alleen #0 controller zal worden gebruikt als standaardwaarde.
Wij zullen XInputGetState() functie gebruiken om het bijwerken van de huidige stand van de gamepad. Duurt het 2 parameters: de gamepad-ID (die is ingesteld op 0 in de meeste gevallen) en de aanwijzer aan XInput staat variabele. De geretourneerde waarde van de XInputGetState kan worden gebruikt om te controleren van de beschikbaarheid van de gamepad. De waarde van ERR_SUCCESS betekent dat de gamepad brandt, en XInput staat nu zijn huidige staat heeft.
XINPUT_STATE bestaat uit de volgende elementen:
dwPacketNumber geeft aan of de gamepad staat is gewijzigd.
Gamepad is een gegevenstype, waarmee de huidige status van de gamepad, met inbegrip van de analoge stick posities, trigger waarden, D-stootkussen en knop vlaggen.
sThumbLX, sThumbLY, sThumbRX en sThumbRY zijn 16-bits ondertekend gehele getallen, die nemen de waarden van −32, 768 tot 32.767. Deze komen overeen met de huidige posities van de analoge stick.
bLeftTrigger en bRightTrigger nemen waarden in de 0..255 bereik.
wButtons vertegenwoordigt de status van alle knoppen op een XBox-controller, waar elke bit komt met de huidige status van elke afzonderlijke knop overeen. Als we willen om te controleren of de X-knop werd ingedrukt moeten we de volgende bewerkingen uitvoeren:
De onderstaande lijst vindt u alle knopen en hun overeenkomstige bitmaskers:
LATEN WE DE PRAKTIJK
Op dit punt hebben we alle instrumenten moeten we ons eerste programma met XInput schrijven. Het is belachelijk eenvoudig, maar het zal helpen om te begrijpen hoe dit proces werkt en welke elementen voor XInput moeten we.
Zodra u de oplossing bouwen en uw programma uitvoert, ziet u de uitvoer te wijzigen wanneer u thumbsticks of drukknoppen op uw gamepad verplaatsen. We stuurt deze gegevens naar de Arduino board in de volgende sectie van dit leerprogramma.
Op dit moment wil ik u aandacht te besteden aan de uitvoer, wanneer u om het even wat niet doet. Waarden van LX, RX en RY LY zijn niet gelijk is aan 0, aangezien we verwachten ze dat. Dit gebeurt voor een aantal redenen, maar wat het belangrijkste is dat we ons bewust van dit fenomeen!
Deze schommelingen en ongerijmdheden in waarden worden 'dode zones' genoemd. We moeten om zich te ontdoen van deze vervelende anomalie vindt u de laagste marginale waarde waartegen we overwegen kunnen dat de analoge stick eigenlijk in bepaalde richting wordt geduwd.
Om dit te doen moeten we definiëren een drempel van deadzone en vergelijken met huidige waarden. Bekijk MSDN referentie voor meer info.
Ondertussen, gebruiken deze voorbeeldcode om deze waarden te corrigeren:
Er zijn ook vooraf gedefinieerde dode zone waarden voor links en rechts thumbsticks en triggers. U kunt gebruiken, of uw eigen drempels (in mijn geval ~ 6500 werkte voor linker- en stick) vast, maar vergeet niet dat deze waarden grotendeels afhangen van hoe beat-up uw gamepad is!
EXTRA LEZING
De enige extra bron ik ga om te vermelden is dit één: XInput Game Controller API's
Het heeft alles wat die u weten over XInput moet, met inbegrip van complete referentie en handige programmering gids.
Dat is het voor dit deel. Nu, laten we proberen te combineren onze vaardigheden in de programmering van gamepads en seriële verbindingen naar controle Arduino op afstand! ... in het geval u vergeten waar we begonnen...