7.4. 基本機能 - ブラウズマッチメイク

ブラウズマッチメイクについて説明します。

セッションの離脱処理については7.8. 基本機能 - セッション離脱を参照してください。

セッションの構築

自分がホストとして新たなセッションを構築する場合の処理です。セッションの構築処理は非同期処理です。CreateSessionAsync() を呼び出すことで非同期処理が開始され、 IsCreateSessionCompleted() によって非同期処理の終了を検知できます。セッションの構築処理に成功すると GetCreateSessionResult() は IsSuccess() が真となる Result 値を返します。

設定できるセッションの属性値のインデックスは 0-5 です。

インターネットマッチメイクの場合は、nn::pia::inet::NexCreateSessionSetting で作成するセッションの設定を行います。

LAN マッチメイクの場合は、nn::pia::lan::LanCreateSessionSetting で作成するセッションの設定を行います。

ローカルマッチメイクの場合は、nn::pia::local::UdsCreateSessionSetting で作成するセッションの設定を行います。

コード 7-5. セッションの構築

 

// 作成するセッションの設定
if (networkType == Internet)
{
    nn::pia::inet::NexCreateSessionSetting createSessionSetting;
    createSessionSetting.SetGameMode(SessionGameMode); // ゲームモード
    createSessionSetting.SetMaxParticipantNum(MaxEntry); // 最大参加人数
    createSessionSetting.SetAttribute(SessionAttributeIndex, SessionAttributeValue); // セッションの属性値
    createSessionSetting.SetOpenSession(true); // 作成されてすぐに参加可能状態にします。
    createSessionSetting.SetSessionType(nn::pia::inet::SessionType_Anybody); // 誰でも参加可能なセッションタイプに設定
    createSessionSetting.SetSessionMatchmakeKeyword(MatchmakeKeywordString); // あいことば

    // アプリケーション定義データを設定できます
    for (uint32_t i = 0; i < ApplicationDataBufferSize; i++)
    {
        g_applicationDataBuffer[i] = i;
    }
    createSessionSetting.SetApplicationData(g_applicationDataBuffer, sizeof(g_applicationDataBuffer));
}
else if (networkType == Local)
{
    nn::pia::local::UdsCreateSessionSetting createSessionSetting;
    createSessionSetting.SetMaxParticipantNum(MaxEntry); // 最大参加人数
    createSessionSetting.SetLocalCommunicationId(nn::pia::local::LocalNetwork::GetInstance()->CreateLocalCommunicationId(UdsTitleId)); // ローカル通信 ID
    createSessionSetting.SetSubId(UdsSubId); // 通信モード識別用 ID
    createSessionSetting.SetChannel(0); // 通信に使用するチャンネル(製品実機で実行した場合は常に自動で選択します)
    result = createSessionSetting.SetWirelessCryptoKey(WirelessCryptoKey, WirelessCryptoKeySize); // 無線レイヤの暗号化に使用する暗号鍵とそのサイズ
    PIA_ASSERT(result.IsSuccess());
    result = createSessionSetting.SetApplicationData(g_applicationDataBuffer, sizeof(g_applicationDataBuffer)); // ビーコンに設定するアプリケーション定義データとそのサイズ
    PIA_ASSERT(result.IsSuccess());
}

// セッションの構築処理(非同期処理の開始)
result = nn::pia::session::Session::GetInstance()->CreateSessionAsync(&createSessionSetting);
if (result.IsFailure())
{
    // エラー処理
}

// 非同期処理の開始に成功した場合、ディスパッチ関数を定期的に呼び出して非同期処理の進行を待つ必要があります
while (nn::pia::session::Session::GetInstance()->IsCreateSessionCompleted() == false)
{
    nn::pia::common::Scheduler::GetInstance()->Dispatch();
    if (networkType == Internet)
    {
        // インターネット通信の場合、サーバーとのキープアライブ通信などのために NEX の Scheduler::Dispatch を呼ぶ必要があります
        nn::nex::Scheduler::GetInstance()->DispatchAll();
    }
}

// 非同期処理の結果を確認
result = nn::pia::session::Session::GetInstance()->GetCreateSessionResult();
if (result.IsFailure())
{
    // エラー処理
}

/* 成功した場合は、他の端末がクライアントとして参加することを受け入れる状態になります */

 

セッションの検索

構築済みのセッションに参加する場合、最初に参加するセッションを検索して見つけます。セッションの検索は非同期処理です。SessionSearchCriteria の派生クラスで検索条件を設定し、BrowseSessionAsync() を呼び出すことで非同期処理が開始され、 IsBrowseSessionCompleted() によって非同期処理の終了を検知できます。

検索処理に成功すると GetBrowseSessionResult() は IsSuccess() が真となる Result 値を返します。検索処理が成功した場合、検索結果のリストを GetBrowsedSessionInfoList() で取得できます。リスト内の情報は ISessionInfoList::Iterator で走査し、ISessionInfo インターフェース、またはその派生クラスから参照します。

ローカルマッチメイク時は LocalSessionInfo クラスにキャストすることで電波強度やセッションに参加中のステーションのプレイヤー名などを取得できます。インターネットマッチメイク時は NexSessionInfo クラスにキャストすることでセッションタイプ、アプリケーション定義データ、セッションホストのプリンシパルIDなどを取得できます。LAN マッチメイク時は LanSessionInfo クラスにキャストすることでセッションタイプなどを取得できます。

セッション検索処理のキャンセルは現在未対応ですが、将来的に対応する予定です。

コード 7-6. セッションの検索
// 検索条件作成
nn::pia::inet::NexSessionSearchCriteria searchSettingList[SearchCriteriaListSize];

