跳到主要内容

文本绘图

什么是文本绘图?

文本绘图(Textdraw)是在玩家屏幕上显示的文字元素。与客户端消息游戏文本不同,文本绘图可以无限期显示。既支持简单静态文本(如网站地址),也可创建复杂的动态元素(如进度条)。

推荐使用文本绘图编辑器工具简化设计流程。


全局文本绘图

全局文本绘图可被创建并展示给所有玩家,但存在数量限制。例如当服务器拥有 500 名玩家时,每个玩家最多只能创建 4 个全局文本绘图。此时便需要采用玩家专属文本绘图方案(下文将详细说明)。以下是全局文本绘图相关函数列表:


玩家文本绘图

玩家专属文本绘图仅针对特定玩家创建。每个玩家可创建多达 256 个专属文本绘图,这意味着在 500 名玩家的服务器上可同时存在 128,000 个玩家专属文本绘图,远超 2048 个的限制。此类文本绘图应专用于非静态内容显示,切勿将其用于展示网站地址等静态内容,而应应用于车辆生命值指示器等动态信息显示。


变量声明

当创建文本绘图时,必须确定要创建的是全局文本绘图(如网站地址、全局公告)还是玩家专属文本绘图(如击杀数、死亡数、分数)。

全局文本绘图

全局文本绘图创建最为简单,只需单个变量。该变量用于后续修改文本绘图并向玩家展示。此类变量通常需要声明为全局变量,变量名应使用 Text: 前缀,并初始化为 Text:INVALID_TEXT_DRAW。若省略初始化,可能与其他新增文本绘图产生冲突。

new Text:gMyText = Text:INVALID_TEXT_DRAW;

玩家专属文本绘图

玩家专属文本绘图与常规"全局"文本绘图在功能上完全一致,但仅针对单个玩家创建。这种机制特别适用于需要展示玩家个性化数据的场景,例如显示击杀数/得分的统计信息栏。

使用玩家专属文本绘图可有效规避全局文本绘图的数量限制(每个玩家可独立创建 256 个),同时在玩家断开连接时系统会自动销毁其专属文本绘图,显著降低资源管理复杂度。

new PlayerText:gMyPlayerText = PlayerText:INVALID_TEXT_DRAW;
信息

重要提示:仍需使用数组变量存储,因为不同玩家的文本绘图 ID 可能因创建数量差异而变化。

函数命名规则:全局函数中的'TextDraw'改为'PlayerTextDraw'(例如 创建玩家文本绘图),但字符串设置函数例外('TextDrawSetString' 变为 'PlayerTextDrawSetString')。


创建文本绘图

图示:320px-文本绘图坐标示意图

声明存储文本绘图 ID 的变量/数组后,即可开始创建。全局文本绘图应在 OnGameModeInit 回调中创建,使用 TextDrawCreate 函数。注意此函数仅创建,后续需其他函数进行修改和展示。

需特别注意:此函数仅完成文本绘图的创建操作,后续需调用其他函数进行属性修改及玩家显示操作。

参数:​

TextDrawCreate(Float:x, Float:y, text[])

参数名说明
x文本绘图的 X 轴坐标
y文本绘图的 Y 轴坐标
text[]文本绘图显示的内容

返回值:​

创建的文本绘图 ID

创建示例:

public OnGameModeInit()
{
gMyText = TextDrawCreate(320.0, 240.0, "你好世界!");
return 1;
}

该代码在屏幕中央创建显示"你好世界!"的文本绘图。


字体设置

文本绘图支持四种字体:

图示:文本绘图字体样式对比

ID特性描述使用建议
0《圣安地列斯》原生字体适用于标题,不适合大段文本
1包含大小写的清晰字体适合长篇文字内容
2仅含大写字母的清晰字体通用场景适用
3GTA 风格字体放大不失真,适合大尺寸文本

SA-MP 0.3d 版本新增第四种字体(ID 4),需配合 TextDrawCreateTextDrawTextSize 函数使用,用于显示材质精灵。此功能后续详解。


显示文本绘图

以下示例展示在玩家加入服务器时显示全局文本绘图。使用 TextDrawShowForPlayer 函数向指定玩家展示。

参数:​

TextDrawShowForPlayer(playerid, Text:text)

参数名说明
playerid目标玩家 ID
text要显示的文本绘图 ID

返回值:​

无特定返回值

实现代码:

public OnGameModeInit()
{
gMyText = TextDrawCreate(320.0, 320.0, "你好世界!");
return 1;
}

public OnPlayerConnect(playerid)
{
TextDrawShowForPlayer(playerid, gMyText);
return 1;
}

实用技巧

  • 尽量使用整数坐标值,确保不同分辨率下的最佳兼容性
  • 字体在 X:Y = 1:4 的比例下显示效果最佳(例如 X=0.5 时 Y=2.0)