Click here to Skip to main content
15,867,488 members
Articles / Programming Languages / C#

Using XNA to Access an Xbox 360 Joystick

Rate me:
Please Sign up or sign in to vote.
4.76/5 (19 votes)
11 Nov 2012CPOL5 min read 197.1K   6.8K   37   33
This article demonstrates how to use the Microsoft XNA Framework to read the state of an Xbox 360 controller
Sample Image - XNA_360_Controller_Input.png

Introduction

With the release of XNA, Microsoft has made available a platform for writing games on the PC and for the Xbox 360. XNA provides more simplified access to hardware than managed DirectX did. The Xbox 360 controllers are also fully supported by the XNA Framework. In this article, I'll be using Visual Studio 2005 and the XNA Framework to create a demonstration form that will display the full state of Xbox 360 controllers connected to the system.

Update 11 November 2012 - I've posted another article that makes use of XInput instead of Xna to access the same functionality.  XInput gives access to additional information (such as information on the battery) but the version of the code in the other articles requires Windows 8. You can find the article here.  

Prerequisites

This code example uses assemblies from the XNA Framework and you will need to install the XNA redistributables to run the example program. You can download it from here. In creating your own XNA project, remember to add an assembly reference to Microsoft.Xna.Framework and Microsoft.Xna.Framework.Input.

XNA

The XNA Framework is based on a subset of the .NET Compact Framework and was designed to run on Windows XP SP2. At the time of this writing, Windows 2003 and Vista are not officially supported, although the Framework does operate on these systems. The Xbox 360 has an XNA game loader which provides a runtime environment for XNA based games.

Since XNA is based on a subset of the .NET Compact Framework, there is no support for the Windows Forms namespace or the network namespace. However, if you are targeting the Windows platform only, you can use System.Windows.Forms and System.Net and other namespaces as needed.

Types of Inputs

The inputs on the controller are either analog or digital. The digital inputs will only have one of two states to indicate whether or not they are being pressed: ButtonState.Pressed or ButtonState.Released. The digital inputs on the controller are the buttons labelled A, B, X, Y, LB , RB, Back, Start, the buttons under both of the thumb sticks, and the D-Pad.

The state of the analog inputs is represented with a floating point number. The triggers on the controller will cause values between 0.0 (the trigger is not pressed) and 1.0 (the trigger is pressed all the way down) to be returned. The two thumb sticks return values between -1.0 and +1.0 for the x and y axis, where 0 is the center point for the axis.

The button in the center of the Xbox 360 controller is not accessible. It's only used by the Xbox operating system.

Accessing the Controller

The state of the controller is accessed through the Microsoft.XNA.Framework..Input.GamePad class. This class only has three methods (beyond those inherited from System.Object). Those methods are GetCapabilities, GetState, and SetVibration. For this demonstration I will only use GetState and SetVibration. These methods take for their first argument a PlayerIndex value. This is used to specify the controller with which we will interact.

The GetState method returns a GamePadState struct. GamePadState contains the state of the controller in several sub-structs named Buttons, DPad, IsConnected, ThumbSticks, and Triggers. The Button and DPad structs have members named after the 10 buttons on the controller and the four directions on the DPad that will each be set to ButtonState.Pressed and ButtonState.Released (there is also an enumeration in the System.Windows.Forms namespace, you may need to disambiguate between the two if you are using the System.Windows.Forms with Microsoft.Xna.Framework.Input).

C#
//Setting or clearing a checkbox depending on the state of a button on the controller.

this.gamePadState = GamePad.GetState(this.playerIndex);
this.buttonA.Checked = (this.gamePadState.Buttons.A == Input.ButtonState.Pressed);

The Triggers struct contains the members Left and Right that have floating point to represent how far down the trigger is pressed.

The ThumbSticks member has two members Left and Right. Each one of these is a Vector2, or a group of floating point X and Y values indicating the position of the joystick. A Vector with the values (X:0,Y:0) mean the joystick is in the center position, (X:-1,Y:0) means the joystick is to the far left position, (X:0, Y:1) means the controller is being pressed up, and so on. Note that you will never see the X and Y values in their most extreme state at the same time.

The Two Vibration Motors

The Xbox 360 controllers have two motors for vibration. The left motor causes a slow vibration. The right motor causes a quick vibration. The motors can be turned on with the SetVibration method. This method takes a PlayerIndex and two floating point numbers between 0.0f and 1.0f to indicate how strong each motor should vibrate.

C#
//Turning the slow vibration motor on to 50% maximum
GamePad.SetVibration(playerIndex, 0.5f, 0.0f);

About the Program

The example program continually polls the Xbox 360 controller on a timed interval and updates the onscreen state. Checkboxes are used for the digital inputs. The analog inputs are represented with progress bars. The axis for the thumb sticks will be empty in the most negative position, half full in the center position, and full in the most positive position.

You can also turn the motors on using the numeric up/down inputs at the bottom of the UI. I've only allowed the motors to be on for a limited time and also turn them off when the program is terminating.

