diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs b/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs index fde58e0..30613b4 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityMaterial.cs @@ -10,6 +10,11 @@ public float Friction { get; set; } = 140; /// + /// 旋转摩擦力 + /// + public float RotationFriction { get; set; } = 140; + + /// /// 落地之后是否回弹 /// public bool Bounce { get; set; } = true; diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs index 9d08aa8..95b1816 100644 --- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs +++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs @@ -1412,6 +1412,14 @@ return ActivityMaterial.Friction; } + /// + /// 获取当前旋转摩擦力 + /// + public float GetCurrentRotationFriction() + { + return ActivityMaterial.RotationFriction; + } + public long StartCoroutine(IEnumerator able) { return ProxyCoroutineHandler.ProxyStartCoroutine(ref _coroutineList, able); @@ -1452,9 +1460,9 @@ _processingBecomesStaticImage = true; EnableBehavior = false; - var staticImageCanvas = AffiliationArea.RoomInfo.StaticImageCanvas; - var position = staticImageCanvas.ToImageCanvasPosition(GlobalPosition); - staticImageCanvas.CanvasSprite.DrawActivityObjectInCanvas(this, position.X, position.Y, () => + var roomInfo = AffiliationArea.RoomInfo; + var position = roomInfo.ToImageCanvasPosition(GlobalPosition); + roomInfo.StaticImageCanvas.DrawActivityObjectInCanvas(this, position.X, position.Y, () => { Destroy(); }); diff --git a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs index fa074af..4d1ffae 100644 --- a/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs +++ b/DungeonShooting_Godot/src/framework/activity/components/MoveController.cs @@ -32,6 +32,20 @@ private Vector2 _basisVelocity = Vector2.Zero; /// + /// 是否是静止状态 + /// + public bool IsMotionless() + { + var v = Velocity; + foreach (var externalForce in _forceList) + { + v += externalForce.Velocity; + } + + return v == Vector2.Zero; + } + + /// /// 缩放所有外力对象的速率, 包括基础速率 /// public void ScaleAllVelocity(float scale) @@ -172,6 +186,7 @@ public ExternalForce AddForce(Vector2 velocity) { var force = AddForce("_anonymity_" + _index++); + force.AutoDestroy = true; force.Velocity = velocity; return force; } @@ -306,14 +321,17 @@ { Master.Rotation += rotationSpeed * delta; } - //衰减旋转速率 var friction = !Master.IsThrowing ? Master.GetCurrentFriction() : 0; + var rotationFriction = !Master.IsThrowing ? Mathf.DegToRad(Master.GetCurrentRotationFriction()) : 0; + //衰减旋转速率 for (var i = 0; i < _forceList.Count; i++) { var force = _forceList[i]; - if ((friction != 0 || force.RotationResistance != 0) && (force.EnableResistanceInTheAir || !Master.IsThrowing)) + var num = (force.EnableResistanceInTheAir || !Master.IsThrowing) ? force.RotationResistance : 0; + num += rotationFriction; + if (num != 0) { - force.RotationSpeed = Mathf.MoveToward(force.RotationSpeed, 0, (force.RotationResistance + friction) * delta); + force.RotationSpeed = Mathf.MoveToward(force.RotationSpeed, 0, num * delta); } } @@ -366,9 +384,11 @@ ); //力速度衰减 - if ((friction != 0 || force.VelocityResistance != 0) && (force.EnableResistanceInTheAir || !Master.IsThrowing)) + var num = (force.EnableResistanceInTheAir || !Master.IsThrowing) ? force.VelocityResistance : 0; + num += friction; + if (num != 0) { - force.Velocity = force.Velocity.MoveToward(Vector2.Zero, (friction + force.VelocityResistance) * delta); + force.Velocity = force.Velocity.MoveToward(Vector2.Zero, num * delta); } } } diff --git a/DungeonShooting_Godot/src/framework/common/SpiralUtil.cs b/DungeonShooting_Godot/src/framework/common/SpiralUtil.cs new file mode 100644 index 0000000..67d8a79 --- /dev/null +++ b/DungeonShooting_Godot/src/framework/common/SpiralUtil.cs @@ -0,0 +1,56 @@ +using Godot; + + +public static class SpiralUtil +{ + /// + /// 螺旋算法 顺时针 + /// 7 8 9 10 + /// 6 1 2 + /// 5 4 3 + /// + private static float[][] SCREW_CLOCKWISE = new float[][] { new float[] { 1, 2, 3, 4 }, new float[] { 4, 1, 2, 3 } }; + + /// + /// 螺旋算法 + /// + /// 当前序列 + /// 返回当前序列应该所在的位置 + public static Vector2I Screw(int index) + { + //总体思路是先找到第几圈 然后再找到第几个拐角 然后用switch + //因为一般序列都是从0开始的,所以此处加一以适应规则 + index++; + //如果求的是中心点 直接返回就行了 + if (index <= 1) return new Vector2I(0, 0); + + //开平方得到当前序列在哪个阶段中(阶段=第几圈*2) + var n = Mathf.Ceil(Mathf.Sqrt(index)); + var step = Mathf.FloorToInt(n / 2) * 2; + //求出当前序列是当前阶段中的第几个数 + var stepIndex = index - (step - 1) * (step - 1); + //求出当前序列在当前阶段中的第几条边上 + var stepStep = Mathf.CeilToInt((float)stepIndex / step); + //当前序列是当前边上第几个数 + var ssi = stepIndex % step; + if (ssi == 0) ssi = step; + + return new Vector2I( + GetValue(step, ssi, SCREW_CLOCKWISE[0][stepStep - 1]), + GetValue(step, ssi, SCREW_CLOCKWISE[1][stepStep - 1]) + ); + } + + private static int GetValue(int step, int ssi, float switchIndex) + { + switch (switchIndex) + { + case 1: return step / 2; + case 2: return step / 2 - ssi; + case 3: return -step / 2; + case 4: return -step / 2 + ssi; + } + + return 0; + } +} diff --git a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs index d7c6b33..fe66f00 100644 --- a/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs +++ b/DungeonShooting_Godot/src/framework/map/AffiliationArea.cs @@ -30,11 +30,6 @@ /// public bool IsFirstEnterFlag { get; private set; } = true; - /// - /// 静态渲染精灵根节点, 用于放置sprite - /// - public AffiliationSpriteRoot SpriteRoot { get; private set; } - private bool _init = false; private Vector2 _initSize; private RectangleShape2D _shape; @@ -53,9 +48,6 @@ _initSize = rect2.Size; RoomInfo = roomInfo; - SpriteRoot = new AffiliationSpriteRoot(this); - SpriteRoot.Name = "SpriteRoot"; - World.Current.StaticSpriteRoot.AddChild(SpriteRoot); var collisionShape = new CollisionShape2D(); collisionShape.GlobalPosition = rect2.Position + rect2.Size / 2; @@ -282,10 +274,6 @@ QueueFree(); _includeItems.Clear(); _enterItems.Clear(); - if (SpriteRoot != null) - { - SpriteRoot.Destroy(); - } } /// diff --git a/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs b/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs deleted file mode 100644 index fe1ae47..0000000 --- a/DungeonShooting_Godot/src/framework/map/image/AffiliationSpriteRoot.cs +++ /dev/null @@ -1,68 +0,0 @@ - -using System.Collections.Generic; -using Godot; - -/// -/// AffiliationArea 中用于存放静态Sprite的功能类 -/// -public partial class AffiliationSpriteRoot : Node2D, IDestroy -{ - private class SpriteData - { - public Vector2 Position; - public FreezeSprite FreezeSprite; - } - - public bool IsDestroyed { get; private set; } - - private readonly Grid> _grid = new Grid>(); - private readonly AffiliationArea _affiliationArea; - - public AffiliationSpriteRoot(AffiliationArea affiliationArea) - { - _affiliationArea = affiliationArea; - } - - public void Destroy() - { - if (IsDestroyed) - { - return; - } - - IsDestroyed = true; - - _grid.ForEach((x, y, data) => - { - foreach (var spriteData in data) - { - spriteData.FreezeSprite.Destroy(); - } - data.Clear(); - }); - _grid.Clear(); - QueueFree(); - } - - /// - /// 添加静态精灵 - /// - public void AddFreezeSprite(FreezeSprite freezeSprite) - { - - // var result = _freezeSprites.Add(freezeSprite); - // if (result) - // { - // - // } - // return result; - } - - /// - /// 移除静态精灵 - /// - public void RemoveFreezeSprite(FreezeSprite freezeSprite) - { - //return _freezeSprites.Remove(freezeSprite); - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs b/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs index 582f1c6..a828305 100644 --- a/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs +++ b/DungeonShooting_Godot/src/framework/map/image/FreezeSprite.cs @@ -53,16 +53,9 @@ return; } - IsFrozen = true; - Position = ActivityObject.Position; - affiliationArea.SpriteRoot.AddFreezeSprite(this); - _spriteIndex = ActivityObject.AnimatedSprite.GetIndex(); - _shadowIndex = ActivityObject.ShadowSprite.GetIndex(); - ActivityObject.ShadowSprite.Reparent(affiliationArea.SpriteRoot); - ActivityObject.AnimatedSprite.Reparent(affiliationArea.SpriteRoot); - _parent = ActivityObject.GetParent(); - _parent.RemoveChild(ActivityObject); + affiliationArea.RoomInfo.StaticSprite.AddFreezeSprite(this); + HandlerFreezeSprite(); } /// @@ -77,8 +70,25 @@ IsFrozen = false; - ActivityObject.AffiliationArea.SpriteRoot.AddFreezeSprite(this); + ActivityObject.AffiliationArea.RoomInfo.StaticSprite.RemoveFreezeSprite(this); + HandlerUnfreezeSprite(); + } + public void HandlerFreezeSprite() + { + IsFrozen = true; + var affiliationArea = ActivityObject.AffiliationArea; + _spriteIndex = ActivityObject.AnimatedSprite.GetIndex(); + _shadowIndex = ActivityObject.ShadowSprite.GetIndex(); + ActivityObject.ShadowSprite.Reparent(affiliationArea.RoomInfo.StaticSprite); + ActivityObject.AnimatedSprite.Reparent(affiliationArea.RoomInfo.StaticSprite); + _parent = ActivityObject.GetParent(); + _parent.RemoveChild(ActivityObject); + } + + public void HandlerUnfreezeSprite() + { + IsFrozen = false; _parent.AddChild(ActivityObject); ActivityObject.ShadowSprite.Reparent(_shadowParent); ActivityObject.AnimatedSprite.Reparent(_spriteParent); @@ -94,8 +104,8 @@ _shadowParent.MoveChild(ActivityObject.ShadowSprite, _shadowIndex); } } - - + + public void Destroy() { if (IsDestroyed) diff --git a/DungeonShooting_Godot/src/framework/map/image/RoomStaticImageCanvas.cs b/DungeonShooting_Godot/src/framework/map/image/RoomStaticImageCanvas.cs deleted file mode 100644 index 75b3da7..0000000 --- a/DungeonShooting_Godot/src/framework/map/image/RoomStaticImageCanvas.cs +++ /dev/null @@ -1,42 +0,0 @@ - -using Godot; - -public class RoomStaticImageCanvas : IDestroy -{ - public bool IsDestroyed { get; private set; } - /// - /// 画布节点实例 - /// - public ImageCanvas CanvasSprite { get; } - /// - /// 房间坐标相对于画布坐标偏移量, 单位: 像素 - /// - public Vector2I RoomOffset { get; set; } - - public RoomStaticImageCanvas(Node root, Vector2I position, int width, int height) - { - CanvasSprite = new ImageCanvas(width, height); - //CanvasSprite.Clear(new Color(1, 1, 1, 0.2f)); - CanvasSprite.GlobalPosition = position; - root.AddChild(CanvasSprite); - } - - /// - /// 将世界坐标转为画布下的坐标 - /// - public Vector2 ToImageCanvasPosition(Vector2 pos) - { - return pos - CanvasSprite.GlobalPosition; - } - - public void Destroy() - { - if (IsDestroyed) - { - return; - } - - IsDestroyed = true; - CanvasSprite.Destroy(); - } -} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs new file mode 100644 index 0000000..67464bc --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/image/RoomStaticSprite.cs @@ -0,0 +1,111 @@ + +using System.Collections.Generic; +using Godot; + +/// +/// RoomInfo 中用于存放静态Sprite的功能类 +/// +public partial class RoomStaticSprite : Node2D, IDestroy +{ + + public bool IsDestroyed { get; private set; } + + private readonly Grid> _grid = new Grid>(); + private readonly RoomInfo _roomInfo; + private readonly Vector2I _step; + + public RoomStaticSprite(RoomInfo roomInfo) + { + _roomInfo = roomInfo; + _step = new Vector2I(30, 30); + } + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; + + _grid.ForEach((x, y, data) => + { + foreach (var spriteData in data) + { + spriteData.Destroy(); + } + data.Clear(); + }); + _grid.Clear(); + QueueFree(); + } + + /// + /// 添加静态精灵 + /// + public void AddFreezeSprite(FreezeSprite freezeSprite) + { + var pos = ToGridPosition(freezeSprite.Position); + var list = _grid.Get(pos); + if (list == null) + { + list = new List(); + _grid.Set(pos, list); + } + list.Add(freezeSprite); + } + + /// + /// 移除静态精灵 + /// + public void RemoveFreezeSprite(FreezeSprite freezeSprite) + { + var pos = ToGridPosition(freezeSprite.Position); + var list = _grid.Get(pos); + if (list != null) + { + list.Remove(freezeSprite); + } + } + + public List CollisionCircle(Vector2 position, float radius, bool unfreeze = false) + { + var len = radius * radius; + var result = new List(); + var startPosition = ToGridPosition(new Vector2(position.X - radius, position.Y - radius)); + var endPosition = ToGridPosition(new Vector2(position.X + radius, position.Y + radius)); + for (var x = startPosition.X; x <= endPosition.X; x++) + { + for (var y = startPosition.Y; y <= endPosition.Y; y++) + { + var data = _grid.Get(x, y); + if (data != null) + { + for (var i = 0; i < data.Count; i++) + { + var freezeSprite = data[i]; + if (position.DistanceSquaredTo(freezeSprite.Position) < len) + { + result.Add(freezeSprite); + if (unfreeze) + { + freezeSprite.HandlerUnfreezeSprite(); + data.RemoveAt(i--); + } + } + } + } + } + } + + return result; + } + + private Vector2I ToGridPosition(Vector2 position) + { + var x = Mathf.FloorToInt(position.X / _step.X); + var y = Mathf.FloorToInt(position.Y / _step.Y); + return new Vector2I(x * _step.X, y * _step.Y); + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs index 93f52da..8883d1d 100644 --- a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs @@ -76,9 +76,19 @@ public AffiliationArea AffiliationArea; /// + /// 静态渲染精灵根节点, 用于放置sprite + /// + public RoomStaticSprite StaticSprite; + + /// /// 静态精灵绘制画布 /// - public RoomStaticImageCanvas StaticImageCanvas; + public ImageCanvas StaticImageCanvas; + + /// + /// 房间坐标相对于画布坐标偏移量, 单位: 像素 + /// + public Vector2I RoomOffset; /// /// 房间迷雾 @@ -263,6 +273,14 @@ return Size.Y * GameConfig.TileCellSize; } + /// + /// 将世界坐标转为画布下的坐标 + /// + public Vector2 ToImageCanvasPosition(Vector2 pos) + { + return pos - StaticImageCanvas.Position; + } + public void Destroy() { if (IsDestroyed) @@ -296,6 +314,12 @@ { StaticImageCanvas.Destroy(); } + + // + if (StaticSprite != null) + { + StaticSprite.Destroy(); + } //销毁迷雾 if (RoomFogMask != null) diff --git a/DungeonShooting_Godot/src/game/GameApplication.cs b/DungeonShooting_Godot/src/game/GameApplication.cs index cdffdd6..4f68013 100644 --- a/DungeonShooting_Godot/src/game/GameApplication.cs +++ b/DungeonShooting_Godot/src/game/GameApplication.cs @@ -108,6 +108,7 @@ //固定帧率 Engine.MaxFps = 60; //调试绘制开关 + Debug = true; ActivityObject.IsDebug = Debug; //Engine.TimeScale = 0.2f; diff --git a/DungeonShooting_Godot/src/game/activity/role/Role.cs b/DungeonShooting_Godot/src/game/activity/role/Role.cs index 130c95a..579739c 100644 --- a/DungeonShooting_Godot/src/game/activity/role/Role.cs +++ b/DungeonShooting_Godot/src/game/activity/role/Role.cs @@ -439,6 +439,10 @@ protected override void Process(float delta) { + if (IsDie) + { + return; + } if (_rollCoolingTimer > 0) { _rollCoolingTimer -= delta; diff --git a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs index 90caf12..f44a216 100644 --- a/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs +++ b/DungeonShooting_Godot/src/game/activity/role/enemy/Enemy.cs @@ -150,7 +150,10 @@ protected override void Process(float delta) { base.Process(delta); - + if (IsDie) + { + return; + } //目标在视野内的时间 var currState = StateController.CurrState; if (currState == AiStateEnum.AiSurround || currState == AiStateEnum.AiFollowUp) diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs index 300677a..7197d90 100644 --- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs +++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs @@ -1,3 +1,4 @@ +using System; using Godot; @@ -16,11 +17,6 @@ /// 玩家身上的状态机控制器 /// public StateController StateController { get; private set; } - - /// - /// 是否翻滚中 - /// - public bool IsRolling { get; private set; } /// /// 设置当前操作的玩家对象 @@ -74,11 +70,11 @@ protected override void Process(float delta) { + base.Process(delta); if (IsDie) { return; } - base.Process(delta); //脸的朝向 if (LookTarget == null) { @@ -182,22 +178,21 @@ ((Enemy)enemy).Hurt(1000, 0); } } + //测试用 + if (InputManager.Roll) //鼠标处触发互动物体 + { + var now = DateTime.Now; + var mousePosition = GetGlobalMousePosition(); + var freezeSprites = AffiliationArea.RoomInfo.StaticSprite.CollisionCircle(mousePosition, 25, true); + Debug.Log("检测数量: " + freezeSprites.Count + ", 用时: " + (DateTime.Now - now).TotalMilliseconds); + foreach (var freezeSprite in freezeSprites) + { + var temp = freezeSprite.Position - mousePosition; + freezeSprite.ActivityObject.MoveController.AddForce(temp.Normalized() * 300 * (25f - temp.Length()) / 25f); + } + } } - // protected override void PhysicsProcess(float delta) - // { - // if (IsDie) - // { - // return; - // } - // - // base.PhysicsProcess(delta); - // //处理移动 - // HandleMoveInput(delta); - // //播放动画 - // PlayAnim(); - // } - protected override void OnPickUpWeapon(Weapon weapon) { EventManager.EmitEvent(EventEnum.OnPlayerPickUpWeapon, weapon); @@ -329,6 +324,6 @@ protected override void DebugDraw() { base.DebugDraw(); - DrawArc(new Vector2(0, -8), 50, 0, Mathf.Pi * 2f, 20, Colors.Red, 1); + DrawArc(GetLocalMousePosition(), 25, 0, Mathf.Pi * 2f, 20, Colors.Red, 1); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/activity/shell/Shell.cs b/DungeonShooting_Godot/src/game/activity/shell/Shell.cs index 549fd3d..9f77443 100644 --- a/DungeonShooting_Godot/src/game/activity/shell/Shell.cs +++ b/DungeonShooting_Godot/src/game/activity/shell/Shell.cs @@ -12,29 +12,21 @@ ShadowOffset = new Vector2(0, 1); ThrowCollisionSize = new Vector2(5, 5); } - - protected override void OnThrowOver() + + protected override void Process(float delta) { - if (AffiliationArea != null) + //落地静止后将弹壳变为静态贴图 + if (!IsThrowing && MoveController.IsMotionless()) { - Freeze(); + if (AffiliationArea != null) + { + Freeze(); + } + else + { + Debug.Log("弹壳投抛到画布外了, 强制消除..."); + Destroy(); + } } } - - // protected override void Process(float delta) - // { - // //落地后将弹壳变为静态贴图 - // if (!IsThrowing) - // { - // if (AffiliationArea != null) - // { - // BecomesStaticImage(); - // } - // else - // { - // Debug.Log("弹壳投抛到画布外了, 强制消除..."); - // Destroy(); - // } - // } - // } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 69998c8..46871a4 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -325,6 +325,8 @@ CreateDoor(roomInfo); //创建房间归属区域 CreateRoomAffiliation(roomInfo); + //创建 RoomStaticSprite + CreateRoomStaticSprite(roomInfo); //创建静态精灵画布 CreateRoomStaticSpriteCanvas(roomInfo); //创建迷雾遮罩 @@ -411,6 +413,15 @@ World.AffiliationAreaRoot.AddChild(affiliation); } + //创建 RoomStaticSprite + private void CreateRoomStaticSprite(RoomInfo roomInfo) + { + var spriteRoot = new RoomStaticSprite(roomInfo); + spriteRoot.Name = "SpriteRoot"; + World.Current.StaticSpriteRoot.AddChild(spriteRoot); + roomInfo.StaticSprite = spriteRoot; + } + //创建静态精灵画布 private void CreateRoomStaticSpriteCanvas(RoomInfo roomInfo) { @@ -422,13 +433,11 @@ var maxX = rect.End.X + GameConfig.TileCellSize; var maxY = rect.End.Y + GameConfig.TileCellSize; - var staticSpriteCanvas = new RoomStaticImageCanvas( - roomInfo.AffiliationArea.SpriteRoot, - new Vector2I(minX, minY), - maxX - minX, maxY - minY - ); - staticSpriteCanvas.RoomOffset = new Vector2I(worldPos.X - minX, worldPos.Y - minY); - roomInfo.StaticImageCanvas = staticSpriteCanvas; + var canvasSprite = new ImageCanvas(maxX - minX, maxY - minY); + canvasSprite.Position = new Vector2I(minX, minY); + roomInfo.RoomOffset = new Vector2I(worldPos.X - minX, worldPos.Y - minY); + roomInfo.StaticImageCanvas = canvasSprite; + roomInfo.StaticSprite.AddChild(canvasSprite); } //创建迷雾遮罩 @@ -644,7 +653,7 @@ { if (GameApplication.Instance.Debug) { - if (_dungeonTileMap != null) + if (_dungeonTileMap != null && _roomStaticNavigationList != null) { //绘制ai寻路区域 Utils.DrawNavigationPolygon(this, _roomStaticNavigationList.ToArray());