Open Reputeless opened 2 years ago
disconnect(); のあとに UnregisterTypes(); したほうが良いように思う
disconnect();
UnregisterTypes();
Multiplayer_Photon::~Multiplayer_Photon() { disconnect(); UnregisterTypes(); }
v0.6.4 Verbose 対応
Verbose
using Verbose = YesNo<struct Verbose_tag>;
/// @brief マルチプレイヤー用クラスを作成します。 /// @param secretPhotonAppID Photon アプリケーション ID /// @param photonAppVersion アプリケーションのバージョンです。 /// @param verbose デバッグ用の Print 出力をする場合 Verbose::Yes, それ以外の場合は Verbose::No /// @remark アプリケーションバージョンが異なる Multiplayer_Photon とは通信できません。 SIV3D_NODISCARD_CXX20 Multiplayer_Photon(std::string_view secretPhotonAppID, StringView photonAppVersion, Verbose verbose = Verbose::Yes);
/// @brief マルチプレイヤー用クラスを作成します。 /// @param secretPhotonAppID Photon アプリケーション ID /// @param photonAppVersion アプリケーションのバージョンです。 /// @param verbose デバッグ用の Print 出力をする場合 Verbose::Yes, それ以外の場合は Verbose::No void init(StringView secretPhotonAppID, StringView photonAppVersion, Verbose verbose = Verbose::Yes);
void Multiplayer_Photon::connectReturn において、エラーが無いときは紛らわしさを回避するために error を Print しない
void Multiplayer_Photon::connectReturn
同様のケースがほかの関数にもあるかも
void Multiplayer_Photon::connectReturn(const int32 errorCode, const String& errorString, const String& region, const String& cluster) { if (m_verbose) { Print << U"[Multiplayer_Photon] Multiplayer_Photon::connectReturn()"; if (errorCode) { Print << U"- [Multiplayer_Photon] errorCode: " << errorCode; Print << U"- [Multiplayer_Photon] errorString: " << errorString; } Print << U"- [Multiplayer_Photon] region: " << region; Print << U"- [Multiplayer_Photon] cluster: " << cluster; } }
void Multiplayer_Photon::createRoomReturn(const int32 localPlayerID, const int32 errorCode, const String& errorString) { if (m_verbose) { Print << U"[Multiplayer_Photon] Multiplayer_Photon::createRoomReturn() [ルームを新規作成した結果を処理する]"; Print << U"- [Multiplayer_Photon] localPlayerID:" << localPlayerID; if (errorCode) { Print << U"- [Multiplayer_Photon] errorCode: " << errorCode; Print << U"- [Multiplayer_Photon] errorString: " << errorString; } } }
U"- [Multiplayer_Photon] errorCode:" のように : のあとに半角スペースがない箇所が複数ある
U"- [Multiplayer_Photon] errorCode:"
:
表現修正「自分を含め、プレイヤーが参加したら呼ばれる」→「誰か(自分を含む)がルームに参加したら呼ばれる」
U"- [Multiplayer_Photon] playerIDs: [ルームの参加者一覧]" → U"- [Multiplayer_Photon] playerIDs [ルームの参加者一覧]: "
U"- [Multiplayer_Photon] playerIDs: [ルームの参加者一覧]"
U"- [Multiplayer_Photon] playerIDs [ルームの参加者一覧]: "
表示順を次のように変更
Print << U"- [Multiplayer_Photon] localPlayerID [参加した人の ID]: " << localPlayerID; Print << U"- [Multiplayer_Photon] isSelf [自分自身の参加?]: " << isSelf; Print << U"- [Multiplayer_Photon] playerIDs [ルームの参加者一覧]: " << playerIDs;
macOS ビルドで BYTE が見つからないので、5 箇所の BYTE を uint8 に直す
BYTE
uint8
警告抑制のために size_t → short, 全部で 5 箇所
size_t
short
case ExitGames::Common::TypeCode::INTEGER: { const auto values = ExitGames::Common::ValueObject<int*>(eventDataContent.getValue(L"values")).getDataCopy(); const auto length = *(ExitGames::Common::ValueObject<int*>(eventDataContent.getValue(L"values"))).getSizes(); Array<int32> data(length); for (size_t i = 0; i < length; ++i) { data[i] = values[i]; } m_context.customEventAction(playerID, eventCode, data); return; }
NoRandomMatchFound を Multiplayer_Photon の protected static constexpr メンバ変数にして NetworkSystem 名前空間を廃止
NoRandomMatchFound
Multiplayer_Photon
NetworkSystem
MasterClient を Host に名称変更
MasterClient
Host
/// @brief 自分がルームのホストであるかを返します。 /// @return ルームのホストである場合 true, それ以外の場合は false [[nodiscard]] bool isHost() const;
void Multiplayer_Photon::leaveRoomEventAction(const int32 playerID, const bool isInactive) { if (m_verbose) { Print << U"[Multiplayer_Photon] Multiplayer_Photon::leaveRoomEventAction()"; Print << U"- [Multiplayer_Photon] playerID: " << playerID; Print << U"- [Multiplayer_Photon] isInactive: " << isInactive; if (isHost()) { Print << U"[Multiplayer_Photon] I am now the host player"; } else { Print << U"[Multiplayer_Photon] I am still not the host player"; } } }
LocalPlayer 型を追加
LocalPlayer
namespace s3d { /// @brief ルームのローカルプレイヤー情報 struct LocalPlayer { /// @brief ルーム内でのローカル ID int32 localID = 0; /// @brief ユーザ名 String userName; /// @brief ユーザ ID String userID; /// @brief ルームのホストであるか bool isHost = false; /// @brief アクティブであるか bool isActive = false; }; /// @brief マルチプレイヤー用クラス (Photon バックエンド) class Multiplayer_Photon {
/// @brief 現在のルームにいるローカルプレイヤーの情報一覧を返します。 /// @return 現在のルームにいるローカルプレイヤーの情報一覧 [[nodiscard]] Array<LocalPlayer> getLocalPlayers() const;
/// @brief 現在のルームに存在するローカルプレイヤーの人数を返します。 /// @return ローカルプレイヤーの人数 [[nodiscard]] int32 getPlayerCountInCurrentRoom() const;
```cpp Array<LocalPlayer> Multiplayer_Photon::getLocalPlayers() const { if (not m_client->getIsInGameRoom()) { return{}; } Array<LocalPlayer> results; const auto& players = m_client->getCurrentlyJoinedRoom().getPlayers(); for (uint32 i = 0; i < players.getSize(); ++i) { const auto& player = players[i]; LocalPlayer localPlayer { .localID = player->getNumber(), .userName = detail::ToString(player->getName()), .userID = detail::ToString(player->getUserID()), .isHost = player->getIsMasterClient(), .isActive = (not player->getIsInactive()), }; results << std::move(localPlayer); } return results; }
const auto roomOption = ExitGames::LoadBalancing::RoomOptions() .setMaxPlayers(static_cast<uint8>(Clamp(maxPlayers, 1, 255))) .setPublishUserID(true);
m_defaultRoomName
void connect(StringView userName);
void Multiplayer_Photon::leaveRoomEventAction(const int32 playerID, const bool isInactive)
opJoinRandomRoom
joinRandomRoom
opRaiseEvent()
sendEvent()
localPlayerID
playerID
/// @brief ランダムルームへの入室を試みた結果が通知されるときに呼び出されます。 /// @param playerID ルーム内のローカルプレイヤー ID /// @param errorCode エラーコード /// @param errorString エラー文字列 virtual void joinRandomRoomReturn(int32 playerID, int32 errorCode, const String& errorString);
/// @brief ルームへの入室を試みた結果が通知されるときに呼び出されます。 /// @param playerID ルーム内のローカルプレイヤー ID /// @param errorCode エラーコード /// @param errorString エラー文字列 virtual void joinRoomReturn(int32 playerID, int32 errorCode, const String& errorString);
/// @brief ルームに誰かが(自分または他人)が入室したときに呼び出されます。 /// @param playerID 入室者のローカルプレイヤー ID /// @param playerIDs ルーム内のプレイヤー全員のローカルプレイヤー ID /// @param isSelf 入室したのが自分である場合 true, それ以外の場合は false virtual void joinRoomEventAction(int32 playerID, const Array& playerIDs, bool isSelf);
/// @brief ルームから誰かが退室したときに呼び出されます。 /// @param playerID 退室者のローカルプレイヤー ID /// @param isInactive 再入室できる場合 true, それ以外の場合は false virtual void leaveRoomEventAction(int32 playerID, bool isInactive);
/// @brief 部屋の作成を試みた結果が通知されるときに呼び出されます。 /// @param playerID プレイヤーID /// @param errorCode エラーコード /// @param errorString エラー文字列 virtual void createRoomReturn(int32 playerID, int32 errorCode, const String& errorString);
/// @brief データを受信した際に呼び出されます。 /// @param playerID 送信者のローカルプレイヤー ID /// @param eventCode イベントコード /// @param data 受信したデータ virtual void customEventAction(int32 playerID, uint8 eventCode, bool data);
- `String getUserID() const;` の直後に `Optional<int32> getLocalPlayerID() const;` - join できる状態であるかを返すために `isInLoby()` が必要 ```cpp bool Multiplayer_Photon::isInLobby() const { return m_client->getIsInLobby(); }
isInLobbyOrInRoom()
bool Multiplayer_Photon::isInLobbyOrInRoom() const { return m_client->getIsInRoom(); }
上記すべてに対応はしていない https://gist.github.com/Reputeless/148c74ce56311031e8e8147a43f3fe22
disconnect();
のあとにUnregisterTypes();
したほうが良いように思うv0.6.4
Verbose
対応using Verbose = YesNo<struct Verbose_tag>;
すればよいvoid Multiplayer_Photon::connectReturn
において、エラーが無いときは紛らわしさを回避するために error を Print しない同様のケースがほかの関数にもあるかも
U"- [Multiplayer_Photon] errorCode:"
のように:
のあとに半角スペースがない箇所が複数ある表現修正「自分を含め、プレイヤーが参加したら呼ばれる」→「誰か(自分を含む)がルームに参加したら呼ばれる」
U"- [Multiplayer_Photon] playerIDs: [ルームの参加者一覧]"
→U"- [Multiplayer_Photon] playerIDs [ルームの参加者一覧]: "
表示順を次のように変更
macOS ビルドで
BYTE
が見つからないので、5 箇所のBYTE
をuint8
に直す警告抑制のために
size_t
→short
, 全部で 5 箇所NoRandomMatchFound
をMultiplayer_Photon
の protected static constexpr メンバ変数にしてNetworkSystem
名前空間を廃止MasterClient
をHost
に名称変更LocalPlayer
型を追加/// @brief 現在のルームに存在するローカルプレイヤーの人数を返します。 /// @return ローカルプレイヤーの人数 [[nodiscard]] int32 getPlayerCountInCurrentRoom() const;
m_defaultRoomName
を廃止する(名前 + 乱数を推奨)。指定個所と実際に使われる個所が離れているのも問題void connect(StringView userName);
で useName をデフォルト引数にしないように(ユーザ名は重要)void Multiplayer_Photon::leaveRoomEventAction(const int32 playerID, const bool isInactive)
における host 状態は Print しなくてよいopJoinRandomRoom
のように op から開始する関数をjoinRandomRoom
のようにするopRaiseEvent()
はsendEvent()
にlocalPlayerID
はplayerID
に統一 -ドキュメント例/// @brief ルームへの入室を試みた結果が通知されるときに呼び出されます。 /// @param playerID ルーム内のローカルプレイヤー ID /// @param errorCode エラーコード /// @param errorString エラー文字列 virtual void joinRoomReturn(int32 playerID, int32 errorCode, const String& errorString);
/// @brief ルームに誰かが(自分または他人)が入室したときに呼び出されます。 /// @param playerID 入室者のローカルプレイヤー ID /// @param playerIDs ルーム内のプレイヤー全員のローカルプレイヤー ID /// @param isSelf 入室したのが自分である場合 true, それ以外の場合は false virtual void joinRoomEventAction(int32 playerID, const Array& playerIDs, bool isSelf);
/// @brief ルームから誰かが退室したときに呼び出されます。 /// @param playerID 退室者のローカルプレイヤー ID /// @param isInactive 再入室できる場合 true, それ以外の場合は false virtual void leaveRoomEventAction(int32 playerID, bool isInactive);
/// @brief 部屋の作成を試みた結果が通知されるときに呼び出されます。 /// @param playerID プレイヤーID /// @param errorCode エラーコード /// @param errorString エラー文字列 virtual void createRoomReturn(int32 playerID, int32 errorCode, const String& errorString);
/// @brief データを受信した際に呼び出されます。 /// @param playerID 送信者のローカルプレイヤー ID /// @param eventCode イベントコード /// @param data 受信したデータ virtual void customEventAction(int32 playerID, uint8 eventCode, bool data);
isInLobbyOrInRoom()
参考実装
上記すべてに対応はしていない https://gist.github.com/Reputeless/148c74ce56311031e8e8147a43f3fe22