首页 > 其他分享 >原始翎风CLIENT8位 (9) magieff的学习

原始翎风CLIENT8位 (9) magieff的学习

时间:2024-05-07 22:33:05浏览次数:24  
标签:CLIENT8 效果 翎风 魔法 TMagicEff 坐标 magieff integer class

定义类型

这里的魔法效果,是扔出去的魔法效果,魔法释放后的效果
在施咒的动作的,如火球术的施咒效果图样是在自身的,却不在这里,
由Actor单元里面实现有个m_nCurEffFrame,

但是奇怪的是空间移动,是图样是在于自身这些效果,又是由本单元里面实现的。

 

TMagicType 枚举
开头mt
mtReady 准备?
mtFly 飞?
Bujauk是符的意思?
mtExploBujauk爆炸符?英韩混写
这从0-11的枚举,共有12个?
后面还有
mt12, mt13, mt14,
mt15, mt16 估计是干脆自己添加的?

TUseMagicInfo 这是个记录类型意思是使用魔法信息
TUseMagicInfo = record
ServerMagicCode: integer; //服务魔法码
MagicSerial: integer;
Target: integer; //recogcode
EffectType: TMagicType;//魔法类型?
EffectNumber: integer;
TargX: integer;
TargY: integer;
Recusion: Boolean; //递归
AniTime: integer;
end;

开始定义类了
TMagicEff = class 这个
其它的从它派生,
TBujaukGroundEffect = class(TMagicEff)
飞符,符魔防,符物防效果
TCharEffect = class(TMagicEff)
传送效果
TExploBujaukEffect = class(TMagicEff)
飞符,符爆炸,符隐身效果
TFireGunEffect = class(TMagicEff)

TFlyingBug = class(TMagicEff)
飞虫效果,1.8版本

TLightingEffect = class(TMagicEff)
TLightingEffect = class(TMagicEff)
TNormalDrawEffect = class(TMagicEff)
通用效果?
TThuderEffect = class(TMagicEff)

TFlyingAxe = class(TMagicEff)派生 TFlyingArrow = class(TFlyingAxe)
TFlyingFireBall = class(TFlyingAxe)
飞斧头效果,飞箭 ,飞火球效果1.8版本
TMapEffect = class(TMagicEff) 派生 TScrollHideEffect = class(TMapEffect)
地图效果, 卷轴隐藏效果

开始看TMagicEff = class
里面字段的字段名没有那么像ACTOR里面写的标准了。
还 NextEffect: TMagicEff; 下个效果?嵌套自己?
定义的复杂的点的字段有
MagOwner: TObject; //0x0C 施法者?
TargetActor: TObject; //0x10 目标着?
ImgLib: TWMImages;
其字段也是一个类,2个原始的类,一个具体点的类

坐标数据
一些标志

私有字段 帧时间,坐标

构建方法
传入的参数比较多
constructor TMagicEff.Create(id, effnum, sx, sy, tx, ty: integer; mtype:
TMagicType; Recusion: Boolean; anitime: integer);

id,指的magid
这个追踪了一下

effnum 效果编号?
mtype 魔法类型

图库指定ImgLib := g_WMagicImages;
根据魔法类型赋值帧相关的数据
start
frame
curframe
FixedEffect
Repetition
ExplosionFrame

不同的id,指的magid,帧的相关数据又有不同

 

.ServerMagicCode的取值
好像只有-1 ,0 ,1 和111?

 

TPlayScene.NewMagic里面建立TMagicEff.Create
然后添加到m_EffectList.Add(meff)队列中

而在
TPlayScene.DelMagic(magid: integer);删除魔法队列中的魔法时,是
根据这个magid和TMagicEff(m_EffectList[i]).ServerMagicId比较来删除的
所以这个ServerMagicId,magid纯粹是个编号?


不理解。
里面有几个公开的方法,
【1】TMagicEff.Create(id, effnum, sx, sy, tx, ty: integer; mtype:
TMagicType; Recusion: Boolean; anitime: integer);
作用是根据 mtype
对帧的一些初始数据进行设定
有个关键是 分为 基础效果,和爆炸效果
通过一个FixedEffect 修正效果来标示,当然开始都是基础效果了。

还有对坐标的设定,
坐标又涉及到地图坐标和屏幕坐标的变换,其变换好像是根据主角的地图坐标来为中心的,
方向的设定,这里方向是16的方向?

根据魔法的类型,有老魔法,也有新魔法, 这新魔法添加上去的就比较乱了,
感觉这套源码是本身只支持1.5,在1.5以后,1.8之前那段私服魔改添加个各种魔改,自行添加的新魔法技能,翅膀之类的。

【2】function TMagicEff.Shift: Boolean;
控制帧的步进,
还计算效果偏移的,也是说像火球,符,飞斧头,
是需要计算其轨迹坐标的,FLYX,FLYY?
说要Shift 的意思是偏移。
里面有个TMagicEff.GetFlyXY(ms: integer; var fx, fy: integer);的方法,
也是做这个的,但是没有地方被调用?

【3】function TMagicEff.Run: Boolean; //运行
调用SHIFT

【4】procedure TMagicEff.DrawEff(surface: TDirectDrawSurface);
这个是根据前面的方法得到的帧,坐标,进行绘图了。

其它的继承的类,大多是针对特定的效果,进行参数设置了。

 

标签:CLIENT8,效果,翎风,魔法,TMagicEff,坐标,magieff,integer,class
From: https://www.cnblogs.com/D7mir/p/18178576

相关文章

  • 原始翎风CLIENT8位 (7) 对于@(pcm^)的理解
    procedureTfrmMain.ClientGetMyMagics(body:string);vari:integer;data:string;pcm:PTClientMagic;beginfori:=0tog_MagicList.Count-1doDispose(PTClientMagic(g_MagicList[i]));//释放指针,g_MagicList.Clear;//清理列表whileTRUEdobegin......
  • 原始翎风CLIENT8位 (4) frmMain 下的 OnIdle 事件
    原始翎风CLIENT8位frmMain下的OnIdle事件在frmMain的Create中Application.OnIdle:=AppOnIdle;//程序空闲事件的方法procedureAppOnIdle(Sender:TObject;varDone:Boolean);原型是procedureTForm1.ApplicationEvents1Idle(Sender:TObject;varDone:Boolea......
  • 原始翎风CLIENT8位 (3) frmMain 下的 CSocket控件
    原始翎风CLIENT8位frmMain下的CSocket控件属性:在frmMain的FormCreate中g_ConnectionStep:=cnsLogin设置为登陆方式g_boSendLogin:=Falseg_boServerConnected:=FALSE根据读取的mir.ini文件给CSOCKET的ADDRESS,PORT赋值Socket.Address:=g_sServerAddr;CSocket.Port:......