我有以下代码将一个文本块发送到用户的游戏控制台(孤岛危机战争):
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, "================================================================================================================");
但我得到了这个结果:
这个问题实际上困扰着“孤岛危机”开发者社区,并且没有真正的解决方案。如果我直接使用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();
}
编辑:
请注意,这与用于居中的文字无关,并且下面的图片和文本块仅作为示例提供;发送的每一段代码都会出现此问题。
答案 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)
该输出与您的输入相反。如果仔细查看输入,您会注意到倒数第二个内容行的长度比其他行长一个字符。这将导致它以不同的方式在屏幕上居中。尝试删除多余的空间,看看是否能解决问题。