Inledning
Det är nu dags att testa IR funktionen i Nintento Wiis trådlösa handkontroll. Denna artikel bygger på Wii: Förberedelser och Wii: Spaceship .
IR står för infra red och är samma teknik som används när fjärrkontroller skickar sina signaler. Handkontrollen är en slags omvänd fjärrkontroll. Det sitter en IR-läsare i toppen på handkontrollen som kan läsa av IR källor. Genom att sätta ut IR-dioder i närheten av skärmen/TV:n så går det att avläsa om handkontrollen siktas mot skärmen.
Genom att sätta ut minst två IR-källor så går det att avläsa siktet med förvånansvärt bra precision. Detta ska vi använda för att styra ett sikte på skärmen!
IR-källor
Vi rekommenderar att du bygger en liten låda med två IR-dioder och ett batteri som du lätt kan placera i närheten av skärmen. Detta låter lite besvärligt och det går faktiskt att lösa på ett mycket enklare sätt. Värmeljus! Placeras helt enkelt två tända värmeljus i närheten av skärmen med ca 5 till 15 cm mellanrum.
OBS: var försiktig med ljusen så att de inte står på ett sådant sätt att den kan välta eller slås omkull. Glöm inte att släcka dem när du lämnar rummet!
Test
Vi skapar ett XNA projekt och lägger till WiimoteLib precis som i artikel Wii: Spaceship . Vi behöver en textur till siktet samt en X- och en Y-position för siktet. Vi har valt att kalla dessa variabler för aimX och aimY.
Kontrollen och WiimoteLib räknar ut en punkt som ligger mellan de två IR-källorna. Denna punkt beskrivs som ett X- och ett Y-värde. Genom klassen WiimoteState kan vi nå dessa värden via ws.IRState.MidX och ws.IRState.MidY.
Dessa punkter är den beräknade mittpunkten med värden mellan 0.0 till 1.0 på båda axlarna. Står du nära IR-källorna så får du röra kontrollen mera än om du står längre ifrån. Detta kan du även kompensera genom att flytta IR-källorna mer isär.
För att översätta punkten vi får via IR till skärkoordinater så måste vi multiplicera med skärmens pixelbredd och pixelhöjd. I X-led måste vi dock invertera värdet för om vi siktar till vänster så hamnar mittpunkten längre till höger för handkontrollen.
protected override void Update(GameTime gameTime)
{
aimX = 800 - ws.IRState.MidX * 800;
aimY = ws.IRState.MidY * 600;
base.Update(gameTime);
}
Uppritningen är sedan enkel. Vi ritar upp siktet på position aimX och aimY.
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
Vector2 origin = new Vector2(crosshair.Width / 2, crosshair.Height / 2);
spriteBatch.Draw(crosshair, new Vector2((float)aimX, (float)aimY),
null, Color.White, 0, origin, 1, SpriteEffects.None, 0);
spriteBatch.End();
base.Draw(gameTime);
}
Ladda hem och testa exemplet! Med IR kan du göra nästan vilket enkelt spel till ett höjdarspel