参考了其它引擎源码。其实也没有很多的功能。
想了一上。其实也是不难的。就是检测有什么显示什么吧。。
但是有些功能暂时不会实现
如 对话框显示图像等。暂时不知那个是显示绘图之类的函数 相信以后可能慢慢就会的了吧。。。
找到显示图的函数 又可以实现不少东西的了。
参考
设置NPC文字坐标
<Text:文字内容:X:Y/@触发>
<Text:测试下这段文字的显示|提示信息:10:20/@测试>
<Text:<$STR(S87)>|提示信息:10:20{FCOLOR=250}/@测试>
<Text:测试下这段文字的显示|提示信息:10:20{FCOLOR=254}/@测试>
<Text:测试下这段文字的显示|提示信息:10:20{AUTOCOLOR=250,251,252,253,254}/@测试>
可惜只是完成了。<text:文字内容:X:Y/@触发> 这种。。
|提示信息:10:20 这种不如如何实现。主要是提示信息的实现确实不会。。。
procedure TFrmDlg.DMerchantDlgDirectPaint(Sender: TObject; //20201005临时解决NPC排版问题
dsurface: TCustomCanvas);
var
d: TCustomLockableTexture;//自定义可锁定纹理
Str, data,FData, fdata2: string;
cmdstr, cmdmsg, cmdparam: string;
i, j,ij, k, lx, ly, sX, L: Integer;
pcp: pTClickPoint;
cl: TColor;
scl: string;
stext:Tstringlist;
DestRect: TRect;
ATexture: TCustomLockableTexture;
begin //as是把某个类型对象转换成所需要的类型
with Sender as TDWindow do
begin
Left := 0;
Top := 0;
//默认npc对话框。
if StandardNpcDlg then
d := WLib.Images[FaceIndex]
else
d := g_WMainImages.Images[402];//上面是自定义的.下面的是默认的...
if d <> nil then
begin // 表面 画左和上 根据图片画个方形 客户端矩形...
dsurface.Draw(SurfaceX(Left), SurfaceY(Top), d.ClientRect, d, True);
end;
lx := 30; //显示文字的坐标.
ly := 20;
Str := MDlgStr; //取得对话框字符
L := 0;
while True do
begin
if Str = '' then //对话框没数据 不处理..
Break;
//取得一行数据...
//如第一行是 我要上大学,你<想上/@想上>不!\
//这个没了解清楚
Str := GetValidStr3(Str, data, ['\']);
//
if data <> '' then
begin
sX := 0;
// fdata := '';
//如数据不为空 同时存在<>号的话..
while (data <> '') and (Pos('<', data) > 0) and (Pos('>', data) > 0) do
begin
FData := ''; //
//如果第一个字符不是<号的话....
if data[1] <> '<' then
//原下面这句...
// 我要上大学,你<想上/@想上>不!\
// 返回余下的部分 第二个参数是变量 .
data := '<' + GetValidStr3(data, FData, ['<']);
//变为了data-> <想上/@想上>不!
// FData -> 我要上大学,你
//取出前后缀之间的字符串到ArrestStr(cmdstr),并返回后面剩余部分的字符串
//
//变为了data-> <想上/@想上>不!
data := ArrestStringEx(data, '<', '>', cmdstr);
///cmdstr=想上/@想上
/// data=不!
fdata2 := '';
if cmdstr <> '' then
begin
//检查这个颜色..如 :<COLOR=clSkyBlue 你好!>
j := Pos('COLOR=', UpperCase(cmdstr));
if j > 0 then
begin
// <COLOR=clSkyBlue 你好!>
fdata2 := GetValidStr3(cmdstr, scl, [' ', #9, ',']);
// //scl=<COLOR=clSkyBlue
///fdata2=你好!>
/// ///cmdstr =你好!>
//第一个参数是一个字符串或一个动态数组,
///第二个参数是开始截取的索引序号,
///第三个参数是截取的元素的数量.
///
scl := Copy(scl, 7, Length(scl) - 6);
/// scl=clSkyBlue
cl := clWhite; //确定是白色..
if scl <> '' then
begin
if scl[1] = '#' then // 例:<COLOR=#234 字体>为必要的,#之后的数字表示颜色
begin //取得数字
cl := StrToInt(Copy(scl, 2, Length(scl) - 1));
end
else
begin
if CompareText('clLtGray', scl) = 0 then
cl := clLtGray
else if CompareText('clDkGray', scl) = 0 then
cl := clDkGray
else //字符到颜色.
cl := StringToColor(scl);
end
end;
cmdstr := '';
end;
// <text:文字内容:X:Y/@触发>
ij := Pos('TEXT:', UpperCase(cmdstr));
stext := TStringList.Create;
if ij > 0 then
begin
DScreen.AddChatBoardString('有text.', clYellow, clRed);
// text:文字内容:X:Y/@触发
cmdparam :=GetValidStr3(cmdstr, scl, ['/']);
// scl= text:文字内容:X:Y
// cmdparam= @触发
ExtractStrings([':'], [' '], PChar(scl), stext);
/// stext[1] stext[2] stext[3]
dsurface.BoldTextOut(SurfaceX(strtoint(stext[2])), SurfaceY(strtoint(stext[3])),
clWhite, clBlack, stext[1]);
if stext[1] <> '' then
begin
if RequireAddPoints then
begin
New(pcp);
pcp.rc := Rect(strtoint(stext[2]), strtoint(stext[3]), strtoint(stext[2]) + FontManager.Default.TextWidth(cmdstr), strtoint(stext[3]) + 14);
pcp.rstr := cmdparam;
MDlgPoints.Add(pcp);
end;
ATexture := FontManager.GetFont('宋体', 9, [fsUnderline]).TextOut(stext[1]);
if SelectMenuStr = cmdparam then
dsurface.DrawBoldText(SurfaceX(strtoint(stext[2])),SurfaceY(strtoint(stext[3])), ATexture, clRed, clBlack)
else
dsurface.DrawBoldText(SurfaceX(strtoint(stext[2])),SurfaceY(strtoint(stext[3])), ATexture, clYellow, clBlack);
end;
cmdstr := '';
end;
stext.Free;
///cmdstr=想上/@想上
///
cmdparam := GetValidStr3(cmdstr, cmdstr, ['/']);
//cmdstr 想上 // cmdparam @想上
end
else
begin //两个对话框不显示.
DMenuDlg.Visible := False;
DSellDlg.Visible := False;
end;
//FData -> 我要上大学,你
if FData <> '' then
begin
var slx:integer;
slx:= pos(' ',FData);//空格出现的位置
if slx > 1 then //空格出现的位置大于1 就是不在第一位.
begin //从0开始 到出现位置除2+1
for var xxx2 := 0 to slx div 2 + 1 do
begin //rfIgnoreCase:勿略大小寫
FData := FData.Replace(' ', ' ', [rfIgnoreCase]);
end;
end;
//输出文本 坐标XY 字色背景色
dsurface.BoldTextOut(SurfaceX(Left + lx + sX), SurfaceY(Top + ly),
clWhite, clBlack, FData);
//得到x的偏移坐标.
sX := sX + FontManager.Default.TextWidth(FData);
end;
//cmdstr 想上
// cmdparam @想上
if fdata2 <> '' then
begin //有颜色的按色显示.
dsurface.BoldTextOut(SurfaceX(Left + lx + sX), SurfaceY(Top + ly),
cl, clBlack, fdata2);
//再取得x的位置.
sX := sX + FontManager.Default.TextWidth(fdata2);
end;
//cmdstr 想上
// cmdparam @想上
if cmdstr <> '' then
begin //需要添加点
if RequireAddPoints then
begin
New(pcp); //画出一个方框..用于点击的
pcp.rc := Rect(lx + sX, ly, lx + sX + FontManager.
Default.TextWidth(cmdstr), ly + 14);
pcp.rstr := cmdparam; //@想上
MDlgPoints.Add(pcp);//增加点到列表...
end;
//自定认画布 字体 字号 fsUnderline 设定文字的下划线效果
ATexture := FontManager.GetFont('宋体', 9, [fsUnderline])
.TextOut(cmdstr);
//确定颜色 如果相同的话 就是红色 不然就是黄色.
if SelectMenuStr = cmdparam then
dsurface.DrawBoldText(SurfaceX(Left + lx + sX),
SurfaceY(Top + ly), ATexture, clRed, clBlack)
else
dsurface.DrawBoldText(SurfaceX(Left + lx + sX),
SurfaceY(Top + ly), ATexture, clYellow, clBlack);
//再次取得x坐标.
sX := sX + FontManager.Default.TextWidth(cmdstr);
// dsurface.Canvas.Font.Style := dsurface.Canvas.Font.Style - [fsUnderline];
end;
end;
if data <> '' then //接上面 如果没有<>的话.直接显示文字.
//gl画面上显示文字吧..
//这里可以改变NPC的默认字色.和背景色.
dsurface.BoldTextOut(SurfaceX(Left + lx + sX), SurfaceY(Top + ly),
clWhite, clBlack, data);
end;
ly := ly + 16; //下一行y.
end;
////需要添加点为假 其它地方也会调用吧..
RequireAddPoints := False;
end;
end;主要是在原基础上增加了下面的一段的。
// <text:文字内容:X:Y/@触发>
ij := Pos('TEXT:', UpperCase(cmdstr));
stext := TStringList.Create;
if ij > 0 then
begin
DScreen.AddChatBoardString('有text.', clYellow, clRed);
// text:文字内容:X:Y/@触发
cmdparam :=GetValidStr3(cmdstr, scl, ['/']);
// scl= text:文字内容:X:Y
// cmdparam= @触发
ExtractStrings([':'], [' '], PChar(scl), stext);
/// stext[1] stext[2] stext[3]
dsurface.BoldTextOut(SurfaceX(strtoint(stext[2])), SurfaceY(strtoint(stext[3])),
clWhite, clBlack, stext[1]);
if stext[1] <> '' then
begin
if RequireAddPoints then
begin
New(pcp);
pcp.rc := Rect(strtoint(stext[2]), strtoint(stext[3]), strtoint(stext[2]) + FontManager.Default.TextWidth(cmdstr), strtoint(stext[3]) + 14);
pcp.rstr := cmdparam;
MDlgPoints.Add(pcp);
end;
ATexture := FontManager.GetFont('宋体', 9, [fsUnderline]).TextOut(stext[1]);
if SelectMenuStr = cmdparam then
dsurface.DrawBoldText(SurfaceX(strtoint(stext[2])),SurfaceY(strtoint(stext[3])), ATexture, clRed, clBlack)
else
dsurface.DrawBoldText(SurfaceX(strtoint(stext[2])),SurfaceY(strtoint(stext[3])), ATexture, clYellow, clBlack);
end;
cmdstr := '';
end;
声明:本文系互联网搜索而收集整理,不以盈利性为目的,文字、图文资料源于互联网且共享于互联网。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。