トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

Script/WiiJavaScript

INDEX

Wii インターネットチャンネル

任天堂 Wii のインターネットチャンネルでの利用できる JavaScript を利用した「Wiiリモコン」の状態の取得など。

インターネットチャンネルは Opera Software 社のインターネットフルブラウザを使用している。組込みデバイス向けブラウザ Opera for Devices でデスクトップ向けブラウザと同じコアエンジンをベースしている。

インターネットチャンネル向けウェブページを作る際のヒントとして、いくつかの情報が、任天堂のWiiのサポート情報にQ&Aとして公開されている。

 インターネットチャンネルかを判断する

ユーザーエージェントから判断する

インターネットチャンネルのユーザーエージェントは、「Opera/9.30 (Nintendo Wii; U; ; 2047-7; ja)」の用になっています。なので、Nintendo Wii が含まれているかで Wii かを判断できる。

// Wii インターネットブラウザか
function isWiiOperaBrowser() {
    return (navigator.userAgent.toLowerCase().indexOf("nintendo wii") >= 0);
}

wiiremote オブジェクトの有無で判断する

インターネットチャンネルの拡張機能として window.opera.wiiremote と言うオブジェクトが用意されています。Wii のみしかこのオブジェクトはないため、この有無で Wii かを判断できる。

// Wii インターネットブラウザか
function isWiiOperaBrowser() {
    return (window.opera && window.opera.wiiremote);
}

 インターネットチャンネルのユーザーエージェント

他のブラウザと同様に navigator.userAgent でユーザーエージェントが取得できる。

例:
ダウンロードした時 言語 navigator.userAgent
2007年10月 9日以前 英語 Opera/9.10 (Nintendo Wii; U; ; 1621; en)
2007年10月10日以降 日本 Opera/9.30 (Nintendo Wii; U; ; 2047-7; ja)
※2047-7 や 1621 はダウンロードしたとき、ja や en は使用言語で異なる。

 インターネットチャンネルの画面サイズ

画面の表示サイズは、window.innerWidthwindow.innerHeight で取得できる。取得できる値は、横幅は 800px 固定だが、縦幅は画面範囲とツールバー表示の設定 および ワイド設定で異なる。

最も広い 10 に設定した場合 600px となり、最も狭い 0 に設定した場合 660px となる(画面比 4:3、ツールバー手動)。

ウインドウの縦幅
ワイド設定 ツールバー設定 0 1 2 3 4 5 6 7 8 9 10
4:3 常に表示 560 556 548 544 536 528 524 520 512 508 500
4:3 自動/手動 660 656 648 644 636 628 624 620 612 608 600
16:9 常に表示 420 416 412 408 400 396 392 388 384 380 376
16:9 自動/手動 496 492 488 484 476 472 468 464 460 456 452
※そう言えば、縦長モードの時は?取れる値は変わらないっぽいけど。

Wiiリモコンの操作

サンプルページ インターネットチャンネルで見てください

 JavaScriptのキーコード

キーボードのキーを押したときのキーに割り当てられているキーコードでWiiリモコンの押されたボタンを取得する。この方法で取得できるのは、ブラウジング権のあるリモコン(通常は1番目)のみとなる。

キーコード値

キーコード
押下したボタン HOME
event.keyCode 175 176 177 178 (13) (171) 170 174 172 173 -- -- ----

ちなみに、Aボタンを押したときのキーコード 13 は、エンターキーと同じキーコードになる。USBキーボードを繋いでいるときは、キーボードのキーコードも取得できる。よって、Aボタンとエンターキーと判断できない。

※注:9.30版から、AボタンとBボタンは取れなくなった。Bボタンに関しては、拡張機能で取得できる。

※ヌンチャクの C, Z のキーコードが分からん。取れない?

キーイベントのキャンセル

document.onkeypress メソッドを自作の関数に変更して、KeyPress イベントフックしイベントをキャンセルすれば、ブラウザでの動きをキャンセルできる。

たとえば、2ボタンによる、画面モードの切り替えを無効化するには

