2

有关问题,请参见下面的第一张图片。您可以看到第一行文本正确对齐,但第二行没有。

几个月前,我编写了一些代码,将文本集中在一个字符串中,以便在控制台上很好地处理它以进行游戏服务器修改。这段代码工作得很好,但有两个主要问题:

  • 如果我们超过实际控制台的 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 个字符时,该消息才能正常工作。

在此处输入图像描述

4

1 回答 1

1

由于数组的定义长度,您的程序崩溃。newmsg适当调整大小

还要检查startpos + i >= 0 && < length of array...


至于你的第二个问题:

如你所说:

在文本中使用颜色会导致字符串对于每个颜色代码向右移动两个字符

似乎在打印之前颜色代码已被删除,并且您的问题出现了,因为您正在考虑包含颜色代码的消息的长度......

如果是这样,我将如何处理这个问题?

msg例如,可能会为示例中找到的每个颜色代码少 2 个空格。

于 2013-11-20T13:50:36.267 回答