// Attribute 単体指定
searchSettingList[0].SetGameMode(SessionGameMode); // ゲームモードの値
searchSettingList[0].SetMaxParticipantNum(MaxEntry); // 最大参加人数
searchSettingList[0].SetAttribute(SessionAttributeIndex, SessionAttributeValue); // マッチメイクの属性値
searchSettingList[0].SetSessionMatchmakeKeyword(MatchmakeKeywordString); // あいことば

// Attribute 複数指定 (最初の条件より緩和した条件)
searchSettingList[1].SetGameMode(SessionGameMode); // ゲームモードの値
searchSettingList[1].SetMaxParticipantNumRange(MaxEntry, MaxEntry); // 最大参加人数
const uint32_t AttributeArraySize = 5;
u32 attributeArray[AttributeArraySize] = {2, 4, 6, 11, 72};
searchSettingList[1].SetAttribute(SessionAttributeInex, attributeArray, AttributeArraySize); // マッチメイクの属性値の範囲指定

// セッション検索処理(BrowseSessionAsync で指定できる検索条件は1つ)
result = nn::pia::session::Session::GetInstance()->BrowseSessionAsync(&searchSettingList[0]);
if (result.IsFailure())
{
    // エラー処理
}

// 非同期処理の開始に成功した場合、ディスパッチ関数を定期的に呼び出して非同期処理の進行を待つ必要があります
while (nn::pia::session::Session::GetInstance()->IsBrowseSessionCompleted() == false)
{
    if (networkType == Internet)
    {
        // インターネット通信の場合、サーバーとのキープアライブ通信などのために NEX の Scheduler::Dispatch を呼ぶ必要があります
        nn::nex::Scheduler::GetInstance()->DispatchAll();
    }
    nn::pia::common::Scheduler::GetInstance()->Dispatch();
}

// 非同期処理の結果確認
result = nn::pia::session::Session::GetInstance()->GetBrowseSessionResult();
if (result.IsFailure())
{
    // エラー処理
}

 
// 検索結果のリスト取得
nn::pia::session::ISessionInfoList* sessionInfoList = nn::pia::session::Session::GetInstance()->GetBrowsedSessionInfoList();
nn::pia::session::ISessionInfoList::Iterator it = sessionInfoList->Begin();
for ( ; it != sessionInfoList->End(); ++it)
{
    // リスト内の情報をログに出力
    PIA_SAMPLE_PRINT(" Mode=%d GID=%08X [%02d/%02d] [%s]",
        (*it)->GetGameMode(), 
        (*it)->GetSessionId(), 
        (*it)->GetCurrentParticipants(), 
        (*it)->GetMaxParticipants(), 
        (*it)->IsOpened() ? "Opened" : "Closed"
    );
}

セッションへの参加

自分がセッションクライアントとしてセッションへ参加する場合の処理です。セッションへの参加処理は非同期処理です。 JoinSessionAsync() を呼び出すことで非同期処理が開始され、 IsJoinSessionCompleted() によって非同期処理の終了を検知できます。セッション内のすべてのステーションとの接続処理に成功するとGetJoinSessionResult() は IsSuccess() が真となる Result 値を返し、他のステーションと通信可能な状態になります。

事前にセッションを検索し、参加処理を行うことが可能になっている状況で実行します。

インターネットマッチメイクでは NexJoinSessionSetting インスタンスに探索して得た NexSessionInfo インスタンスのポインタをセットするか、NexSessionInfo::GetSessionId() の値をセットする必要があります。

LAN マッチメイクでは LanJoinSessionSetting インスタンスに探索して得た LanSessionInfo インスタンスのポインタをセットするか、LanSessionInfo::GetSessionId() の値をセットする必要があります。

ローカルマッチメイクでは UdsJoinSessionSetting インスタンスに探索して得た UdsSessionInfo インスタンスへのポインタをセットする必要があります。

コード 7-7. セッションへの参加

 

// 検索処理を行って ISessionInfo を取得しておく
nn::pia::session::ISessionInfo* pTargetSessionInfo;

// ISessionInfo インスタンスへのポインタをセットする
if (networkType == Internet)
{
    nn::pia::inet::NexJoinSessionSetting joinSessionSetting;
    joinSessionSetting.SetSessionInfoPtr(pTargetSessionInfo); // 参加先のセッション情報
    joinSessionSetting.SetBlockListOption(true, true); // ブロックリスト設定
}
else if (networkType == Local)
{
    nn::pia::local::UdsJoinSessionSetting joinSessionSetting;
    joinSessionSetting.SetSessionInfoPtr(pTargetSessionInfo); // 参加先のセッション情報

    // 無線レイヤの暗号鍵
    result = joinSessionSetting.SetWirelessCryptoKey(const_cast<char*>(WirelessCryptoKey), sizeof(WirelessCryptoKey));
    PIA_ASSERT(result.IsSuccess());
}

// セッションへの参加処理
result = nn::pia::session::Session::GetInstance()->JoinSessionAsync(&joinSessionSetting);
if (result.IsFailure())
{
    // エラー処理
}

// 非同期処理の開始に成功した場合、ディスパッチ関数を定期的に呼び出して非同期処理の進行を待つ必要があります
while (nn::pia::session::Session::GetInstance()->IsJoinSessionCompleted() == false)
{
    if (networkType == Internet)
    {
        // インターネット通信の場合、サーバーとのキープアライブ通信などのために NEX の Scheduler::Dispatch を呼ぶ必要があります
        nn::nex::Scheduler::GetInstance()->DispatchAll();
    }
    nn::pia::common::Scheduler::GetInstance()->Dispatch();
}

// 非同期処理の結果確認
result = nn::pia::session::Session::GetInstance()->GetJoinSessionResult();
if (result.IsFailure())
{
    // エラー処理
}

/* 非同期処理に成功していれば、他のステーションと通信可能な状態になっています */