JoyServer - Flash 上でジョイスティックを操作するためのソフト

JoyServer 対応 Flash を作る準備

まず JoyServer をインストールします。

インストールできたら、ActionSciript 3 用の SWC ライブラリをダウンロードして、プログラムの中から JoyServer の機能を呼び出します。

ドキュメント

Flash 側のソースコードの例はこのページの一番下にあります。

動作確認画面

↓ この画面は Flash です。画像ではありません。

JoyClient

Alternative content

Get Adobe Flash player

JoyServer のインストール後、この画面で直接ジョイスティックの動作確認をすることができます。

対応ジョイスティック

アナログの方向キーは -100 から 100 の値で状態を取得できます。
今のところアナログボタンには対応していません。

動作確認済みジョイスティックのリスト

対応環境

JoyServer を動作させる時は、 .NET Framework 2.0 が必要です。
Vista か 7 をお使いの場合は OS 自体に入っていると思います。

動作の詳細

このソフトは、 Windows 上にジョイスティック読み取りサーバを立てて、 Flash 上からソケット接続することでジョイスティックの状態を読み取るような構造になっています。サーバは localhost からの接続のみ受け付けるようになっているので、外部から接続される心配はありません。

クラス間の繋がり


(↑ 厳密に書くとちょっと構造が違うんですが、大体こんなイメージです。クリックで拡大します。)

JoyServer・JoyClient のソースコード

ジョイスティック対応 Flash の開発はソースコード無しでもできますが、より詳しく動作内容を確認したい方はダウンロードしてみてください。

ソースコードは Google Code に置いてあります。

Downloads のページに一覧があるので見てみてください。

サーバ側・クライアント側の両方のソースコードを MIT ライセンスで公開します。

The MIT License

Copyright (c) 2009 hikipuro

以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。

上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。

ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。ここでいう保証とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるものではありません。作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。

Flash 側のソースコード例

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import joystick.events.JoyClientEvent;
	import joystick.JoyClient;
	import joystick.JoystickState;
	
	/**
	 * JoyServer への接続テスト
	 */
	public class Main extends Sprite 
	{
		/**
		 * ジョイスティック読み取りクライアント
		 */
		private var joyClient:JoyClient;
		
		/**
		 * ジョイスティックの状態
		 */
		private var joystickState:JoystickState;
		
		/**
		 * 状態表示用テキストフィールド
		 */
		private var textField:TextField;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化メソッド
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// ジョイスティック読み取りクライアントを準備
			joyClient = new JoyClient();
			
			// true にすると詳細なメッセージがデバッグ画面に出ます。
			joyClient.debug = true;
			
			// ジョイスティッククライアントのイベントハンドラ登録
			joyClient.addEventListener(JoyClientEvent.CONNECTED, onJoyClientConnected);
			joyClient.addEventListener(JoyClientEvent.IO_ERROR, onJoyClientError);
			joyClient.addEventListener(JoyClientEvent.SECURITY_ERROR, onJoyClientError);
			joyClient.addEventListener(JoyClientEvent.PACKET_RECEIVED, onJoyClientReceive);
			
			// 接続開始
			joyClient.connect();
			
			// 状態表示用テキストフィールドの準備
			textField = new TextField();
			textField.autoSize = TextFieldAutoSize.LEFT;
			textField.x = 10;
			textField.y = 10;
			addChild(textField);
			
			// Main のイベントハンドラ登録
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		/**
		 * 接続完了時
		 * @param	e
		 */
		private function onJoyClientConnected(e:JoyClientEvent):void 
		{
			trace("接続完了");
		}
		
		/**
		 * 接続エラー時
		 * @param	e
		 */
		private function onJoyClientError(e:JoyClientEvent):void 
		{
			trace("接続エラー");
		}
		
		/**
		 * ジョイスティックの状態データ読み取り完了時のイベント
		 * @param	e
		 */
		private function onJoyClientReceive(e:JoyClientEvent):void 
		{
			// イベントオブジェクトの中からジョイスティックデータを取り出す
			joystickState = e.state;
		}
		
		/**
		 * フレーム開始イベント
		 * 毎フレーム呼び出される。
		 * @param	e
		 */
		private function onEnterFrame(e:Event):void 
		{
			// ジョイスティック番号 0 のデータを取得する
			// データ取得完了時、 PACKET_RECEIVED イベントで通知される。
			joyClient.getState(0);
			
			// ジョイスティックの状態が入っている時
			if (joystickState != null)
			{
				textField.text = "";
				textField.appendText("ボタン 0 が押された: ");
				textField.appendText("" + joystickState.isDown(0));
				textField.appendText("\n");
				
				textField.appendText("ボタン 0 が押され続けている: ");
				textField.appendText("" + joystickState.isHeld(0));
				textField.appendText("\n");
				
				textField.appendText("ボタン 0 が離された: ");
				textField.appendText("" + joystickState.isUp(0));
				textField.appendText("\n");
				
				textField.appendText("\n");
				textField.appendText("方向キーの上が押されている: ");
				textField.appendText("" + joystickState.up);
				textField.appendText("\n");
				
				textField.appendText("方向キーの上下の値: ");
				textField.appendText("" + joystickState.y);
				textField.appendText("\n");
			}
		}
		
	}
	
}		

製作環境

Visual C# 2008 Express Edition
DirectX SDK (Managed DirectX)
FlashDevelop
Flex SDK Ver.3.3.0.4852

作る時にお世話になったサイト