KOSAKA LABORATORY->Tips

ヌンチャクを使う

ヌンチャクを使ったプログラミングを行っていきます。ヌンチャクにはWiiリモコンと同じく3軸加速度センサ、Cボタン、Zボタン、3Dスティックが内蔵されています。


1.フォームの作成

フォームの作成 フォームにラベルを6つ、ピクチャーボックスを1つ貼り付けてください。

ピクチャーボックスのサイズは255,255とします。

2.ヌンチャクデモプログラム
Form1.csに以下のプログラムを貼り付けます。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WiimoteLib;    //WimoteLib

namespace WiimoteLib_Sample
{
    public partial class Form1 : Form
    {

        Wiimote wm = new Wiimote();       //Wiimoteの宣言

        public Form1()
        {

            InitializeComponent();

            //他スレッドからのコントロール呼び出し許可
            Control.CheckForIllegalCrossThreadCalls = false;

            this.label6.Text = "ヌンチャク未接続";

            //イベント関数の登録
            wm.WiimoteChanged += wm_WiimoteChanged;

            //拡張コネクタの接続イベントの登録
            wm.WiimoteExtensionChanged += wm_WiimoteExtensionChanged;

            //Wiimoteの接続
            wm.Connect();
        }

        void wm_WiimoteExtensionChanged(object sender, WiimoteExtensionChangedEventArgs args)
        {

            if (args.ExtensionType == ExtensionType.Nunchuk)
            {
                this.label6.Text = "ヌンチャク接続";
            }
            else if (args.ExtensionType == ExtensionType.None)
            {
                this.label6.Text = "ヌンチャク未接続";
            }
        }

        //Wiiリモコンの値が変化したときに呼ばれる関数
        void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs args)
        {
            WiimoteState ws = args.WiimoteState;    //WiimoteStateの値を取得

            //ヌンチャク接続中であれば
            if (ws.ExtensionType == ExtensionType.Nunchuk)
            {
                Graphics g = this.pictureBox1.CreateGraphics(); //pictureBox1のグラフィックスを取得
                g.Clear(Color.Black);     //画面を黒色にクリア

                //ピクチャーボックスへアナログスティックの描画
                float x = ws.NunchukState.RawJoystick.X;        //X座標
                float y = 256 - ws.NunchukState.RawJoystick.Y;  //Y座標

                //赤色でマーカを描写
                g.FillEllipse(Brushes.Red, x, y, 10, 10);

                g.Dispose();  //グラフィックスを開放

                //加速度
                this.label1.Text = "X軸:" + (ws.NunchukState.AccelState.Values.X.ToString("0.0") ); //加速度 X
                this.label2.Text = "Y軸:" + (ws.NunchukState.AccelState.Values.Y.ToString("0.0") ); //加速度 Y
                this.label3.Text = "Z軸:" + (ws.NunchukState.AccelState.Values.Z.ToString("0.0")); //加速度 Z

                //Cボタン
                if (ws.NunchukState.C == true)
                {
                    this.label4.Text = "Cボタン:オン";
                }
                else
                {
                    this.label4.Text = "Cボタン:オフ";
                }

                //Zボタン
                if (ws.NunchukState.Z == true)
                {
                    this.label5.Text = "Zボタン:オン";
                }
                else
                {
                    this.label5.Text = "Zボタン:オフ";
                }
            }
        }
    }
}
3.実行

1.ヌンチャクを接続したWiiリモコンをPCに接続してください
2.F5を押して実行してください

3.ヌンチャクを振り回すことで、加速度が変化します
4.スティックを動かすことで、ピクチャーボックスの赤い点が移動します
5.ボタンを押すことで、ラベルの文字が変わります
6.ヌンチャクをWiiリモコンから抜き差しすることで、接続・未接続が切り替わります。

4.解説

ヌンチャクの各状態をラベル、ピクチャーボックスに表示しています。

wm.WiimoteExtensionChanged += wm_WiimoteExtensionChanged;

ヌンチャクを繋いだ時や、抜いたときに発生するイベントを登録します


ws.NunchukState.RawJoystick.X
ws.NunchukState.RawJoystick.Y

スティックの傾きを30~230の間で出力します。本来ならばNunchukState.Joystick.X,.Yを使うべきですが、今回使用したWiimoteLibVer1.7では値が常に0になるバグ(?)があるようなのでRawJoystickを使用しています。

ws.NunchukState.AccelState.Values.X
ws.NunchukState.AccelState.Values.Y
ws.NunchukState.AccelState.Values.Z

ヌンチャクの加速度センサの値を約-3.0~+3.0の間で出力します。

ws.NunchukState.C
ws.NunchukState.Z

C、Zボタンが押されていればtrue、押されていなければfalseを返します。