DirectPlay8 Spielerverwaltung
-
Hallo Leute ich habe eine PeerAnwendung. Also ich habe ein Host und ein Client der erfolgreich zum Host verbindung aufnimmt.
mit JoinSession.
Hier jetzt ein Ausschnitt aus dem Tutorialsource von DPlay8 aus der Funktion
DirectPlayMessageHandler(PVOID pvUserContext, DWORD dwMessageId, PVOID pMsgBuffer):case DPN_MSGID_CREATE_PLAYER: { PDPNMSG_CREATE_PLAYER pCreatePlayerMsg; DWORD dwSize = 0; DPN_PLAYER_INFO* pdpPlayerInfo = NULL; pCreatePlayerMsg = (PDPNMSG_CREATE_PLAYER)pMsgBuffer; // check to see if we are the player being created hr = g_pDP->GetPeerInfo(pCreatePlayerMsg->dpnidPlayer, pdpPlayerInfo, &dwSize, 0); if( FAILED( hr) && hr != DPNERR_BUFFERTOOSMALL) { printf("Failed GetPeerInfo: 0x%X\n", hr); return hr; } pdpPlayerInfo = (DPN_PLAYER_INFO*) new BYTE[dwSize]; ZeroMemory(pdpPlayerInfo, dwSize); pdpPlayerInfo->dwSize = sizeof(DPN_PLAYER_INFO); if( FAILED( hr = g_pDP->GetPeerInfo(pCreatePlayerMsg->dpnidPlayer, pdpPlayerInfo, &dwSize, 0 ) ) ) { printf("Failed GetPeerInfo: 0x%X\n", hr); goto Error_DPN_MSGID_CREATE_PLAYER; } if( pdpPlayerInfo->dwPlayerFlags & DPNPLAYER_LOCAL) g_dpnidLocalPlayer = pCreatePlayerMsg->dpnidPlayer; Error_DPN_MSGID_CREATE_PLAYER: SAFE_DELETE_ARRAY(pdpPlayerInfo); break; }
Kann mir einer erklären was da passiert ?
Ich habe nun eine Verbindung zwischen den beiden Programmen, wie verwalte ich die Spieler ?
Ich möchte, das mindestens 2 und höchstens 4 Spieler mitspielen können.Wenn ich also den Host starte, soll der ersteinmal auf Spieler warten. Aber wie prüfe ich ob nun schon spieler verbunden sind, und wieviele es sind?
Und wie schicke ich Nachrichten an die Spieler? Wenn ich z.B. eine Nachricht an einen Spieler senden möchte, wie bekomm ich seine ID heraus? usw.
-
case DPN_MSGID_CREATE_PLAYER: //Isr der Msg-Typ "Create Player" { PDPNMSG_CREATE_PLAYER pCreatePlayerMsg; //Wir wollen die Daten erstmal nicht holen und nur sehen ob es überhaupt geht // darum size=0 => Bytes holen DWORD dwSize = 0; DPN_PLAYER_INFO* pdpPlayerInfo = NULL; //Wir wissen jetzt den Typ der Msg und casten entsprechend pCreatePlayerMsg = (PDPNMSG_CREATE_PLAYER)pMsgBuffer; //Info des Spielers holen hr = g_pDP->GetPeerInfo(pCreatePlayerMsg->dpnidPlayer, pdpPlayerInfo, &dwSize, 0); //Testen ob Info erfolgreich geholt wurde und nur der Buffer zu klein war if( FAILED( hr) && hr != DPNERR_BUFFERTOOSMALL) { //GetPeerInfo war nicht erfolgreich, Fehler ausgeben printf("Failed GetPeerInfo: 0x%X\n", hr); return hr; } //Speicher für neue Info Struktur holen pdpPlayerInfo = (DPN_PLAYER_INFO*) new BYTE[dwSize]; //mit 0 Bytes füllen ZeroMemory(pdpPlayerInfo, dwSize); //Jetzt Strukturgrösse richtig setzen pdpPlayerInfo->dwSize = sizeof(DPN_PLAYER_INFO); if( FAILED( hr = g_pDP->GetPeerInfo(pCreatePlayerMsg->dpnidPlayer, pdpPlayerInfo, &dwSize, 0 ) ) ) { //GetPeerInfo war nicht erfolgreich, Fehler ausgeben printf("Failed GetPeerInfo: 0x%X\n", hr); goto Error_DPN_MSGID_CREATE_PLAYER; } //Ist der Spieler der lokale Spieler? => id speichern if( pdpPlayerInfo->dwPlayerFlags & DPNPLAYER_LOCAL) g_dpnidLocalPlayer = pCreatePlayerMsg->dpnidPlayer; Error_DPN_MSGID_CREATE_PLAYER: //Speicher freigeben SAFE_DELETE_ARRAY(pdpPlayerInfo); break; }
-
Also hab ich das richtig verstanden, dass dort nur geprüft wird ob der Spieler der grad erstellt wurde ich selber bin, und wenn ja die ID gespeichert wird?