消息格式化错误的方式

时间:2013-07-15 21:00:14

标签: c++ lua crysis

我有以下代码将一个文本块发送到用户的游戏控制台(孤岛危机战争):

        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

这个问题实际上困扰着“孤岛危机”开发者社区,并且没有真正的解决方案。如果我直接使用C ++而不是Lua转换为C ++,代码格式正常,所以这一定是Lua方面的问题。

我尝试将消息计时间隔为1毫秒,这导致一些消息丢失(可能是因为最近的消息覆盖了旧消息)。 你们对这个问题有什么建议或解决方案吗?如果你提供一个可行的解决方案,你将在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

2 个答案:

答案 0 :(得分:2)

所以你说这些函数的序列总是导致输出与函数顺序完全相反。所以......只需按 reverse 顺序发送数据。因此,这将使逆转加倍并按预期顺序提交数据。

有很多方法可以做到这一点。您可以创建一个简单的Lua函数,它接受一个字符串数组并以相反的顺序广播它们:

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

您可以对此进行扩充,将字符串作为数组或可变参数系列字符串,并在原位构建数组:

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

答案 1 :(得分:1)

该输出与您的输入相反。如果仔细查看输入,您会注意到倒数第二个内容行的长度比其他行长一个字符。这将导致它以不同的方式在屏幕上居中。尝试删除多余的空间,看看是否能解决问题。