Blocco-deli にも同じ記事を書いてます。
9/22 に行われました「お月見Flash」にでの講演内容と解説です。
Wii リモコンと Adobe Flash の連携方法を紹介します。
[講演動画]
[youtube=http://www.youtube.com/watch?v=qn4Z7SwnBLI]
[ポイント]
基本的には1台のマシンの中で動作します。
WiiリモコンはBluetoothでコンピュータに接続できます。
RubyでWiiリモコンのデータを受信し、XML_Socket通信を用いてFlashと繋がります。
RubyからFlashへの一方通行な通信です。
[システム概要図]
まず、今回の開発・動作環境について。
[OS]
[使用ソフトウェア]
- Flash CS3(ActionScript2.0)
- ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
- WiiRemote Framework
- RubyCococa 0.12.0
- perl 5.8.6 または Java (こちらはソケットサーバになります)
Ruby から RubyCocoa を呼び出し、WiiRemote Framework を使用します。
ソケットサーバは前回の「空中タロット」でも出てきているので省略します。
# webや書籍に載っている受信したメッセージを全クライアントに返すサーバです。
[準備段階]
Xcode を事前にインストールしておきましょう。
Ruby は Mac OSX に始めから入ってるものを使う場合はそのまま使用できます。
しかし、MacPorts や自分で make する場合は注意が必要で "--enable-shared" オプションをつけて make する必要があります。
DarwiinRemote から WiiRemoteFramework をダウンロードします。
http://sourceforge.net/projects/darwiin-remote/
WiiRemoteFramework を Xcode で Build します。
build/Release/WiiRemote.Frameworks を /Library/Frameworks/ 以下に置く。
RubyCocoa をインストールします。
http://rubycocoa.sourceforge.net/HomePage
BridgeSupport のインストール
http://trac.macosforge.org/projects/BridgeSupport
これは、各フレームワークと RubyCocoa の架け橋になります。
$ svn co http://svn.macosforge.org/repository/bridgesupport/trunk BridgeSupport
$ cd BridgeSupport
$ make
$ sudo make install
exceptions/ 以下にそれぞれのフレームワーク名の xml ファイルが生成されている。
これを /Library/BridgeSupport/ 以下に設置。
# /Library/BridgeSupport/ は mkdir で事前に生成しておく必要があります。
WiiRemote.Framework の ブリッジを作成
$ ruby gen_bridge_metadata.rb -f WiiRemote -F exceptions
> exceptions/WiiRemote.xml
WiiRemote.xml も同様に /Library/BridgeSupport/ 以下に設置します。
[Ruby]
urekatのスカンク日記3 RubyとWiiリモコンをつなぐ
を参考にWiiリモコンとの接続部分を作成(wii.rb)し、XML_Socket通信部分を実装しました。
require "socket" # Socket通信ライブラリ
require "wii.rb" # RubyとWiiリモコンをつなぐ
server = "localhost"
port = 16000
SOCKET = TCPSocket.open(server, port)
def send_socket(msg)
SOCKET.write(msg + "¥0")
p SOCKET.recv(100) # 確認のため表示
SOCKET.flush
end
XML_Socket通信
<wii_socket x="-13" ... x方向の傾き値
y="9" ... y方向の傾き値
z="2" ... z方向の傾き値
/>
XM_LSocketで送受信されるXMLの内容
[ActionScript]
mySocket = new XMLSocket();
mySocket.onXML = wii_rotate;
mySocket.connect("localhost","16000");
----
function wii_rotate(wii_socket){
_root.frog_mc.hit_a._y = _root.frog_mc.hit_b._y
+ wii_socket.firstChild.attributes.y * 10;
if (wii_socket.firstChild.attributes.y > 9){
trace(_root.frog_mc.splashCount += 1);
}else{
_root.frog_mc.splashCount = 0;
}
if (_root.frog_mc.splashCount > 100) {
_root.frog_mc.splashCount = 0;
_root.randomgrow();
// ある一定時間傾き続けると、ビアサーバからひまわりが咲きます。
}
}
XML_Socket受信ハンドラ