原始翎風CLIENT8位 (9) magieff的學習

D7mir發表於2024-05-07

定義型別

這裡的魔法效果,是扔出去的魔法效果,魔法釋放後的效果
在施咒的動作的,如火球術的施咒效果圖樣是在自身的,卻不在這裡,
由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);
這個是根據前面的方法得到的幀,座標,進行繪圖了。

其它的繼承的類,大多是針對特定的效果,進行引數設定了。

相關文章