原始翎风CLIENT8位 (1) 重新认识frmMain 从事件的角度

原始翎风CLIENT8位
frmMain

重新认识
从事件的角度
定义一个TfrmMain 类 这个叫什么?主界面?主窗口 继承于 TDxForm
frmMain 是它的实例,类变量

它有FormCreate,FormDestory,FormClose,FormKeyDown,FormKeyPress 个事件。

此外还将Application.OnIdle 挂到了 AppOnIdle过程中。

使用了CmdTimer,MinTimer,MouserTimer,SelChrWaitTimer,SpeedHackTimer,Timer1,WaitMsgMimer 7个定时器
CmdTimer常关闭,1000间隔,处理跟网络连接有关的几个事件 ,切换游戏登陆的几个步骤
MinTimer常使能,1000间隔执行一次?查询队友 和 清理删除角色
MouseTimer常使能 间隔50,获取鼠标位置,处理快捷技能ActionKey ,普通攻击,强制攻击,自动挖矿,自动捡取
SelChrWaitTimer//常不能,需要的时候开启 3300间隔,用来在选择服务器后开启,等待一段时间后进入选择角色状态(等待“开门”的动画
完成)

SpeedHackTimer 常使能 间隔250,常使能
作用是250毫秒判断一次开机时间计数和当前时间转换后的计算差,差大于70,累计4次关闭程序?
感觉作用不大,如果是时间来自服务器端,或者其它时间服务器倒是可以

WaitMsgTimer 常不能 间隔1,
在DecodeMessagePacket消息处理的 g_boMapMoving判断中使能
判断地图是否改变,如果改变地图只是处理地图改变下的 清理,再发送地图改变消息

Timer1 常使能 间隔10 对接受的消息 提取,送到DecodeMessagePacket (data);处理 ,发送查询售卖,修理价格的消息,还有个打开加点的
菜单窗口也在这里了。


通信部分
CSocket

绘图部分
DXDraw

FormCreate事件

INI文件指向nil ,避免乱指针?

建立自动拾取列表,显示物品列表 g_AutoPickupList g_ShowItemList
DX窗口 g_DWinMan建立
g_DXDraw:=DXDraw; 挂钩

读取 mir.ini文件 赋值g_sServerAddr g_nServerPort 服务器地址,端口

全屏设置是否?

建立各种素材库。如人物,地砖,武器,魔法,头发,物品 素材 如:g_WMainImages:= TWMImages.Create(AOwner);
(但是其在DXDraw中才属性赋值,初始化)(对于WMon**这种怪物素材,用的是组件方式)

NPC 图片列表 物品图片列表 武器图片列表 人物图片列表 这里是列表的建立LIST

声音g_DXSound 建立,初始化
g_Sound引擎建立
g_SoundList 声音列表建立,
载入'.\wav\sound.lst'载入列表

设置 DXDraw.Display.高,宽

g_ToolMenuHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, 0, GetCurrentThreadID);

WH_KEYBOARD Hook
在应用程序中,WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息,这些消息通过GetMessage or PeekMessage function返回。可以使
用这个Hook来监视输入到消息队列中的键盘消息。

Alt键18
Enter键13
Tab键 9

用来监视 监视 Tab键 9 Alt键18 按下 FrmMain.WindowState := wsMinimized;最小化?

几个场景对象建立。
DScreen :TDrawScreen;
IntroScene :TIntroScene;
LoginScene :TLoginScene;
SelectChrScene :TSelectChrScene;
PlayScene :TPlayScene;
LoginNoticeScene :TLoginNotice;


地图对象建立Map
g_DropedItemList
g_MagicList
g_FreeActorList 自由角色列表建立
EventMan 事件管理器建立?

g_ChangeFaceReadyList 这个是什么?改变脸准备列表?
g_ServerList

背包物品,交易物品,填充0

保存物品列表,菜单物品列表建立,

等待使用的物品,吃的物品 名称 为空

目标坐标为-1
目标对象 设置空

各种记时 =0,

设置登陆的步骤g_ConnectionStep

一些角色 参数开关的设置

MainWinHandle := DxDraw.Handle DX窗口 指定到DX

