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?


Log in to reply