Inledning
Denna artikel bygger på Wii: Förberedelser och är ett försök att visa hur enkelt det är att integrera WiimoteLib i XNA. Läs artikeln och se till att du kan koppla upp Wii-enheten. Är du inte van vid XNA så bör du även läsa de artiklarna först.
Målet är att kunna kontrollera styrningen av ett litet rymdskepp med Wii-kontrollen.
WiimoteLib
Skapa ett "Windows Game" projekt först.
Har du inte redan WiimoteLib så finns det att ladda hem här.
Kopiera filen WiimoteLib.dll till katalogen \bin\x86\Debug under ditt projekt.
För att kunna använda funktionerna i dll-filen så måste vi lägga till en referens i vårt projekt. Högerklicka på "References" i Solution Explorern och välj "Add Reference...".
Välj fliken "Browse" och bläddra fram filen WiimoteLib.dll.
För att kunna använda WiimoteLib så behöver vi även lägga till namnutrymmet WiimoteLib längst upp i koden.
using WiimoteLib;
Vi behöver nu även två variabler från WiimoteLib-biblioteket. En variabel av typen Wiimote som skapar kopplingen till Wii-kontrollen och en variabel av typen WiimoteState som ska lagra informationen från kontrollen.
namespace WiiSpaceship
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//Nintendo Wii
Wiimote wm;
WiimoteState ws;
//Grafik
Texture2D ship;
double shipX = 320, shipY = 240, shipSpeedX, shipSpeedY;
double angle;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.PreferredBackBufferWidth = 640;
graphics.PreferredBackBufferHeight = 480;
wm = new Wiimote();
//Bind events
wm.WiimoteChanged += new WiimoteChangedEventHandler(wm_OnWiimoteChanged);
wm.WiimoteExtensionChanged +=
new WiimoteExtensionChangedEventHandler(wm_OnWiimoteExtensionChanged);
// koppla upp mot wii-kontrollen
wm.Connect();
// ställ in så att information om IR och acceleration skickas
// annars skiackas bara information om knapparna
wm.SetReportType(Wiimote.InputReport.IRAccel, true);
}
Events
I koden ovan syns det kopplingar till två olika events. WiimoteChanged används för att läsa av kontrollen. WiimoteExtensionChanged används för att hantera om du kopplar in en påbyggnad till kontrollen t.ex. en nunchuck. Koden till dessa events är:
void wm_OnWiimoteExtensionChanged(object sender, WiimoteExtensionChangedEventArgs args)
{
if (args.Inserted)
wm.SetReportType(Wiimote.InputReport.IRExtensionAccel, true);
else
wm.SetReportType(Wiimote.InputReport.IRAccel, true);
}
void wm_OnWiimoteChanged(object sender, WiimoteChangedEventArgs args)
{
// nuvarande information från kontrollen
ws = args.WiimoteState;
}
Avläsning
Nu saknas det bara att vi ska kunna avläsa tillståndet på kontrollen. Det går att avläsa följande:
- Knapparna
- Lutningen på kontrollen
- Accelerationen som kontrollen utsätts för
- Batterinivån
- Utökningar t.ex. nunchuck-kontroll
Du kan även styra följande på kontrollen:
- Skakningar
- Lamporna
I vårt exempel så använder vi lutningen för att styra rymdskeppet, koden för detta blir:
protected override void Update(GameTime gameTime)
{
int ms = gameTime.ElapsedGameTime.Milliseconds;
//Accelerera med Wii ;)
shipSpeedX = ws.AccelState.X;
shipSpeedY = -ws.AccelState.Y;
//Flytta skeppet
shipX += shipSpeedX * ms;
shipY += shipSpeedY * ms;
//Se till att skeppet kommer tillbaka
if (shipX > 700)
shipX = -50;
if (shipX < -50)
shipX = 700;
if (shipY > 550)
shipY = -50;
if (shipY < -50)
shipY = 550;
base.Update(gameTime);
}
Mer information om hur WiimoteLib fungerar finner du i den medfljande hjälpfilen WiimoteLib.chm.