Difference between revisions of "Game Programming Class5"
(→Input Controller Mongame) |
(→Input Controller Unity) |
||
Line 78: | Line 78: | ||
==Input Controller Unity== | ==Input Controller Unity== | ||
+ | PlayerController from https://iam.colum.edu:8443/!/#GPMonogame3/view/head/trunk/jeffUnity/UnityGameDemos/Assets/Scripts/PacMan/PlayerController.cs | ||
+ | <csharp> | ||
+ | public Vector2 direction = new Vector2(); | ||
+ | private Vector2 keyDirection; | ||
+ | private Vector2 padDirection; | ||
+ | ... | ||
+ | void Update () { | ||
+ | |||
+ | HandleKeyboard(); | ||
+ | |||
+ | HandleGamepad(); | ||
+ | ... | ||
+ | |||
+ | private void HandleGamepad() | ||
+ | { | ||
+ | //Gamepad | ||
+ | padDirection.x = padDirection.y = 0; | ||
+ | //and keyboard unity already sums them together | ||
+ | padDirection.x = Input.GetAxis("Horizontal"); | ||
+ | padDirection.y = Input.GetAxis("Vertical"); | ||
+ | |||
+ | if (padDirection.magnitude > 0) | ||
+ | { | ||
+ | //Debug.Log(padDirection + " " + padDirection.magnitude + " " + (padDirection.magnitude > 0)); | ||
+ | direction += padDirection; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </csharp> | ||
+ | |||
+ | Player.cs from https://iam.colum.edu:8443/!/#GPMonogame3/view/head/trunk/jeffUnity/UnityGameDemos/Assets/Scripts/PacMan/Player.cs | ||
+ | |||
+ | <csharp> | ||
+ | private PlayerController controller; | ||
+ | public Vector2 Direction = new Vector2(1, 0); | ||
+ | ... | ||
+ | void Start() | ||
+ | { | ||
+ | //Get PlayerController from game object | ||
+ | controller = GetComponent<PlayerController>(); | ||
+ | //Log error if controller is null will throw null refernece exception eventually | ||
+ | if (controller == null) | ||
+ | { | ||
+ | Debug.LogWarning("GetComponent of type " + typeof(PlayerController) + " failed on " + this.name, this); | ||
+ | } | ||
+ | ... | ||
+ | |||
+ | // Update is called once per frame | ||
+ | void Update() | ||
+ | { | ||
+ | //Check for input from PlayerController | ||
+ | if (this.controller.hasInputForMoverment) | ||
+ | { | ||
+ | this.Direction = this.controller.direction; //Get Direction from PlayerController | ||
+ | </csharp> | ||
==Advanced Sprites/Collision== | ==Advanced Sprites/Collision== |
Revision as of 03:28, 6 October 2015
Contents
Game Services
Review Game Components
IntroGameLibrary
Turn the console class into a service
Each GameService needs to have a unique interface so that there is an entry in the system types table. The interface allows the game to return the correct type.
- GameConsole.cs
All of these files are available in the IntoGameLibrary Project in the classfolders.
Input Controller Mongame
from project IntroPacManMovementController file PacManController.cs
<csharp> InputHandler input; //game service to handle input public Vector2 Direction {get; private set;} ...
public PacManController(Game game)
{ //get input handler from game services input = (InputHandler)game.Services.GetService<IInputHandler>(); if (input == null) { throw new Exception("PacMan controller depends on InputHandler service please add Input Handler as a service first"); }
...
public void Update() //update accesses InputHandler
{ //Input for update from analog stick GamePadState gamePad1State = input.GamePads[0]; //HACK hard coded player index #region LeftStick Vector2 pacStickDir = Vector2.Zero; if (gamePad1State.ThumbSticks.Left.Length() > 0.0f) { pacStickDir = gamePad1State.ThumbSticks.Left; pacStickDir.Y *= -1; //Invert Y Axis
... </csharp>
The MonoGamePacMan game component then uses the controller
<csharp> internal PacManController controller { get; private set; } ... public MonoGamePacMan(Game game)
: base(game) { this.controller = new PacManController(game); ... }
... public override void Update(GameTime gameTime)
{ //Elapsed time since last update float time = (float)gameTime.ElapsedGameTime.TotalMilliseconds; this.controller.Update();
this.Location += ((this.controller.Direction * (time / 1000)) * Speed); //Simple Move this.Rotate = this.controller.Rotate;
...
</csharp>
Input Controller Unity
PlayerController from https://iam.colum.edu:8443/!/#GPMonogame3/view/head/trunk/jeffUnity/UnityGameDemos/Assets/Scripts/PacMan/PlayerController.cs
<csharp> public Vector2 direction = new Vector2();
private Vector2 keyDirection; private Vector2 padDirection;
... void Update () {
HandleKeyboard();
HandleGamepad();
...
private void HandleGamepad()
{ //Gamepad padDirection.x = padDirection.y = 0; //and keyboard unity already sums them together padDirection.x = Input.GetAxis("Horizontal"); padDirection.y = Input.GetAxis("Vertical");
if (padDirection.magnitude > 0) { //Debug.Log(padDirection + " " + padDirection.magnitude + " " + (padDirection.magnitude > 0)); direction += padDirection; } }
</csharp>
Player.cs from https://iam.colum.edu:8443/!/#GPMonogame3/view/head/trunk/jeffUnity/UnityGameDemos/Assets/Scripts/PacMan/Player.cs
<csharp> private PlayerController controller;
public Vector2 Direction = new Vector2(1, 0);
... void Start()
{ //Get PlayerController from game object controller = GetComponent<PlayerController>(); //Log error if controller is null will throw null refernece exception eventually if (controller == null) { Debug.LogWarning("GetComponent of type " + typeof(PlayerController) + " failed on " + this.name, this); }
...
// Update is called once per frame
void Update() { //Check for input from PlayerController if (this.controller.hasInputForMoverment) { this.Direction = this.controller.direction; //Get Direction from PlayerController
</csharp>
Advanced Sprites/Collision
Simple Collision
Check if two rectangles intersect. By adding a rectangle that represents the area of the sprite it's easy to ask XNA if two rectangles intersect
3 tutorial on App Hub
- http://xbox.create.msdn.com/en-us/education/catalog/tutorial/collision_2d_rectangle
- http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel
- http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed
PerPixelCollision
Load both textures into a color array. Make a rectangle of the intersection of the two textures. Check all the pixels in intersection of the color arrays for intersecting pixels.
The definition for both methods is in the Sprite class (Sprite.cs)
Chase and Evade
Example of simple states and simple vector geometry.
Better example not yet implemented
PacMan Chase and Evade example in repo IntroChaseEvade demostratea
- Collision
- State for feeble AI
- Sprite Markers
Homework
InputControllerMonogame
InputControllerUnity