AD商业广告自由选择
AD商业广告自由选择

增加对话框 设置NPC文字坐标

正文概述 开源人   2025-11-28 11:08:41  
本来以为会很复杂 的。ivo1234FCOM专注游戏工具及源码例子分享
参考了其它引擎源码。其实也没有很多的功能。ivo1234FCOM专注游戏工具及源码例子分享
想了一上。其实也是不难的。就是检测有什么显示什么吧。。ivo1234FCOM专注游戏工具及源码例子分享
但是有些功能暂时不会实现ivo1234FCOM专注游戏工具及源码例子分享
如 对话框显示图像等。暂时不知那个是显示绘图之类的函数 相信以后可能慢慢就会的了吧。。。ivo1234FCOM专注游戏工具及源码例子分享
找到显示图的函数 又可以实现不少东西的了。ivo1234FCOM专注游戏工具及源码例子分享
ivo1234FCOM专注游戏工具及源码例子分享
参考ivo1234FCOM专注游戏工具及源码例子分享
设置NPC文字坐标ivo1234FCOM专注游戏工具及源码例子分享
<Text:文字内容:X:Y/@触发>ivo1234FCOM专注游戏工具及源码例子分享
<Text:测试下这段文字的显示|提示信息:10:20/@测试>ivo1234FCOM专注游戏工具及源码例子分享
<Text:<$STR(S87)>|提示信息:10:20{FCOLOR=250}/@测试>ivo1234FCOM专注游戏工具及源码例子分享
<Text:测试下这段文字的显示|提示信息:10:20{FCOLOR=254}/@测试>ivo1234FCOM专注游戏工具及源码例子分享
<Text:测试下这段文字的显示|提示信息:10:20{AUTOCOLOR=250,251,252,253,254}/@测试>ivo1234FCOM专注游戏工具及源码例子分享
ivo1234FCOM专注游戏工具及源码例子分享
ivo1234FCOM专注游戏工具及源码例子分享
ivo1234FCOM专注游戏工具及源码例子分享
可惜只是完成了。<text:文字内容:X:Y/@触发> 这种。。ivo1234FCOM专注游戏工具及源码例子分享
|提示信息: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;
ivo1234FCOM专注游戏工具及源码例子分享
 


声明:本文系互联网搜索而收集整理,不以盈利性为目的,文字、图文资料源于互联网且共享于互联网。
如有侵权,请联系 yao4fvip#qq.com (#改@) 删除。