根据读取的mir.ini 文件 给 CSOCKET 的 ADDRESS ,PORT 复制

设置 插座 活动 网络连接 CSocket.Active:=True;

处理异常事件 的方法指定

程序空闲事件 的方法指定

FormDestroy 事件:

FormDestroy 事件是一个在窗体销毁时触发的事件。
这个事件通常用于释放在窗体生命周期内创建的资源,如对象、数据结构、内存分配等。
当窗体关闭时,窗体的 OnDestroy 事件处理程序将被触发。

FormClose 事件:

FormClose 事件是一个在窗体即将关闭时触发的事件。
这个事件通常用于询问用户是否保存未保存的更改、执行清理操作、防止窗体关闭等。
FormClose 事件有一个 Action 参数,可以设置为 caNone(取消关闭)、caHide(隐藏窗体)、caFree(销毁窗体)等不同的值,用于确定窗
体的关闭行为。

FormClose

联系和关系:

FormClose 事件通常在窗体即将关闭时触发,可以用来处理关闭窗体前的逻辑,包括询问用户是否保存数据、执行清理操作等。
FormDestroy 事件在窗体销毁时触发,用于释放资源。通常,FormDestroy 事件会在 FormClose 事件之后触发,因为窗体关闭时会导致窗体最
终被销毁。
如果你需要在窗体关闭时进行资源释放,通常会在 FormDestroy 事件中执行,而在 FormClose 事件中处理用户是否取消关闭等交互逻辑。
你可以通过 Action 参数来控制窗体关闭的行为,例如,你可以在 FormClose 事件中将 Action 设置为 caNone 来取消关闭窗体,或者设置为
caFree 来销毁窗体。
总之,FormDestroy 和 FormClose 事件是在Delphi窗体中管理关闭和销毁的两个重要事件,它们允许你在窗体关闭前和窗体销毁时执行特定的
操作。


FormDestroy


清理 显示物品列表

显示物品列表释放


显示物品列表指向空

自动拾取列表释放

键盘钩子释放

2个定时器停止

素材库释放Finalize free

图片列表结束

场景结束,释放

地图释放,掉落物品列表等释放

声音,声音列表释放


FormKeyDown
判断 VK_PAUSE 截图
到 g_DWinMan.KeyDown 里面去处理一下,根据返回值来决定要不要退出,
判断没有角色存在,或者现在的场景不是游戏场景 退出
获取角色的 位置当前所在地图座标X m表示地图吗 不是是表示man 人物的意思

判断是f1到F8的魔法快捷键 赋值给ActionKey
F9 打开背包
F10 角色装备
f11 角色技能
CTRL ALT F12 内挂?f12 声音开关
CRTL H 攻击模式 SendSay ('@AttackMode')
CTRL A 设置召唤怪 休息模式
crtl d 密码 发送空密码?没有作用
CTRL F 改变字体
CTRL Z显示地面物品开关 Z 对话框不可见
atl x 强行退出,判断无法强制退出 AppLogOut 小退
ALT Q 强行退出,判断无法强制退出,AppExit 大退。
v 显示小地图
t 交易尝试 FrmMain.SendDealTry
CTRL G 组队 ALT G 删除队员 g团队对话框
P 现在组队面板ToggleShowGroupDlg
c 角色 面板
i 背包
s 技能面板
C 好友面板
M 调整属性?OpenAdjustAbility
VK_UP VK_DOW VK_PRIOR VK_NEXT DScreen的ChatBoard翻页

 

FormKeyPress
先到DWINMAN里面去处理?
判断当前场景为游戏场景
判断游戏聊天框可见则退出?
1~6 快捷吃药键
ESC 取消键
空格键 游戏聊天输入框打开
聊天输入框使能
聊天输入框使焦
输入法挂钩
喊话模式
普通发言模式
@,! ,/ 键处理
聊天输入框使能
聊天输入框使焦
/ 低语?私聊, 加名字
其它其它发言模式处理PlayScene.EdChat.Text := key

 

key := #0;表示已经处理

 

 




 

posted @ 2023-10-21 09:48  D7mir  阅读(113)  评论(0)    收藏  举报