原始翎风CLIENT8位 (2) frmMain 下的 DXDaw 控件

原始翎风CLIENT8位
frmMain 下的 DXDaw 控件

DXDraw: TDXDraw;
设置属性有 Align alClent
Display 800x600x8
Options [doAllowReboot,doWaitVBlank,doAllowPalette256,doSystemMemory,doCenter]

在frmmain.CREATE中的有关设置
g_boFirstTime为真
g_DXDraw:=DXDraw;
DXDraw.Options:=DXDraw.Options + [doFullScreen];控制设置是否全屏
DXDraw.Display.Width:=SCREENWIDTH; 设置其显示宽高,这个是属性
DXDraw.Display.Height:=SCREENHEIGHT;
MainWinHandle := DxDraw.Handle; // 主窗口句柄 建立联系,这个做什么?
MainWinHandle在DWinCtl单元中定义

Events

OnInitialize 初始化


初始化?判断 g_boFirstTime为真后运行 设置g_boFirstTime为假,保证OnInitialize 只初始化一次
DxDraw.SurfaceWidth := SCREENWIDTH; 这个是属性
DxDraw.SurfaceHeight := SCREENHEIGHT;
设置Surface 宽高?这个有Display的宽高,还有 本身的DXDraw 的宽高 3个地方?

鼠标设置
字体设置
DxDraw.Surface.Canvas.Font.Name := g_sCurFontName;
顺便将PlayScene.EdChat.Font.Name 也设置了

调用InitWMImagesLib(DxDraw);初始化素材库
g_WMainImages.DxDraw := DDxDraw; //属性 property
g_WMainImages.DDraw := DDxDraw.DDraw;
g_WMainImages.FileName := MAINIMAGEFILE;
g_WMainImages.LibType := ltUseCache;
g_WMainImages.Initialize;
将素材库的dxdraw 和 DDRAW 都 指定过来了?

建立在frmMain上的几十个wil控件也指定DDraw := DDxDraw.DDraw;并初始化。
//应该可以将WMOM**IMG 整合到 InitWMImagesLib(DxDraw);中
//而不必要控件 到frmMain上。


设置调色板,
读取调色板文件 NEARESTPALETTEINDEXFILE = 'Data\npal.idx'; //这个napl.idx 客户端是存在的
没有则建立一个

 

DScreen.Initialize;
PlayScene.Initialize;
FrmDlg.Initialize;
场景的初始化,对话框的初始化。

全屏和窗口的处理 全屏化好像有点不太对。
其设置了frmMain 的 Left := 0; //这里没有指定个控件窗口的,那默认是 是frmMain的?
Top := 0; //测试了下,改这里的数据,FrmMain和DXDRAW 并不完全吻合
Width := SCREENWIDTH; //但是实际是可以啊,DXD7是支持的
Height := SCREENHEIGHT;

建立 混合绘图表面
g_ImgMixSurface := TDirectDrawSurface.Create (frmMain.DxDraw.DDraw);

小地图绘图表面 g_MiniMapSurface := TDirectDrawSurface.Create (frmMain.DxDraw.DDraw);


OnFinalize
DXDrawFinalize
procedure TfrmMain.DXDrawFinalize(Sender: TObject);
begin
//DXTimer.Enabled := FALSE; 可以看出使用DX 定时器
end;

 

 

 

 

OnClick DXDawClick 取得鼠标在屏幕的位置GetCursorPos (pt) 后送到 g_DWinMan.Click (pt.X, pt.Y)处理

