1 Session 3.1 Getting Player Input Using a Gamepad Chapter 3.1: Getting Player Input Using a Gamepad 2 Session Overview Introduce the gamepad device Show how a C# object can be used to represent the state of a gamepad Find out how to use the properties of the GamePadState object in a program Create a Mood Light that is controlled by the gamepad Discover how to use logical operators OR and AND Create our first XNA multiplayer game Chapter 3.1: Getting Player Input Using a Gamepad A User-Controlled Mood Light We are going to make a Mood Light that is controlled by the user They will press the buttons on the gamepad to control the brightness and color of the screen background The user can select any color that they want This can also serve as the basis of a game To do this we need to know how XNA games get input from the player 3 Chapter 3.1: Getting Player Input Using a Gamepad The Xbox Gamepad The gamepad is a very complex device It is connected to the host either by USB or a wireless connection It can be used with a Windows PC or an Xbox You can obtain a wireless adapter for the Windows PC 4 Chapter 3.1: Getting Player Input Using a Gamepad The Zune Buttons The Zune buttons work in the same way as the buttons on a gamepad The same XNA program can work with a gamepad or a Zune However, the Zune doesn’t provide all the buttons that a gamepad does 5 Chapter 3.1: Getting Player Input Using a Gamepad 6 Software and Objects We know that C# programs are made up of objects that bring together data and behaviors A game has Game World data and draw and update methods The state of a gamepad can be represented by a C# object called a GamePadState object This contains the information about the state of the gamepad at a particular instant The GamePadState object also provides properties you can use to read this status information Chapter 3.1: Getting Player Input Using a Gamepad 7 The GamePadState object A GamePadState object contains information about all the input devices the gamepad has Buttons We are going to consider just the buttons and the DPad at the moment DPad When the Red button (B) is pressed we want the redIntensity value of the background color to increase GamePadState Chapter 3.1: Getting Player Input Using a Gamepad 8 Creating a GamePadState Variable GamePadState pad1; The game will use a variable to hold the state of the gamepad It will then test the values of the buttons in this variable so that the gamepad can be used to control the game The variable must be declared like any other variable in the game program It has been given the identifier pad1 Chapter 3.1: Getting Player Input Using a Gamepad 9 The pad1 Variable Each time that update is called, the pad1 variable is set with the state of the gamepad for player 1 Code in the update method will use this variable Should the pad1 variable be a local variable or a member of the Game1 class? Member variables are shared between all the methods in a class Local variables are just used inside the body of a method and discarded when no longer required Chapter 3.1: Getting Player Input Using a Gamepad 10 Using Local Variables The variable pad1 should be local to the update method We don’t want to retain the value of gamepad states from previous calls of update No other methods need to use the value of pad1 Deciding which variables should be local and which should be members is part of the program design process Chapter 3.1: Getting Player Input Using a Gamepad 11 Setting the pad1 Variable GamePadState pad1 = GamePad.GetState (PlayerIndex.One) ; We can set the value of pad1 when we declare it The XNA Framework provides a class called GamePad that exposes a getState method The getState method is told which gamepad to get the state of We don’t need to know how getState works, just how to call it and what the type of the result is Chapter 3.1: Getting Player Input Using a Gamepad 12 GamePadState Properties A property is member of a class that represents some data in the class They can be set up to be read or Buttons written, or both The GamePadState properties can only be read DPad Each of the properties can contain several values GamePadState Chapter 3.1: Getting Player Input Using a Gamepad 13 Game Update Behavior if (pad1.Buttons.B == ButtonState.Pressed) redIntensity++; This condition tests the state of the B (Red) button If the button is Pressed the condition adds 1 to the value of redIntensity If the button is held down successive calls of update will cause the redIntensity to increase The equality operator is used because we are comparing the state of Buttons.B with the value ButtonState.Pressed Chapter 3.1: Getting Player Input Using a Gamepad 14 Game Update Behavior GamePadState pad1 = GamePad.GetState(PlayerIndex.One); if (pad1.Buttons.B == ButtonState.Pressed) redIntensity++; This is the code that allows a game to control the red intensity using button B on a gamepad Create a local variable called pad1 that contains the state of the gamepad for player 1 Get the state of button B out of the Buttons in the pad, and if the button is pressed, increase the value of redIntensity. Chapter 3.1: Getting Player Input Using a Gamepad 1. User-Controlled Red Light This version of Mood Light uses the code above to control the redIntensity value When the Red button is pressed the screen redIntensity value gets larger 15 Chapter 3.1: Getting Player Input Using a Gamepad 16 Controlling Green and Blue GamePadState pad1 = GamePad.GetState(PlayerIndex.One); if (pad1.Buttons.B == ButtonState.Pressed) redIntensity++; if (pad1.Buttons.A == ButtonState.Pressed) greenIntensity++; if (pad1.Buttons.X == ButtonState.Pressed) blueIntensity++; The same code construction can be used to control the green and blue intensity values Note that we don’t need to get a new GamePadState value each time, the program can just read different properties from the same pad1 value Chapter 3.1: Getting Player Input Using a Gamepad 17 Controlling Yellow Intensity Using the Y Button if (pad1.Buttons.Y == ButtonState.Pressed) { redIntensity++; greenIntensity++; } The gamepad has a Yellow button (Y) We can increase the yellow intensity by increasing both red and green when this button is pressed To achieve this, the two update statements must be placed in a block after the condition Chapter 3.1: Getting Player Input Using a Gamepad 2. User-Controlled Light This version of Mood Light uses all the gamepad buttons to control the background color 18 Chapter 3.1: Getting Player Input Using a Gamepad Adding Zune Support Using the DPad The Zune does not have all of the buttons on the gamepad However it does have a DPad which can be pressed in one of four directions We could make a “Mood Flashlight” by using the DPad to control the colors Then the program would work on the Zune as well 19 Chapter 3.1: Getting Player Input Using a Gamepad 20 Controlling Red Using the DPad.Right Value if (pad1.DPad.Right == ButtonState.Pressed) redIntensity++; The GamePadState type contains a DPad property which gives the states of the Left, Right, Up, and Down positions of the DPad These are used in exactly the same way as the colored buttons on the gamepad If any button state is equal to the value ButtonState.Pressed it means that the direction is selected on the gamepad Chapter 3.1: Getting Player Input Using a Gamepad Combining Tests Using Logical OR We want to make the red light brighter if button B (Red) is pressed or Right is pressed on the DPad We can do this by having two separate if statements However, it would be neater to be able to use a single condition: “If Button B is pressed OR DPad Right is pressed increase the value of redIntensity” C# provides a logical operator to allow this We must use the logical OR operator 21 Chapter 3.1: Getting Player Input Using a Gamepad 22 The Logical OR operator if (pad1.DPad.Right == ButtonState.Pressed || pad1.Buttons.B == ButtonState.Pressed) { redIntensity++; } The logical OR operator is two vertical bars - || It works between Boolean values (i.e. true or false) If either of the values on each side are true, the result it gives is true The above code increases redIntensity if either button is pressed Chapter 3.1: Getting Player Input Using a Gamepad 23 Logical OR Test if (true || false ) redIntensity++; if (true || true ) redIntensity++; if (false|| false ) redIntensity++; Logical OR works between any two conditions that return a Boolean result We can use it between the values true and false Although this might result in compiler warnings Which of the above statements would increase the value of redIntensity? Chapter 3.1: Getting Player Input Using a Gamepad 24 Logical OR Test if (true || false ) redIntensity++; // increases if (true || true ) redIntensity++; // increases if (false || false ) redIntensity++; // doesn’t increase The OR operator returns true if either of the conditions on each side of the operator is true Therefore it only returns false if both the conditions are false Chapter 3.1: Getting Player Input Using a Gamepad 25 Logical AND There is also a logical AND operator We could use this to make the program reset all the colors to 0 if both triggers are pressed on the gamepad This makes it harder to reset the colors by mistake The logical AND condition only works out to true if the conditions on both sides are true The logical AND operator is the character sequence && Chapter 3.1: Getting Player Input Using a Gamepad Logical AND Value Reset if (pad1.Buttons.LeftShoulder == ButtonState.Pressed && pad1.Buttons.RightShoulder == ButtonState.Pressed) { redIntensity = 0; greenIntensity = 0; blueIntensity = 0; } The program can test the values of the shoulder buttons on the controller If both of them are pressed the block of code is performed This resets the intensity values to 0 26 Chapter 3.1: Getting Player Input Using a Gamepad 3. Fully Functional Light This version of the Mood Light will work on Zune, Windows PC or Xbox It also provides the reset behavior with the shoulder buttons 27 Chapter 3.1: Getting Player Input Using a Gamepad 28 Game Idea – Color Nerve You can use this program as the basis of a game: Players take turns to press any buttons they like on the gamepad (but they must change the color on the screen) If the screen flashes from bright to dark (i.e. an intensity value wraps around) during a turn that player is out The game continues until one player is left to become the winner Press the shoulder buttons to reset for the next game Chapter 3.1: Getting Player Input Using a Gamepad 29 Summary The XNA Framework uses the type GamePadState to represent the state of a gamepad in a game The GamePad class, which is part of XNA, provides a getState method that can be used to get the GamePadState value for the selected player The GamePadState type exposes properties that can be read to get the state of the gamepad These states can be combined using logical operators to allow more complicated behaviors to be created in a program Chapter 3.1: Getting Player Input Using a Gamepad 30 True/False Revision Quiz An XNA program can control the state of the buttons on a gamepad. The GamePadState type holds information about the state of a gamepad. Objects can expose information by means of properties. An XNA program can only connect to one gamepad. The Zune has a full set of colored buttons. The AND operator is represented by|| in a program. Chapter 3.1: Getting Player Input Using a Gamepad 31 True/False Revision Quiz An XNA program can control the state of the buttons on a gamepad. The GamePadState type holds information about the state of a gamepad. Objects can expose information by means of properties. An XNA program can only connect to one gamepad. The Zune has a full set of colored buttons. The AND operator is represented by|| in a program. Chapter 3.1: Getting Player Input Using a Gamepad 32 True/False Revision Quiz An XNA program can control the state of the buttons on a gamepad. The GamePadState type holds information about the state of a gamepad. Objects can expose information by means of properties. An XNA program can only connect to one gamepad. The Zune has a full set of colored buttons. The AND operator is represented by|| in a program. Chapter 3.1: Getting Player Input Using a Gamepad 33 True/False Revision Quiz An XNA program can control the state of the buttons on a gamepad. The GamePadState type holds information about the state of a gamepad. Objects can expose information by means of properties. An XNA program can only connect to one gamepad. The Zune has a full set of colored buttons. The AND operator is represented by|| in a program. Chapter 3.1: Getting Player Input Using a Gamepad 34 True/False Revision Quiz An XNA program can control the state of the buttons on a gamepad. The GamePadState type holds information about the state of a gamepad. Objects can expose information by means of properties. An XNA program can only connect to one gamepad. The Zune has a full set of colored buttons. The AND operator is represented by||in a program. Chapter 3.1: Getting Player Input Using a Gamepad 35 True/False Revision Quiz An XNA program can control the state of the buttons on a gamepad. The GamePadState type holds information about the state of a gamepad. Objects can expose information by means of properties. An XNA program can only connect to one gamepad. The Zune has a full set of colored buttons. The AND operator is represented by|| in a program. Chapter 3.1: Getting Player Input Using a Gamepad 36 True/False Revision Quiz An XNA program can control the state of the buttons on a gamepad. The GamePadState type holds information about the state of a gamepad. Objects can expose information by means of properties. An XNA program can only connect to one gamepad. The Zune has a full set of colored buttons. The AND operator is represented by|| in a program.