!!!Wii インターネットチャンネル
{{category WebBrowser,JavaScript,nolink}}任天堂 Wii のインターネットチャンネルでの利用できる JavaScript を利用した「Wiiリモコン」の状態の取得など。
インターネットチャンネルは Opera Software 社のインターネットフルブラウザを使用している。組込みデバイス向けブラウザ Opera for Devices でデスクトップ向けブラウザと同じコアエンジンをベースしている。
インターネットチャンネル向けウェブページを作る際のヒントとして、いくつかの情報が、任天堂のWiiのサポート情報にQ&Aとして公開されている。
*インターネットチャンネル向けのウェブページを作りたいのですが…。
**http://www.nintendo.co.jp/wii/q_and_a/093.html
!!インターネットチャンネルかを判断する
!ユーザーエージェントから判断する
インターネットチャンネルのユーザーエージェントは、「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 は使用言語で異なる。
*インターネットチャンネルのユーザーエージェントは? (任天堂 Wii Q&A)
**http://www.nintendo.co.jp/wii/q_and_a/093.html#category01
!!インターネットチャンネルの画面サイズ
画面の表示サイズは、'''window.innerWidth''' と '''window.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
※そう言えば、縦長モードの時は?取れる値は変わらないっぽいけど。
*JavaScriptでウインドウサイズを取得するには? (任天堂 Wii Q&A)
**http://www.nintendo.co.jp/wii/q_and_a/093.html#category03
!!!Wiiリモコンの操作
[サンプルページ|extra/wiiremote.html] <<インターネットチャンネルで見てください>>
!!JavaScriptのキーコード
キーボードのキーを押したときのキーに割り当てられているキーコードでWiiリモコンの押されたボタンを取得する。この方法で取得できるのは、ブラウジング権のあるリモコン(通常は1番目)のみとなる。
*WiiリモコンのJavaScriptのキーコードは? (任天堂 Wii Q&A)
**http://www.nintendo.co.jp/wii/q_and_a/093.html#category05
!キーコード値
キーコード
,押下したボタン ,↑ ,↓ ,→ ,← ,A ,B ,− ,+ ,1 ,2 ,C,Z,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 オブジェクトからリモコンの状態を取得できる。
*インターネットチャンネルの拡張機能について知りたい (任天堂 Wii Q&A)
**http://www.nintendo.co.jp/wii/q_and_a/093.html#category05
*インターネットチャンネルの拡張機能を使ったサンプルページ (任天堂 Wii Q&A)
**http://www.nintendo.co.jp/wii/q_and_a/093_sample.html
!リモコンのオブジェクトを取得する。
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 + " )
";
} else {
mes += "( --- , --- )
";
}
もうひとつ、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 プロパティで取得できる。この値は、各ビットごとボタンが割り当てており、その論理和が返される。
ボタンとビット値
,ボタン ,→,←,↑,↓,+ ,? ,? ,? ,2 ,1 ,B ,A ,− ,Z ,C ,?
,ビット ,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 間でデータを渡せない。
*搭載されているFlashプレーヤーについて知りたい (任天堂 Wii Q&A)
**http://www.nintendo.co.jp/wii/q_and_a/093.html#category02