原始翎风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;表示已经处理