请参阅下面的第一张图片以查找问题。您可以看到第一行文本正确对齐,但第二行没有正确对齐。
几个月前,我编写了一些代码,将文本集中在一个字符串中,以便将其很好地处理到游戏服务器修改的控制台上。这段代码非常好用,但有两个主要问题:
如果我们超过实际控制台的112个字符限制,游戏服务器会崩溃(在正常的控制台消息中不会出现此问题)
在文本中使用颜色会导致字符串向每个颜色代码右移两个字符
我希望解决第二个问题(尽管解决第一个问题会带来巨大的好处),但是不知道如何做到这一点。我不能简单地采用颜色编码,因为这需要为文本着色。
如果我没有9种颜色可供选择,这段代码可能很简单:
*$1= White
*$2= Dark Blue
*$3= Green
*$4= Red
*$5= Yellow
*$6= Light Blue
*$7= Purple
*$8= Orange
*$9= Grey
我也不想简单地寻找'$',因为在某些情况下它被用作普通字符。
插入空格时是否忽略$ 1- $ 9?如果是这样,我将如何处理?
int CScriptBind_GameRules::CentreTextForConsole(IFunctionHandler *pH, const char *msg)
{
if (msg)
{
const int linelength=200;
char newmsg[linelength+1];
for(int i=0;i<linelength;i++)
newmsg[i]=0;
for(int i=0;i<linelength;i++)
newmsg[i]=' ';
newmsg[linelength]=0;
int msglen=strlen(msg);
int startpos=4+linelength/2-msglen/2;
for(int i=msglen-1;i>=0;i--)
newmsg[startpos+i]=msg[i];
msg=0; //Null the message.
return pH->EndFunction(newmsg);
}
else
{
return pH->EndFunction();
}
我现在无法进入我的开发PC,因为我正在工作 - 如果此问题尚未解决,我会在几小时后发布截图。
来自Lua的来电者:
Core.CenteredConsole:All(g_gameRules.game:CentreTextForConsole("$1Crysis$4Wars Infinity iX 5.0"));
这显示了它应该是什么样子。如果消息长度少于80个字符,则该消息才能正常工作。
答案 0 :(得分:1)
由于数组的定义长度,程序崩溃了。适当调整newmsg
的大小
同时检查startpos + i >= 0 && < length of array
...
至于你的第二个问题:
正如你所说:
在文本中使用颜色会导致字符串向每个颜色代码的右侧移动两个字符
似乎在打印之前删除了颜色代码并且因为您考虑了包含颜色代码的消息长度而出现问题...
如果是这样,我该如何处理?“
例如,为msg
上的每个颜色代码添加2个空格可能会更少。