依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 61|回复: 0

[游戏架设教程] 关于传奇引擎控制台的改进想法

[复制链接] 主动推送

2076

主题

2083

帖子

3214

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3214
发表于 2024-11-3 00:00:21 | 显示全部楼层 |阅读模式
关于传奇引擎控制台的改进想法

引擎控制台集成了许多设置处理事件,庞大的单元结构容易让思路不是很清晰,加上引用文件的定义,或多或少会让维护带来不变,在学习的过程中,将它重写一遍,不用第三方控件,实现的思路大概如下:

关于传奇引擎控制台的改进想法

关于传奇引擎控制台的改进想法

将操作界面适当扩大,后续按照标签增加服务端的脚本设置功能,所有涉及文本操作和线程监控的都写到一个程序里边,初步的服务端界面已经基本完成,实现的功能:
1.设置服务启动选项,去掉checkbox,原来大概有30多个,改用CheckListBox.
2.服务器设置不用INI文件和文本文件,在此增加了一access数据库,将代码尽量减少,设置尽量灵活.
3.端口批量处理操作,一机多服的时候进行端口批量加减操作,都用数据库来处理,数据库用的时候读,不用的时候关掉.
  1. unit gmain;//主单元,整个主单元不涉及功能实现部分

  2. interface

  3. uses
  4.   Classes, Controls, Forms, ComCtrls, CheckLst, StdCtrls, SysUtils;

  5. type
  6.   TFormMain = class(TForm)
  7.     PageControl: TPageControl;
  8.     ts1: TTabSheet;
  9.     ts2: TTabSheet;
  10.     btnDefaule: TButton;
  11.     CheckListBoxServerControl: TCheckListBox;
  12.     GroupBoxGameDIRDBSet: TGroupBox;
  13.     ......
  14.     btnSaveSettings: TButton;
  15.     btnDecOne: TButton;
  16.     procedure FormShow(Sender: TObject);
  17.     procedure CheckListBoxServerControlClick(Sender: TObject);
  18.     procedure btnDefauleClick(Sender: TObject);
  19.     procedure btnLoadSettingsClick(Sender: TObject);
  20.     procedure btnSaveSettingsClick(Sender: TObject);
  21.     procedure btnPortAddOneClick(Sender: TObject);
  22.     procedure btnDecOneClick(Sender: TObject);

  23.   private
  24.         { Private declarations }
  25.   public
  26.     { Public declarations }
  27.   end;

  28. var
  29.   FormMain: TFormMain;

  30. implementation

  31. uses
  32.   func;

  33. {$R *.dfm}

  34. procedure TFormMain.FormShow(Sender: TObject);
  35. begin
  36.   ServerControlSet(Load); //加载服务启动选项
  37. end;

  38. procedure TFormMain.CheckListBoxServerControlClick(Sender: TObject);
  39. begin
  40.   ServerControlSet(WriteIn);//更改服务启动选项,这个其实和上边的是一个过程
  41. end;

  42. procedure TFormMain.btnDefauleClick(Sender: TObject);
  43. begin
  44.   LoadConfig(DefaultConfig); //记载默认配置
  45. end;

  46. procedure TFormMain.btnLoadSettingsClick(Sender: TObject);
  47. begin
  48.   LoadConfig(CustomConfig); //加载自定义配置
  49. end;

  50. procedure TFormMain.btnSaveSettingsClick(Sender: TObject);
  51. begin
  52.   SaveConfig;  //保存配置
  53. end;

  54. procedure TFormMain.btnPortAddOneClick(Sender: TObject);
  55. begin
  56.   PortAdd(1);  //端口+1,原先想写到界面里边,现将参数固定到这里
  57. end;

  58. procedure TFormMain.btnDecOneClick(Sender: TObject);
  59. begin
  60.   PortAdd(-1); //端口-1
  61. end;
