(Wii)(Wiiリモコン)(ヌンチャク)(Bluetooth)(GlovePIE)

/////////////////////////////////////////////////////////////////////////////////
//  Bluetooth用の USBアダプタを買ってきたので
//  お試しに GlovePIE で Wiiリモコン + ヌンチャク を使って
//  マウス操作をしてみるスクリプト を 一夜漬けで書いてみた 笑)
/////////////////////////////////////////////////////////////////////////////////
//
//  「B」ボタンを 押していない時だけ
//  センサーバーを使って マウスカーソルを移動できます
//  また「Home」ボタンを押す(500ms以内に押すのを止めてください)と
//  「B」ボタンを 押している押していない の 判定が反転します
//  もう一度押すと 元に戻ります
//
//  「B」ボタンを 押していない時 (Bボタン判定反転時は逆になります)
//  「ヌンチャクのスティック」の上下で
//  マウスホイールの上下の操作が出来ます
//
//  センサーバーによる位置 と マウスカーソル位置を 絶対座標で対応させるのではなく
//  センサーバーでの移動量を マウスカーソルの現在位置に適用させるもので
//  タブレットにおける 相対座標モード に近い感じの操作感になります
//
//  「B」ボタンを押した時は  (Bボタン判定反転時は逆になります)
//  「ヌンチャクのスティック」でマウスカーソルを操作できます
//  また「C」ボタンを押しながら操作する事で 高速移動モードになります
//
//  ダイナミックに動かしたい時は センサーバーで
//  直線的にすばやく動かしたい時は スティック操作の 高速移動モードで
//  微調整をしたい時は スティック操作の 低速移動モードで操作すると
//  やりやすいかもしれません
//
//  「A」ボタンが マウスの左ボタンに相当します
//  「+」ボタンが マウスの右ボタンに相当します
//
//  「十字キー」 の 上下左右 が キーボード の ↑↓←→ に相当します
//
//  「1」「2」ボタンが
//  マウスホイールの(上)(下) に相当します
//
//  「−」ボタンが Altキー、「Z」ボタンが Tabキーに相当します
//  「−」を押しながら「Z」を押すことで Alt+Tab の操作をすることが出来ます
/////////////////////////////////////////////////////////////////////////////////

// スクリプト実行時にLED1を光らせます、単なる気持ちの問題です 笑)
Wiimote.LED1 = true;

// センサーバーでカーソルを動かす時の速度
// 各自の環境に合わせて設定してください
// 1500〜2500位の値をセットすると丁度いいかも?
var.Speed = 2000;

// ヌンチャクのアナログスティックでカーソルを動かす時の
// カーソルの移動速度を ドット単位で設定します
if Nunchuk.C {
   // 高速移動モード
   var.NunSpeed = 16;
}else{
   // 低速移動モード (通常)
   var.NunSpeed = 2;
}

// Bを放している時に動くモードか
// 押している時に動くモードかフラグを切り替えてます
if Wiimote.Home {
   var.IsOn_B_Move = (var.IsOn_B_Move = False)
   Wait 500ms
}

// ボタンのアサインをしてます
Mouse.LeftButton = Wiimote.A;
Mouse.RightButton = Wiimote.Plus;
Mouse.WheelUp =  Wiimote.One;
Mouse.WheelDown = Wiimote.Two;
Keyboard.Up = Wiimote.Up;
Keyboard.Down = Wiimote.Down;
Keyboard.Left = Wiimote.Left;
Keyboard.Right = Wiimote.Right;
Alt = Wiimote.Minus;
Tab = Nunchuk.Z;

// マウスカーソルを移動させる処理をしてます
var.VectorX = Wiimote.PointerX*var.Speed - var.LastPointX;
var.VectorY = Wiimote.PointerY*var.Speed - var.LastPointY;
var.LastPointX = Wiimote.PointerX*var.Speed;
var.LastPointY = Wiimote.PointerY*var.Speed;
if (Wiimote.B = var.IsOn_B_Move) {
   Mouse.CursorPosX += var.VectorX;
   Mouse.CursorPosY += var.VectorY;
   if Nunchuk.JoyY < -50% {
      Mouse.WheelUp = true;
      Wait 100ms
   }else{
      if Nunchuk.JoyY > 50% {
         Mouse.WheelDown = true;
         Wait 100ms
      }
   }
}else{
   if Nunchuk.JoyX < -50% {
      Mouse.CursorPosX -= var.NunSpeed;
   }
   if Nunchuk.JoyX > 50% {
      Mouse.CursorPosX += var.NunSpeed;
   }
   if Nunchuk.JoyY < -50% {
      Mouse.CursorPosY -= var.NunSpeed;
   }
   if Nunchuk.JoyY > 50% {
      Mouse.CursorPosY += var.NunSpeed;
   }
}
 まぁ かなりやっつけなので まだまだ 改善の余地はありそうですが
とりあえず 技術的な解説です

 var.Speed の 値は
便宜上 「センサーバーでカーソルを動かす時の速度」として 書いてますが
実際には センサーバーの位置情報(Wiimote.PointerX) が
センサーバーの左端(上端)が 0、 右端(下端)が 1 を指すので
その値に var.Speedを掛けています
var.Speedの値が大きいと センサーバーで同じ移動量であっても
結果的には 前回との位置情報の差分が大きくなるので
マウスカーソルの移動量も 増えるという仕組みです
移動量 は 今回の値との差分を取得しているという単純なものです

 var.NunSpeed の値は
スティックを倒した時の マウスカーソルの移動速度です
var.Speedとは違い 単純に ドット単位です
Cを押している間は 大きめの値、 押してない時は 小さめの値が
移動時の移動量として適用されます