OnDbclick DXDrawDblClick 取得鼠标在屏幕的位置GetCursorPos (pt) 后送到 g_DWinMan.DblClick (pt.X, pt.Y处理


OnMouseDown
功能
mousedowntime := GetTickCount; //记录时间
g_nRunReadyCount := 0; //起步助跑计数清零
_DXDrawMouseDown (Sender, Button, Shift, X, Y); 调用 _DXDrawMouseDown

_DXDrawMouseDown功能 //鼠标落下操作

ActionKey := 0; //快捷键归0 F1-F8
g_nMouseX := X;
g_nMouseY := Y;
g_boAutoDig := FALSE; //自动挖矿取消

(Button = mbRight) and g_boItemMoving 否当前在移动物品 单击右键取消移动物品

鼠标点击在g_DWinMan窗口上了则跳出

(g_MySelf = nil) or (DScreen.CurrentScene <> PlayScene)
如果角色不存在或者当前不是游戏场景则跳出

那么以下只在游戏场景中,
判断是鼠标右键单击
如果仅是右键点击,增加 g_nDupSelection 这个参数是什么意思?
取得坐标上的角色PlayScene.GetAttackFocusCharacter(X, Y, g_nDupSelection, sel, FALSE);
if g_nDupSelection <> sel then g_nDupSelection := 0; 这句又是什么意思

如果右键点击目标角色不为空
如果CTRL 按下,不移动时间大于1秒,点击目标为玩家,没有死亡,则发送查询玩家数据,退出。
目标角色为空,则g_nDupSelection := 0

屏幕转换为地图坐标 g_nMouseCurrX, g_nMouseCurrY
判断 鼠标右键点击位置和角色,玩家XY小于2 ,则如果可以下一动作则 发送转身消息
大于2 ,设置可以跑 g_ChrAction,设置跑到的目的坐标 为点击的地图坐标 ,退出。

 

判断是鼠标左键单击
取得坐标上的角色
转换坐标 算出 地图坐标值
g_TargetCret := nil 目标什么?

如果 装备框 武器 名字 不为空,且点击的目标角色为空
如果装备武器 为 19 鹤嘴锄类
函数根据鼠标点击位置取得 方向
函数取得取得前方位置坐标
如果 CanNextAction and ServerAcceptNextAction and CanNextHit 发送挖矿消息CM_HIT+1
设置自动挖矿开关
退出

如果 同时按下ALT(这里没有方向调整,也没有和目标距离的判断?)
取得方向
如果CanNextAction and ServerAcceptNextAction,根据地图坐标得到 PlayScene.ButchAnimal 挖取目标
如果挖取目标不为空,发送挖物品消息SendButchAnimal,发送坐下消息g_MySelf.SendMsg 退出 ?
发送坐下消息g_MySelf.SendMsg

设置目标坐标无效

没有同时按下ALT
如果目标不为空,或者按下 shift
设置目标坐标无效
如果点击目标不为空
如果点击的目标是商人 发送点击商人的消息 SendClientMessage 。退出
如果点击的目标 没有死亡
点击目标赋值给当前目标
如果 点击目标不是商人,守卫 玩家。或者 按下 SHIFT ,或者敌人颜色 则砍 点击目标 AttackTarget (target);

否则(点击坐标的目标为空,但是SHIFT强制)
设置根据点击设置方向,
发送击打消息,(根据条件还有刺杀,半月)
否则(点击坐标的目标为空,没有SHIFT强制)
如果 判断 点击的自身坐标
计算方向,
捡物品 发送拾取物品消息SendPickup
否则 设置g_ChrAction := caRun(按下CTRL)或者caWalk,设置移动的目标位置为点击的鼠标位置。


OnMouseMove
如果 g_DWinMan.MouseMove 里面处理了则退出
玩家角色为空或者不是游戏场景 则退出
赋值 g_boSelectMyself 是否选择自己PlayScene.IsSelectMyself (X, Y);

根据坐标 PlayScene.GetAttackFocusCharacter 取得 坐标目标
if g_nDupSelection <> sel then g_nDupSelection := 0; 什么意思?

坐标目标不为空
如果目标角色 名字为空 ,查询玩家姓名,赋值查询时间
当前焦点目标赋值为坐标目标
否则焦点目标赋值为空

PlayScene.GetDropItems 取坐标 的掉落物品 赋值给g_FocusItem 焦点物品
如果焦点物品 不为空,
计算物品 地图坐标 到 屏幕坐标
显示提示DScreen.ShowHint 焦点物品 名称

否则 清理提示DScreen.ClearHint


对鼠标物品,状态物品,鼠标用户状态物品g_MouseItem.S.Name g_MouseStateItem.S.Name g_MouseUserStateItem.S.Name 清理
左键或右键 且距离上次鼠标按下时间大于300毫秒 下移动鼠标 调用 _DXDrawMouseDown(self, mbLeft, Shift, X, Y);
为什么是MBLEFT? 不过在_DXDrawMouseDown(self, mbLeft, Shift, X, Y);中主要是通过 Shift的值来判断的。
OnMouseUp

if g_DWinMan.MouseUp (Button, Shift, X, Y) then exit; 调用if g_DWinMan.MouseUp
g_nTargetX := -1; 设置目标无效

 

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