Input from Controller and Keyboard in XNA Game Studio

Input from Controller and Keyboard in XNA Game Studio
Input from Controller and Keyboard in
XNA Game Studio Express
Game Design Experience
Professor Jim Whitehead
January 21, 2009
Creative Commons Attribution 3.0
creativecommons.org/licenses/by/3.0
Announcements
• Homework #1 due today
►
►
►
►
Submit printout of source code and play session in class
Also need to electronically submit ZIP file of project source code
See instructions online
www.soe.ucsc.edu/classes/cmps020/Winter09/
• You are expected to be in a project team by now
►
Please see me after class if you are not
• Craig Reynolds talk
►
►
►
►
Crowds and Emergent Teamwork
Friday, 11am
Engineering 2, room 180 (Plaza level, “Simularium”)
You are welcome to attend
Upcoming Assignments
•
Monday: Game Concept Document
► A compelling document that sells your game concept
► Title page
• Title of game, name of group, name of team members, sample artwork
►
Overview page
• Table at top: game genre, platform (PC/XBox), team size
• Key points section
– Bulleted list of important elements of gameplay
– Goal of game, what makes game unique, main characters, main fictional
elements
– Sample artwork image to give feel of the game
►
Biographies
• True, pocket biographies of each team member (1-2 paragraphs each) stressing experience
that makes you a strong game designer
►
1-3 pages giving a textual description of the game
• Fictional background, brief description of characters, goal of player in game, how does
player interact with the game, brief description of levels, game audience, other important
elements as needed.
►
1-2 pages of sample conceptual artwork
• Hand-drawn sketches are fine
•
See template and evaluation criteria on course website
Game Input
• XNA Framework supports three input sources
►
Xbox 360 controller
• Wired controller under Windows
• Wireless or wired for Xbox 360
• Up to 4 at a time
►
Keyboard
• Good default for Windows games
• Xbox 360 also supports USB
keyboards
►
Mouse
• Windows only (no Xbox 360 support)
• Poll for input
►
►
Every clock tick, check the state of your input devices
Generally works OK for 1/60th second ticks
Digital vs Analog Controls
• Input devices have two types of controls
• Digital
►
►
►
Reports only two states: on or off
Keyboard: keys
Controller A, B, X, Y, Back, Start, D-Pad
• Analog
►
►
►
Report a range of values
XBox 360 controller: -1.0f to 1.0f
Mouse: mouse cursor values (in pixels)
Input Type Overview
Input
Device
Digital
Buttons
Analog
Controls
Vibration
Win?
Xbox?
Number
Xbox 360
Controller
14
4
Yes
Yes
(wired or
wireless
with
adapter)
Yes
(wireless
or wired)
4
Keyboard
>100
0
No
Yes
Yes
1
Mouse
5
3
No
Yes
No
1
Xbox 360 Controller Input
• Every clock tick
►
Get state of controller
• Call GetState() on GamePad class
• Pass in PlayerIndex
– PlayerIndex.One, PlayerIndex.Two, …
– Corresponds to lit region in “ring of light”
• Returns a GamePadState structure
►
Check if controller is connected
• IsConnected boolean in GamePadState
►
►
Check GamePadState for current state of digital and
analog inputs
Recall that update() is called every clock tick
• Get input in update(), or a method called from it
GamePad Class
public static class GamePad
{
public static GamePadCapabilities GetCapabilities(PlayerIndex playerIndex);
public static GamePadState GetState(PlayerIndex playerIndex);
public static GamePadState GetState(PlayerIndex playerIndex, GamePadDeadZone deadZoneMode);
public static bool SetVibration(PlayerIndex playerIndex, float leftMotor, float rightMotor);
}
•
A static class
►
►
•
GetState
►
•
Retrieve current state of all inputs on one controller
SetVibration
►
•
Do not need to create an instance to use
All methods are static
Use to make controller vibrate
GetCapabilities
►
►
Determine which input types are supported.
Can check for voice support, and whether controller is connected.
C# Structs
• A struct in C# is a lightweight alternative to a class
• Similar to class
►
Can have constructors, properties, methods, fields,
operators, nested types, indexers
• Different from class
►
►
Struct does not support inheritance, or destructors
Is a value type (classes are reference types)
• Rule of thumb:
►
Use structs for types that are small, simple, similar in
behavior to built-in types
GamePadState Struct
public struct GamePadState
{
public static bool operator !=(GamePadState left, GamePadState right);
public static bool operator ==(GamePadState left, GamePadState right);
public GamePadButtons Buttons { get; }
public GamePadDPad DPad { get; }
public bool IsConnected { get; }
public int PacketNumber { get; }
public GamePadThumbSticks ThumbSticks { get; }
public GamePadTriggers Triggers { get; }
}
•
Properties for reading state of the GamePad
►
►
►
►
Digital Input: Buttons, DPad
Analog Input: ThumbSticks, Triggers
Check connection state: IsConneced
PacketNumber
• Number increases when gamepad state changes
• Use to check if player has changed gamepad state since last tick
GamePadButtons Struct (Buttons)
GamePadState m_pad;
// create GamePadState struct
m_pad = GamePad.GetState(PlayerIndex.One);
// retrieve current controller state
if (m_pad.Buttons.A == ButtonState.Pressed)
// do something if A button pressed|
if (m_pad.Buttons.LeftStick == ButtonState.Pressed) // do something if left stick button pressed
if (m_pad.Buttons.Start == ButtonState.Pressed) // do something if start button pressed
• Properties for retrieving current button state
►
►
►
A, B, X, Y
Start, Back
LeftStick, RightStick
• When you press straight down on each joystick, is a button press
►
LeftShoulder, RightShoulder
• Possible values are given by ButtonState enumeration
►
►
Released – button is up
Pressed – button is down
GameDPad Struct (DPad)
GamePadState m_pad;
m_pad = GamePad.GetState(PlayerIndex.One);
if (m_pad.DPad.Up == ButtonState.Pressed)
if (m_pad.DPad.Left == ButtonState.Pressed)
// create GamePadState struct
// retrieve current controller state
// do something if DPad up button pressed|
// do something if DPad left button pressed
• Properties for retrieving current DPad button state
►
Up, Down, Left, Right
• Possible values are given by ButtonState
enumeration
►
►
Released – button is up
Pressed – button is down
GamePadThumbsticks Struct (Thumbsticks)
GamePadState m_pad;
m_pad = GamePad.GetState(PlayerIndex.One);
if (m_pad.Thumbsticks.Left.X > 0.0f)
if (m_pad.Thumbsticks.Right.Y < 0.0f)
// create GamePadState struct
// retrieve current controller state
// do something if Left joystick pressed to right|
// do something if Right joystick pressed down
• Each thumbstick has X, Y position
►
Ranges from -1.0f to 1.0f
• Left (-1.0f), Right (1.0f), Up (1.0f), Down (-1.0f)
• 0.0f indicates not being pressed at all
►
Represented as a Vector2
• So, have
►
Left.X, Left.Y, Right.X, Right.Y
Joystick Dead Zone
• Joysticks typically have tiny deflection to left/right or
up/down
►
Leads to “drift” if uncompensated
• Dead-zone
►
►
Region around 0.0f that is interpreted as not-moving
Allows joysticks to have a small amount of deflection without
leading to drift
• Three ways to handle this
►
►
►
►
From GamePadDeadZone enumeration
IndependentAxes: X & Y each have separate dead zone (default)
Circular: X & Y combined before processing dead zone
None: No processing, application must determine
GamePadTriggers Struct (Triggers)
GamePadState m_pad;
m_pad = GamePad.GetState(PlayerIndex.One);
if (m_pad.Triggers.Left != 0.0f)
if (m_pad.Triggers.Right >= 0.95f)
// create GamePadState struct
// retrieve current controller state
// do something if Left trigger pressed down|
// do something if Right trigger pressed all the way down
• Each trigger ranges from 0.0f to 1.0f
►
►
►
Not pressed: 0.0f
Fully pressed: 1.0f
Represented as a float
• Have left and right triggers
►
Properties: Left, Right
• Demonstration of XNA Input Reporter utility
►
creators.xna.com/en-US/utilities/inputreporter
Controller Vibration
• Can set the vibration level of the gamepad
►
►
Call SetVibration() on GamePad class
Pass controller number, left vibration, right vibration
• Left motor is low frequency
• Right motor is high-frequency
• Turn vibration full on, both motors
►
GamePad.SetVibration(PlayerIndex.One, 1.0f, 1.0f);
• Turn vibration off, both motors
►
GamePad.SetVibration(PlayerIndex.One, 0f, 0f);
Keyboard Input
• Every clock tick, poll state of keyboard
►
Call GetState() on Keyboard class
• KeyboardState keyState = Keyboard.GetState()
• Keyboard is a static class
►
Check if a specific key is pressed
•
•
•
•
►
if (keyState.IsKeyDown(Keys.keyname)) …
Also, IsKeyUp(Keys.keyname)
Keys is an enumeration of keynames
Provides low-level access to keypress information
– Can determine if right/left Shift key pressed, for example
Also, GetPressedKeys()
• Returns array of keys currently pressed
• If length of array is zero, no keys currently pressed
Mouse Input
• Every clock tick, poll state of the mouse
►
►
►
Call GetState on Mouse class
MouseState mouseState = Mouse.GetState();
Mouse is a static class
• MouseState contains a series of properties
►
►
X, Y : position of mouse (int)
LeftButton, MiddleButton, RightButton, XButton1,
XButton2
• Either Released or Pressed (ButtonState enumeration)
►
ScrollWheelValue (int)
• Scroll wheel represents cumulative change over lifetime of the
game
Wrapper Class
• What if you want to use the controller, if present, and the
keyboard if not?
• Create an input wrapper class
►
►
Checks both controller and keyboard input
Has a series of properties to set/get current direction state
• Example:
►
If controller connected AND controller DPad up arrow pressed
• Set wrapper’s up property to true
►
Else if keyboard Up key pressed
• Set wrapper’s up property to true
►
Else
• Set wrapper’s up property to false
• Rest of application checks input wrapper class up property
Reading
• Read Chapter 3 (User Input and Collision
Detection) in XNA 3.0
• Download and try XNA Input Recorder demo, if
you have an Xbox 360 controller
• Try creating a simple XNA program to collect
keypress input
Was this manual useful for you? yes no
Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Download PDF

advertising