■ SpriteTest 概略
スプライト機能のサンプルプログラムです。
メニューの「操作対象」で操作するオブジェクトを選択することが出来ます。
マウスをウィンドウ上でドラッグすると、オブジェクトを移動することが出来ます。「操作モード」で移動か変形(回転)かを選択することが出来ます。
シフトキーを押しながらドラッグすると「操作モード」を反転することが出来ます。
メニューの「ファイル>接続」で SpriteTest を起動している LAN 上の別のコンピュータ名(又はインターネット上の IP アドレス)を指定すると P2P 通信機能を利用して、オブジェクト操作の同期を取ることが出来ます。
■ スプライト機能
スプライトは ESprite クラスでそのインターフェースが定義されています。
スプライトは表示イメージに対する、「外接矩形」、「描画」、「更新通知」のインターフェースを有しており、これらインターフェースから、例えば、画像スプライトの表示座標を変更すると、自動的に画面が更新されると言った機能を実現しています。
表示の更新の際には、更新通知関数から更新矩形が親スプライトに通知され、この時の情報を保持しておき、実際に再描画するときに必要な領域をまとめて描画します。スプライト機能を使った典型的なプログラミングスタイルは EWindowInterface クラスと ESpriteServer クラスを多重派生させることですが、ここでは EWindow クラスと ESpriteServer クラスから派生させています。(詳細は EGL リファレンスマニュアルを参照してください)
この派生クラスでの注目点は、WM_PAINT メッセージの処理と、UpdateRect 関数のオーバーライドです。詳細は EGL リファレンスマニュアルとソースを参照してください。
■ 通信機能
SpriteTest では P2P 通信によってスプライトの操作を2つ以上のコンピュータで同期させることが出来ます。
この P2P 通信には EGctpConnection クラスを使用しています。
このクラスでは、任意の引数を伴うコマンドを送受信する機能が実装されています。コマンドは EDescription オブジェクトで輸送されます。ここで1つ、他のコンピュータからの接続を受け付けるために派生させたソケットクラス EAcceptSocket の OnAccept 関数を見てください。
void EAcceptSocket::OnAccept( int nErrorCode )
{
g_wndMain->PostMessage( ESpriteWindow::wmSocketAccept, 0, 0 ) ;
}ここでは、直接受付の処理を行わずにメインウィンドウへメッセージを送信しています。
この関数は、通信を行うための専用スレッドから呼び出されるので、むやみにこの関数内で処理を行おうとすると、メインスレッドとの同期画うまく取れません。そこで、メインスレッドから接続の受付のための処理を行うためにメッセージを送っています。void ESpriteWindow::OnSocketAccept( void )
{
EGctpConnection * pSocket = new EGctpConnection ;
if ( !m_AcceptSocket.Accept( *pSocket ) )
{
Lock( ) ;
m_listClient.Add( pSocket ) ;
//
for ( int i = 0; i < otMax; i ++ )
{
OperateObject( "initialize", m_pszType[i], 0, 0 ) ;
}
Unlock( ) ;
}
else
{
delete pSocket ;
}
}ESpriteWindow::OnSocketAccept 関数は OnAccept 関数が送ったメッセージを受け取った場合に呼び出されます。
ここでは、Accept 関数を呼び出して接続を受け付けています。