复制代码
功能实现部分放到函数处理单元,但是怎么尽量不使用可视化控件我还没有理清楚,基本的功能都集中到了这个单元,还有个消息单元正在编写,常量准备放到一个单元,之前applem2端的所有常量我正在按关系进行分类,之后都会整理到一个单元.
下边的函数单元看起来还是有点乱
  1. unit func; //数据处理函数单元,主要用于原先INI和TXT的服务设置部分

  2. interface

  3. uses
  4.   Classes, Controls, CheckLst, StdCtrls,SysUtils;
  5. type
  6.   ServerControl = (Load, WriteIn);{加载,写入}
  7.   ServerConfig=(DefaultConfig,CustomConfig);{默认设置,自定义设置}
  8.   procedure ServerControlSet(Flags: ServerControl);
  9.   procedure LoadConfig(Flags:ServerConfig);
  10.   procedure SaveConfig;
  11.   procedure PortAdd(Num: Integer);
  12. implementation

  13. uses
  14.   dmmain, gmain;

  15. procedure ServerControlSet(Flags: ServerControl);
  16. var
  17.   i: integer;
  18. begin
  19.   DM.Connect(True);
  20.   with DM.TableServerControl do
  21.   begin
  22.     Open;
  23.     if Flags = Load then
  24.     begin
  25.       for i := 1 to FieldCount - 1 do
  26.       begin
  27.         FormMain.CheckListBoxServerControl.Items.Add(Fields[i].FieldName);
  28.         FormMain.CheckListBoxServerControl.Checked[i - 1] := Fields[i].Value;
  29.       end;
  30.     end
  31.     else if Flags = WriteIn then
  32.     begin
  33.       Edit;
  34.       for i := 1 to FieldCount - 1 do
  35.       begin
  36.         Fields[i].Value := FormMain.CheckListBoxServerControl.Checked[i - 1];
  37.       end;
  38.       Post;
  39.     end;
  40.     Close;
  41.   end;
  42.   DM.Connect(False);
  43. end;

  44. procedure LoadConfig(Flags:ServerConfig);
  45. var
  46.   i: Integer;
  47. begin
  48.   dm.Connect(True);
  49.   DM.TablePointAndPort.Open;
  50.   if Flags=DefaultConfig then
  51.   begin
  52.     DM.TablePointAndPort.Last;//数据表第二行(一共两行),默认设置
  53.   end
  54.   else
  55.   begin
  56.     DM.TablePointAndPort.First;//数据表第一行(一共两行),自定义设置
  57.   end;
  58.   with FormMain do
  59.   begin
  60.     for i := 0 to ComponentCount - 1 do
  61.     begin
  62.       if Components[i] is TEdit then
  63.       begin
  64.         if Components[i].Tag > 0 then //将编辑框按标签分组,遍历从数据库中读取
  65.         begin
  66.           TEdit(Components[i]).Text := DM.TablePointAndPort.Fields[Components[i].Tag].Value;
  67.         end;
  68.       end;
  69.     end;
  70.   end;
  71.   DM.TablePointAndPort.Close;
  72.   DM.Connect(False);
  73. end;

  74. procedure SaveConfig; //保存设置
  75. var
  76.   i: Integer;
  77. begin
  78.   Dm.Connect(True);
  79.   DM.TablePointAndPort.Open;
  80.   DM.TablePointAndPort.First;
  81.   DM.TablePointAndPort.Edit;
  82.   with FormMain do
  83.   begin
  84.     for i := 0 to ComponentCount - 1 do
  85.     begin
  86.       if Components[i] is TEdit then
  87.       begin
  88.         if Components[i].Tag > 0 then
  89.         begin
  90.           DM.TablePointAndPort.Fields[Components[i].Tag].Value := TEdit(Components[i]).Text;
  91.         end;
  92.       end;
  93.     end;
  94.   end;
  95.   DM.TablePointAndPort.Post;
  96.   DM.TablePointAndPort.Close;
  97.   DM.Connect(False);
  98. end;

  99. procedure PortAdd(Num: Integer);
  100. var
  101.   i: Integer;
  102. begin
  103.   with FormMain do
  104.   begin
  105.     for i := 0 to ComponentCount - 1 do
  106.     begin
  107.       if Components[i] is TEdit then
  108.       begin
  109.         if (Components[i].Tag in [3, 4, 7, 8, 11..13, 16, 19, 20, 23, 28..35]) then
  110.         begin
  111.           TEdit(Components[i]).Text := IntToStr(StrToIntDef(TEdit(Components[i]).Text, 0) + Num);
  112.         end;
  113.       end;
  114.     end;
  115.   end;
  116. end;

  117. end.
复制代码
原先的设置都保存在INI文件和文本文件中,我将不需要用作M2脚本的都规整出来,放到access中,先看看一部分启动选项和窗口端口设置:

关于传奇引擎控制台的改进想法

关于传奇引擎控制台的改进想法
接下来的设置文件还需要好多表,我觉得使用数据库处理,关系比较容易弄清楚,虽然不如INI简洁\高效,其实所有的设置都可以放到一个XML里边,不过对那个我不是很熟悉,在没有把引用关系搞明白之前,先用数据库代替.
到这里,原先11个界面的处理过程放到了一个页面,并且功能一点都不少,程序看起来也很容易理解,对比原先服务端的代码,我发现这样的处理方式要好很多,至少不用在INI读写时费那么多脑筋,但是在服务启动过程中通过数据库读取配置就不是那么容易和高效了,但我用自己的方式去理解了,我就学到了.整个服务端打算用1年时间重构一遍,我会尽量不用任何第三方控件,这就要牺牲运行效率了,毕竟原端有好多优秀的控件,先不去考虑它,主要为的是学习.自己为自己加油.

关注过程,不知不觉就发现了结果原来如此...

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-11-24 01:06

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表