Hola!
Hoy empiezo por el final, primero el video con el output
Luego un poco de explicación sobre como montar esto. He partido sobre la base de mi post sobre cómo controlar con C# un mando de XBoxOne. Luego con un poco de código para controlar el lanza missiles, he llegado a conectar ambos dispositivos.
La solución completa incluye 3 proyectos, donde el 1ro se encarga de controlar el Rocket Launcher, luego la app WPF para coordinar las señales del mando y el lanza missiles. Por ultimo tengo un PCL que se encarga de traducir los valores Int32 del mando en comandos más basicos del tipo: up, down, left or right.
En realidad el trabajo no ha sido muy complicado, lo único que tuve que tener en cuenta es los valores que envía el controller. Despues de ver que el GamePad se mueve en el rango de un Int32, lo mejor fue definir los valores de LeftFar > Left > Center > Right > RightFar, con los valores entre -20000 > -10000 > 0 > 10000 > 20000. De esta forma una clase MoveControler me ayudaba a traducir la posición del joystick del mando en estos valores.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static MoveDirections CalculateDirectionY(float y, int yCoeficient) | |
{ | |
var locationY = MoveDirections.DownFar; | |
var currentLocationY = y * yCoeficient; | |
if (currentLocationY > 20000) | |
{ | |
locationY = MoveDirections.UpFar; | |
} | |
else if (currentLocationY > 10000) | |
{ | |
locationY = MoveDirections.Up; | |
} | |
else if (currentLocationY > -10000) | |
{ | |
locationY = MoveDirections.Center; | |
} | |
else if (currentLocationY > -20000) | |
{ | |
locationY = MoveDirections.Down; | |
} | |
return locationY; | |
} |
El ejemplo es bastante simple, ya que utilizo las classes que he creado en posts anteriores para controlar el lanza misiles. Por ejemplo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private void ProcessMovements(MoveDirection moveDirection, bool fire) | |
{ | |
switch (moveDirection.CombinedXy) | |
{ | |
case MoveDirections.Center: | |
_rocket.StopMovements(); | |
break; | |
case MoveDirections.Left: | |
case MoveDirections.LeftFar: | |
_rocket.MoveLeft(); | |
break; | |
case MoveDirections.Right: | |
case MoveDirections.RightFar: | |
_rocket.MoveRight(); | |
break; | |
case MoveDirections.Up: | |
case MoveDirections.UpFar: | |
_rocket.MoveUp(); | |
break; | |
case MoveDirections.Down: | |
case MoveDirections.DownFar: | |
_rocket.MoveDown(); | |
break; | |
default: | |
_rocket.StopMovements(); | |
break; | |
} | |
if (fire) | |
{ | |
_rocket.FireOnce(); | |
} | |
MovementText = string.Format("direction: {0} – fire:{1}", moveDirection.CombinedXy, fire); | |
} |
En este ejemplo he dejado fuera las “esquinas”, tengo que actualizar la clase RocketController para que soporte esto de forma elegante
Por cierto, el código completo se puede descargar desde aqui: http://1drv.ms/1pQDQQx
Importante: he eliminado los packages NuGet para que el código no sea muy pesado, por favor descarga los mismos nuevamente para poder compilar la solución.
References
https://elbruno.com/2014/06/27/coding4fun-xboxone-game-controller-c-fun-time/
Saludos @ Home
El Bruno
![]() |
![]() |
![]() |