SpriteTest 概略
 
 

■ 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 関数を呼び出して接続を受け付けています。