Conclusion

You'll find that the XNA Framework greatly simplifies interaction with the Xbox 360 controllers. In my next article, I'll show how to render graphics using XNA and using an XNA input device to control onscreen objects.

History

  • 20th December, 2006 - Article created

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
United States United States
I attended Southern Polytechnic State University and earned a Bachelors of Science in Computer Science and later returned to earn a Masters of Science in Software Engineering. I've largely developed solutions that are based on a mix of Microsoft technologies with open source technologies mixed in. I've got an interest in astronomy and you'll see that interest overflow into some of my code project articles from time to time.



Twitter:@j2inet

Instagram: j2inet


Comments and Discussions

 
QuestionNot working Pin
Soraiko11-Sep-16 6:19
Soraiko11-Sep-16 6:19 
AnswerXNA is Discontinued, Use XInput Pin
Joel Ivory Johnson19-Jan-17 14:33
professionalJoel Ivory Johnson19-Jan-17 14:33 
GeneralMy vote of 5 Pin
Member 1126909012-May-15 4:52
Member 1126909012-May-15 4:52 
QuestionSilverlight Pin
Mike C. Adams25-Sep-12 8:37
Mike C. Adams25-Sep-12 8:37 
AnswerRe: Silverlight Pin
Joel Ivory Johnson26-Oct-12 19:39
professionalJoel Ivory Johnson26-Oct-12 19:39 
AnswerRe: Silverlight Pin
Joel Ivory Johnson11-Nov-12 12:50
professionalJoel Ivory Johnson11-Nov-12 12:50 
QuestionXbox Control Pin
CP-Ayyub4-Aug-12 8:49
CP-Ayyub4-Aug-12 8:49 
AnswerRe: Xbox Control Pin
Joel Ivory Johnson11-Nov-12 12:42
professionalJoel Ivory Johnson11-Nov-12 12:42 
QuestionButton state Pin
tom.957-Mar-12 9:56
tom.957-Mar-12 9:56 
AnswerRe: Button state Pin
Joel Ivory Johnson26-Oct-12 19:40
professionalJoel Ivory Johnson26-Oct-12 19:40 
GeneralWARNING: READ IF YOU ARE USING (OR PLAN TO RUN THIS ON) 64BIT MACHINE!!!! [modified] Pin
FocusedWolf7-Jul-09 10:19
FocusedWolf7-Jul-09 10:19 
GeneralRe: WARNING: READ IF YOU ARE USING (OR PLAN TO RUN THIS ON) 64BIT MACHINE!!!! Pin
Joel Ivory Johnson7-Jul-09 10:57
professionalJoel Ivory Johnson7-Jul-09 10:57 
GeneralRe: WARNING: READ IF YOU ARE USING (OR PLAN TO RUN THIS ON) 64BIT MACHINE!!!! Pin
Joel Ivory Johnson12-Jul-09 17:55
professionalJoel Ivory Johnson12-Jul-09 17:55 
GeneralRe: WARNING: READ IF YOU ARE USING (OR PLAN TO RUN THIS ON) 64BIT MACHINE!!!! [modified] Pin
tom.957-Mar-12 7:47
tom.957-Mar-12 7:47 
QuestionHow do I add VB code to it? Pin
cmilianxp29-May-09 14:09
cmilianxp29-May-09 14:09 
GeneralError when trying to run sample program Pin
michaelry8-Apr-09 16:16
michaelry8-Apr-09 16:16 
GeneralRe: Error when trying to run sample program Pin
Joel Ivory Johnson8-Apr-09 16:21
professionalJoel Ivory Johnson8-Apr-09 16:21 
GeneralRe: Error when trying to run sample program [modified] Pin
michaelry8-Apr-09 16:29
michaelry8-Apr-09 16:29 
GeneralCould not load file or assembly 'Microsoft.Xna.Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d' or one of its dependencies. Pin
Joel Ivory Johnson25-Nov-07 12:01
professionalJoel Ivory Johnson25-Nov-07 12:01 
GeneralRe: Could not load file or assembly 'Microsoft.Xna.Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d' or one of its dependencies. Pin
Joel Ivory Johnson25-Nov-07 15:58
professionalJoel Ivory Johnson25-Nov-07 15:58 
GeneralController connect Pin
kaylee3112-May-07 12:22
kaylee3112-May-07 12:22 
GeneralRe: Controller connect Pin
Joel Ivory Johnson12-May-07 13:30
professionalJoel Ivory Johnson12-May-07 13:30 
QuestionXNA with PS2 Controller Pin
Tony198620-Mar-07 19:30
Tony198620-Mar-07 19:30 
AnswerRe: XNA with PS2 Controller Pin
Joel Ivory Johnson21-Mar-07 7:50
professionalJoel Ivory Johnson21-Mar-07 7:50 
GeneralRe: XNA with PS2 Controller Pin
Tony198621-Mar-07 12:45
Tony198621-Mar-07 12:45 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.