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());