From a28ffab63e4fff9ddc9d764fb08364d894f7c40a Mon Sep 17 00:00:00 2001 From: shangfengh <3495281661@qq.com> Date: Sat, 29 Oct 2022 21:41:26 +0800 Subject: [PATCH] build: add GameObj.cs --- logic/GameClass/GameObj/GameObj.cs | 184 ++++++++++++++++++++++++++ logic/Preparation/Utility/EnumType.cs | 2 +- 2 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 logic/GameClass/GameObj/GameObj.cs diff --git a/logic/GameClass/GameObj/GameObj.cs b/logic/GameClass/GameObj/GameObj.cs new file mode 100644 index 0000000..8164961 --- /dev/null +++ b/logic/GameClass/GameObj/GameObj.cs @@ -0,0 +1,184 @@ +using Preparation.Interface; +using Preparation.Utility; +using System.Threading; + +namespace GameClass.GameObj +{ + /// + /// 一切游戏元素的总基类,与THUAI4不同,继承IMoveable接口(出于一切物体其实都是可运动的指导思想)——LHR + /// + public abstract class GameObj : IMoveable + { + protected readonly object gameObjLock = new(); + /// + /// 可移动物体专用锁 + /// + public object MoveLock => gameObjLock; + + protected readonly XY birthPos; + + private GameObjType type; + public GameObjType Type => type; + + private static long currentMaxID = 0; //目前游戏对象的最大ID + public const long invalidID = long.MaxValue; //无效的ID + public const long noneID = long.MinValue; + public long ID { get; } + + private XY position; + public XY Position + { + get => position; + protected set + { + lock (gameObjLock) + { + position = value; + } + } + } + public abstract bool IsRigid { get; } + + private XY facingDirection = new(1,0); + public XY FacingDirection + { + get => facingDirection; + set + { + lock (gameObjLock) + facingDirection = value; + } + } + public abstract ShapeType Shape { get; } + + private bool canMove; + public bool CanMove + { + get => canMove; + set + { + lock (gameObjLock) + { + canMove = value; + } + } + } + + private bool isMoving; + public bool IsMoving + { + get => isMoving; + set + { + lock (gameObjLock) + { + isMoving = value; + } + } + } + + private bool isResetting; + public bool IsResetting + { + get => isResetting; + set + { + lock (gameObjLock) + { + isResetting = value; + } + } + } + public bool IsAvailable => !IsMoving && CanMove && !IsResetting; //是否能接收指令 + public int Radius { get; } + + private PlaceType place; + public PlaceType Place + { + get => place; + set + { + lock (gameObjLock) + { + place = value; + } + } + } + protected int moveSpeed; + /// + /// 移动速度 + /// + public int MoveSpeed + { + get => moveSpeed; + set + { + lock (gameObjLock) + { + moveSpeed = value; + } + } + } + /// + /// 原初移动速度 + /// + private int orgMoveSpeed; + public int OrgMoveSpeed { get => orgMoveSpeed; protected set { orgMoveSpeed = value; } } + + // 移动,改变坐标 + public long Move(XY moveVec) + { + lock (gameObjLock) + { + FacingDirection = moveVec; + this.Position += moveVec; + } + return (long)(moveVec * moveVec); + } + /// + /// 设置位置 + /// + /// 新位置 + public void SetPosition(XY newpos) + { + Position = newpos; + } + /// + /// 设置移动速度 + /// + /// 新速度 + public void SetMoveSpeed(int newMoveSpeed) + { + MoveSpeed = newMoveSpeed; + } + /// + /// 复活时数据重置 + /// + public virtual void Reset() + { + lock (gameObjLock) + { + facingDirection = new XY(1,0); + isMoving = false; + canMove = false; + isResetting = true; + this.position = birthPos; + } + } + /// + /// 为了使IgnoreCollide多态化并使GameObj能不报错地继承IMoveable + /// 在xfgg点播下设计了这个抽象辅助方法,在具体类中实现 + /// + /// 依具体类及该方法参数而定,默认为false + protected virtual bool IgnoreCollideExecutor(IGameObj targetObj) => false; + bool IMoveable.IgnoreCollide(IGameObj targetObj) => IgnoreCollideExecutor(targetObj); + public GameObj(XY initPos, int initRadius, PlaceType initPlace, GameObjType initType) + { + this.Position = this.birthPos = initPos; + this.Radius = initRadius; + this.place = initPlace; + this.type = initType; + ID = Interlocked.Increment(ref currentMaxID); + } + } +} diff --git a/logic/Preparation/Utility/EnumType.cs b/logic/Preparation/Utility/EnumType.cs index 96a190a..1d20b79 100644 --- a/logic/Preparation/Utility/EnumType.cs +++ b/logic/Preparation/Utility/EnumType.cs @@ -55,7 +55,7 @@ namespace Preparation.Utility Spear = 4, Gem = 5, // 新增:宝石 } - public enum PassiveSkillType // 被动技能 + public enum CharacterType // 职业 { Null = 0, RecoverAfterBattle = 1,