(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を押している間は 大きめの値、 押してない時は 小さめの値が
移動時の移動量として適用されます