2013-07-15 86 views
3

我有下面的代碼文本塊發送到用戶的遊戲控制檯(孤島危機戰爭):消息格式化南轅北轍

 CMCCPlayer(player, "================================================================================================================"); 
     CMCCPlayer(player, "$4####  ###  ###  ######  ####"); 
     CMCCPlayer(player, "$4##  ### ###  ## ##  ##"); 
     CMCCPlayer(player, "$4##   ### ###  ##   ##"); 
     CMCCPlayer(player, "$4## ###  #####   ###### ### ##"); 
     CMCCPlayer(player, "$4##   ### ###    ##  ##"); 
     CMCCPlayer(player, "$4##  ### ###  ##  ##  ## "); 
     CMCCPlayer(player, "$4####  ###  ###  ######  ####"); 
     CMCCPlayer(player, "================================================================================================================"); 

但我得到這樣的結果:

Wrong Text

這個問題實際上困擾着Crysis Wars的開發者社區,而且現在還沒有真正的解決方案。代碼格式很好,如果我直接從C++執行它,而不是從Lua到C++,那麼這一定是Lua方面的問題。

我試着將消息計時到1ms,這導致一些消息丟失(可能是因爲最近的消息覆蓋了舊的消息)。 你們對這個問題有什麼建議或解決方案嗎?如果你提供了一個可行的解決方案,你會在Crysis Wars開發者社區中非常有名,因爲你可以解決一個非常煩人的bug。我會提供我的一些聲譽,但不幸的是我今天早上將獎金授予某人解決另一個問題。發送消息

功能代碼:

function CMCCPlayer(player, msg) 
    g_gameRules.game:SendConsoleMessage(player.id, g_gameRules.game:CentreTextForConsole(msg)); 
end 

如果這能幫助什麼,這裏的C++ SendConsoleMessage代碼:

int CScriptBind_GameRules::SendConsoleMessage(IFunctionHandler *pH, ScriptHandle playerId, const char *msg) 
{ 
CGameRules *pGameRules=GetGameRules(pH); 
if (!pGameRules) 
    return pH->EndFunction(); 

int channelId=pGameRules->GetChannelId((EntityId)playerId.n); 
pGameRules->SendTextMessage(eTextMessageConsole, msg, eRMI_ToClientChannel, channelId); 
msg=0; //Null the message. 
return pH->EndFunction(); 
} 

編輯:

請注意,這不是用於居中的文本,而是下面的圖像和文本塊僅作爲示例提供;這個問題發生在每一段發送的代碼上。

enter image description here

Msg1

+1

我有這樣的問題,使用MFC文本小部件。看來MFC沒有對齊輸出。這可能是一樣的問題你有嗎? – andre

+0

可能。如果是,請觀看這​​個空間! :) – cybermonkey

+0

您可以粘貼(或鏈接到)CentreTextForConsole功能嗎? –

回答

2

所以你在說這些函數的序列總是會導致與函數順序完全相反的輸出。所以...只需發送反向命令中的數據。因此,這將使翻轉翻倍,並按預期順序提交數據。

有很多方法可以做到這一點。你可以創建一個簡單的Lua函數,它接受一個字符串數組,並以相反的順序播放它們:

function BroadcastToPlayer(player, strings) 
    for i = #strings, 1, -1 do 
    CMCCPlayer(player, strings[i]); 
    end 
end 

可以擴大此取字符串作爲數組或一個可變參數系列串,構建陣列中-situ:

function BroadcastToPlayer(player, ...) 
    local test = ... 
    if(type(test) == "string") then return BroadcastToPlayer(player, {...}) end 

    for i = #strings, 1, -1 do 
    CMCCPlayer(player, strings[i]); 
    end 
end 

你甚至可以創建一個字符串給出要發送一個簡單的Lua對象,然後調用它來發送所有存儲的字符串。

function CreateStringMan() 
    local man = {} 
    function man:add(str) 
     self._strings = self._strings or {} 
     self._strings[#self._strings + 1] = str 
    end 
    function man:CMCCPlayer(player) 
     for i = #self._strings, 1, -1 do 
      CMCCPlayer(player, self._strings[i]); 
     end 
     self._strings = {} --clear the strings 
    end 
    return man 
end 
+0

你已經在這裏:http://online-gaming-world.de/index.php?page=Thread&postID=2914#post2914。 :) – cybermonkey

+0

@AlexanderStopher:「*它實際上表示,只要您對問題進行了充分的編輯,就可以爲您的問題創建一個新話題,而我所做的就是*。」[這取決於您問的問題。](http:// meta.stackexchange.com/questions/189732)似乎有什麼分歧,應該如何工作。此外,您的編輯絕不足以使新問題有所不同。事實證明,我在沒有詳細閱讀過的情況下就回答了您的舊問題。 –

1

這種輸出從輸入反轉。如果你仔細看看你的輸入,你會注意到你的倒數第二行內容是比其他行長一個字符。這會導致它在屏幕上居中顯示。嘗試刪除額外的空間並查看是否可以解決問題。

+0

不,這不能解決問題,也不是用於居中的代碼。圖像和文本代碼僅僅是一個例子;這幾乎發生在每個發送的文本塊中。 – cybermonkey

+0

你能給我們一個沒有錯誤並且仍然顯示錯誤輸出的例子嗎?因爲在上面的代碼片段和圖像中,額外的空間幾乎肯定是bug。 –

+0

用更多圖片和代碼更新了最初的帖子。 – cybermonkey