1. 程式人生 > >mac下實現遊戲多開

mac下實現遊戲多開

mac下的程式是以包的形式體現的,玩家可以通過雙擊包的方式開啟我們的客戶端。當玩家想多開客戶端的時候卻不能通過再次雙擊包來完成,因為當已經開啟一個遊戲客戶端的時候再次雙擊包會將原來的客戶端啟用到前端,而不會再次開啟一個程式。
    其實如果玩家雙擊包下 Contents/MacOS/Conquer 這個真正的可執行檔案,還是可以再次開啟一個客戶端的。這就說明mac下程式多開是可行的。
    我們可以通過程式碼來進行控制,以程式碼的方式開啟另一個客戶端,這樣不僅沒有直接雙擊可執行檔案會出現的控制檯,而且是對玩家友好的方式。我們可以新增一個開啟新客戶端的選單,來完成多開客戶端的功能。

    我們的遊戲客戶端使用了Qt庫,通過Qt來開啟一個新程式是非常簡單的。 QProcess::startDetached("../MacOS/Conquer");

    但是經測試發現一個很詭異的問題:如果我們使用父視窗(先開啟的視窗),通過此方法建立一個子視窗,當父視窗遊戲關閉的時候,子視窗中觀察,父視窗中角色並沒有退出遊戲。經調查發現當父視窗關閉遊戲時,雖然有關閉socket的過程,但是可能socket已經被子視窗共享,即對伺服器而言這個socket依然連線,並未關閉。

    經過新的嘗試,發現一個更加完善的開啟新遊戲視窗的方法:在shell中執行open -n Conquer.app   這條命令就可以開啟新遊戲視窗。

在程式碼中,我們可以這樣寫

::system("open -n Conquer.app");

這裡需要注意Conquer.app要是遊戲包的絕對路徑,此處僅僅是個例子。

    這樣開啟新視窗,兩個遊戲視窗之間並沒有父子程序的關係,不會公用socket,也就不會發生上述問題。