function fnOnKeyPress(e) {
    // 2ボタンによる、画面モードの切り替えを無効化する
    return !(event.keyCode == 173);
}
// KeyPress イベントフック
document.onkeypress = fnOnKeyPress;

 拡張機能 window.opera.wiiremote オブジェクト

インターネットチャンネルの拡張機能の window.opera.wiiremote オブジェクトからリモコンの状態を取得できる。

リモコンのオブジェクトを取得する。

update プロパティを利用して、各リモコンのオブジェクトを取得できる。引数には、0 (1本目) から 3 (4本目) まで、いずれかの値を指定する。

var pad = window.opera.wiiremote.update(i);

リモコンの接続状態を判断する

それぞれのリモコンが接続されているかは isEnabled プロパティ、および isDataValid プロパティで判断できる。

それぞれは isEnabled は、接続されているか。isDataValid は取得できるデータが有効か。

if (pad.isEnabled && pad.isDataValid) {
    // 接続
} else {
    // 未接続
}

ポインタの位置

リモコンを画面に向けたときに表示されるポインタの位置は dpdX と dpdY プロパティで取得できる。取得できる値は、画面中心を0とした、-1 から +1 までの値(右下がプラス方向)となる。

mes += "位置 ";
if (pad.dpdValidity > 0) {
    var x = Math.round(pad.dpdX * 100) / 100;
    var y = Math.round(pad.dpdY * 100) / 100;
    mes += "( " + x + " , " + y + " )<br>";
} else {
    mes += "( --- , --- )<br>";
}

もうひとつ、dpdValidity プロパティがあり、ポインティング位置を認識するために利用できたオブジェクト(センサーバーの赤外線のマーク数)が取得できる。通常は、1もしくは2となり、0の場合は無効を意味する。また、マイナス値の場合は、認識結果が信用できないことを示す。

ポインタの傾き

リモコンを画面に向けたときに表示されるポインタの傾きは dpdRollX と dpdRollY プロパティで取得できる。取得できる値は、長さ1の方向ベクトルになる。

// 傾きのラジアンを取得
var rad = Math.atan2(pad.dpdRollY, pad.dpdRollX);
// ラジアンを度数に変換
var deg = Math.round((rad * 180 / Math.PI)*100)/100;

ポインタの距離

リモコンを画面に向けたときの画面とリモコンの距離は dpdDistance プロパティで取得できる。取得できる値の単位はメートルとなる(たぶん)。

リモコンの押下されたボタン

どのボタンを押下しているかは、hold プロパティで取得できる。この値は、各ビットごとボタンが割り当てており、その論理和が返される。

ボタンとビット値
ボタン
ビット 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
※ただし、ブラウジング権があるリモコンについては、9.10版はすべて取得できず、9.30版はBボタンのみ取得できる。

リモコンのブラウジング権

実際にブラウザを操作できるのは、ブラウジング権を持っているリモコンのみである。それ以外は、ポインタは(薄い色で)表示されるがクリックなどは出来ない。ブラウジング権を持っているかは isBrowsing プロパティで取得できる。

Wiiインターネットチャンネル向け Flash

インターネットチャンネルの Flash Player は、「Flash Lite 3.1」(Flash 8 相当)。

ActionScript は、Flash Lite 3.1 が対応する ActionScript 2.0 が使える。3.0 は非対応。

Flash による動画/音声の再生は、ビデオコーデックが Sorenson と On2 VP6 の一部に対応し、H.264 は非対応となる。ストリーミングが前提のためバッファの容量の関係ですべて読み込む場合に期待通りに動かない可能性がある。また、途中から再生するためにはサーバが HTTP の Range request に対応している必要がある。

ちなみに、9.10版は「Flash 7」。ポインタの状態は、Flash Player 7 だと ExternalInterface つかえないので、直接JS-SWF 間でデータを渡せない。

最終更新時間:2010年02月06日 20時31分31秒 指摘や意見などあればSandBoxのBBSへ。