Wii: Spaceship

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.

bild

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...".

bild

Välj fliken "Browse" och bläddra fram filen WiimoteLib.dll.

bild

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.

Exempel: WiimoteLib

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:

Exempel: Events

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:

Exempel: Update

        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.

Lämna ett svar

Din e-postadress kommer inte publiceras.

Scroll to top