diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
index 8ba098e..caee3da 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityObject.cs
@@ -45,7 +45,7 @@
///
/// 是否正在投抛过程中
///
- public bool IsThrowing => _throwData != null && !_throwData.IsOver;
+ public bool IsThrowing => _fallData != null && !_fallData.IsFallOver;
///
/// 阴影偏移
@@ -81,7 +81,22 @@
}
}
}
+
+ ///
+ /// 当前物体的海拔高度, 如果大于0, 则会做自由落体运动
+ ///
+ public float Altitude { get; set; }
+ ///
+ /// 物体纵轴移动速度, 如果设置大于0, 就可以营造向上投抛物体的效果, 该值会随着重力加速度衰减
+ ///
+ public float VerticalSpeed { get; set; }
+
+ ///
+ /// 物体旋转速度, 角度制
+ ///
+ public float RotationDegreesSpeed { get; set; }
+
//组件集合
private List> _components = new List>();
//是否初始化阴影
@@ -99,7 +114,7 @@
private ShaderMaterial _blendShaderMaterial;
//存储投抛该物体时所产生的数据
- private ActivityThrowData _throwData;
+ private ActivityThrowData _fallData;
//所在层级
private RoomLayerEnum _currLayer;
@@ -112,8 +127,14 @@
//模板实例
private ActivityObjectTemplate _templateInstance;
+ //物体所在区域
private AffiliationArea _affiliationArea;
+
+ //落到地上回弹的速度
+ private float _resilienceVerticalSpeed = 0;
+ private bool _hasResilienceVerticalSpeed = false;
+ //实例索引
private static long _instanceIndex = 0;
//初始化节点
@@ -444,33 +465,15 @@
public void Throw(Vector2 size, Vector2 start, float startHeight, float direction, float xSpeed,
float ySpeed, float rotate, bool bounce = false, float bounceStrength = 0.5f, float bounceSpeed = 0.8f)
{
- if (_throwData == null)
- {
- _throwData = new ActivityThrowData();
- }
-
- SetThrowCollision();
-
- _throwData.IsOver = false;
- _throwData.Size = size;
- _throwData.StartPosition = _throwData.CurrPosition = start;
- _throwData.Direction = direction;
- _throwData.XSpeed = xSpeed;
- _throwData.YSpeed = ySpeed;
- _throwData.StartXSpeed = xSpeed;
- _throwData.StartYSpeed = ySpeed;
- _throwData.RotateSpeed = rotate;
- _throwData.ThrowForce = MoveController.AddConstantForce("ThrowForce");
- _throwData.ThrowForce.Velocity =
- new Vector2(_throwData.XSpeed, 0).Rotated(_throwData.Direction * Mathf.Pi / 180);
- _throwData.Y = startHeight;
- _throwData.Bounce = bounce;
- _throwData.BounceStrength = bounceStrength;
- _throwData.BounceSpeed = bounceSpeed;
-
- _throwData.RectangleShape.Size = _throwData.Size * 0.5f;
-
- Throw();
+ GlobalPosition = start;
+ VerticalSpeed = ySpeed;
+ RotationDegreesSpeed = rotate;
+ Altitude = startHeight;
+ // _fallData.Bounce = bounce;
+ // _fallData.BounceStrength = bounceStrength;
+ // _fallData.BounceSpeed = bounceSpeed;
+ //
+ // _fallData.RectangleShape.Size = _fallData.Size * 0.5f;
}
///
@@ -478,7 +481,7 @@
///
public void StopThrow()
{
- _throwData.IsOver = true;
+ _fallData.IsFallOver = true;
RestoreCollision();
}
@@ -566,19 +569,113 @@
}
}
- //投抛计算
- if (_throwData != null && !_throwData.IsOver)
+ // 下坠判定
+ if (Altitude > 0 || VerticalSpeed != 0)
{
- GlobalRotationDegrees = GlobalRotationDegrees + _throwData.RotateSpeed * newDelta;
+ if (_fallData == null)
+ {
+ _fallData = new ActivityThrowData();
+ }
+
+ if (_fallData.IsFallOver) // 没有处于下坠状态, 则进入下坠状态
+ {
+ SetFallCollision();
+
+ _fallData.IsFallOver = false;
+ _fallData.FirstFall = true;
+ _fallData.Size = new Vector2(10, 10);
+ _fallData.Bounce = true;
+ _fallData.BounceStrength = 0.5f;
+ _fallData.BounceSpeed = 0.8f;
+ _hasResilienceVerticalSpeed = false;
+ _resilienceVerticalSpeed = 0;
+
+ _fallData.RectangleShape.Size = _fallData.Size * 0.5f;
+
+ Throw();
+ }
+ else
+ {
+ GlobalRotationDegrees = GlobalRotationDegrees + RotationDegreesSpeed * newDelta;
+ CalcThrowAnimatedPosition();
+
+ var ysp = VerticalSpeed;
+
+ Altitude += VerticalSpeed * newDelta;
+ VerticalSpeed -= GameConfig.G * newDelta;
+
+ //当高度大于16时, 显示在所有物体上
+ if (Altitude >= 16)
+ {
+ AnimatedSprite.ZIndex = 20;
+ }
+ else
+ {
+ AnimatedSprite.ZIndex = 0;
+ }
+
+ //达到最高点
+ if (ysp > 0 && ysp * VerticalSpeed < 0)
+ {
+ OnThrowMaxHeight(Altitude);
+ }
+
+ //落地判断
+ if (Altitude <= 0)
+ {
+ _fallData.IsFallOver = true;
+ Altitude = 0;
+
+ //第一次接触地面
+ if (_fallData.FirstFall)
+ {
+ _fallData.FirstFall = false;
+ OnFirstFallToGround();
+ }
+
+ //如果落地高度不够低, 再抛一次
+ if (_fallData.Bounce && (!_hasResilienceVerticalSpeed || _resilienceVerticalSpeed > 1))
+ {
+ Velocity = Velocity * _fallData.BounceSpeed;
+ if (!_hasResilienceVerticalSpeed)
+ {
+ _hasResilienceVerticalSpeed = true;
+ _resilienceVerticalSpeed = -VerticalSpeed * _fallData.BounceStrength;
+ }
+ else
+ {
+ _resilienceVerticalSpeed = _resilienceVerticalSpeed * _fallData.BounceStrength;
+ }
+ VerticalSpeed = _resilienceVerticalSpeed;
+ RotationDegreesSpeed = RotationDegreesSpeed * _fallData.BounceStrength;
+ _fallData.IsFallOver = false;
+
+ OnFallToGround();
+ }
+ else //结束
+ {
+ VerticalSpeed = 0;
+ OnFallToGround();
+ ThrowOver();
+ }
+ }
+ }
+ }
+
+ /*
+ //投抛计算
+ if (_fallData != null && !_fallData.IsFallOver)
+ {
+ GlobalRotationDegrees = GlobalRotationDegrees + _fallData.RotateSpeed * newDelta;
CalcThrowAnimatedPosition();
- var ysp = _throwData.YSpeed;
+ var ysp = _fallData.YSpeed;
- _throwData.Y += _throwData.YSpeed * newDelta;
- _throwData.YSpeed -= GameConfig.G * newDelta;
+ Altitude += _fallData.YSpeed * newDelta;
+ _fallData.YSpeed -= GameConfig.G * newDelta;
//当高度大于16时, 显示在所有物体上
- if (_throwData.Y >= 16)
+ if (Altitude >= 16)
{
AnimatedSprite.ZIndex = 20;
}
@@ -588,35 +685,34 @@
}
//达到最高点
- if (ysp * _throwData.YSpeed < 0)
+ if (ysp * _fallData.YSpeed < 0)
{
- OnThrowMaxHeight(_throwData.Y);
+ OnThrowMaxHeight(Altitude);
}
//落地判断
- if (_throwData.Y <= 0)
+ if (Altitude <= 0)
{
-
- _throwData.IsOver = true;
+ _fallData.IsFallOver = true;
//第一次接触地面
- if (_throwData.FirstOver)
+ if (_fallData.FirstFallOver)
{
- _throwData.FirstOver = false;
+ _fallData.FirstFallOver = false;
OnFirstFallToGround();
}
//如果落地高度不够低, 再抛一次
- if (_throwData.StartYSpeed > 1 && _throwData.Bounce)
+ if (_fallData.StartYSpeed > 1 && _fallData.Bounce)
{
- _throwData.StartPosition = Position;
- _throwData.Y = 0;
- _throwData.XSpeed = _throwData.StartXSpeed = _throwData.StartXSpeed * _throwData.BounceSpeed;
- _throwData.YSpeed = _throwData.StartYSpeed = _throwData.StartYSpeed * _throwData.BounceStrength;
- _throwData.RotateSpeed = _throwData.RotateSpeed * _throwData.BounceStrength;
- _throwData.ThrowForce.Velocity *= _throwData.BounceSpeed;
- _throwData.FirstOver = false;
- _throwData.IsOver = false;
+ _fallData.StartPosition = Position;
+ Altitude = 0;
+ _fallData.XSpeed = _fallData.StartXSpeed = _fallData.StartXSpeed * _fallData.BounceSpeed;
+ _fallData.YSpeed = _fallData.StartYSpeed = _fallData.StartYSpeed * _fallData.BounceStrength;
+ _fallData.RotateSpeed = _fallData.RotateSpeed * _fallData.BounceStrength;
+ _fallData.ThrowForce.Velocity *= _fallData.BounceSpeed;
+ _fallData.FirstFallOver = false;
+ _fallData.IsFallOver = false;
OnFallToGround();
}
@@ -627,6 +723,7 @@
}
}
}
+ */
//阴影
if (ShadowSprite.Visible)
@@ -826,9 +923,9 @@
ShadowSprite.Rotation = 0;
//阴影位置计算
var pos = AnimatedSprite.GlobalPosition;
- if (_throwData != null && !_throwData.IsOver)
+ if (_fallData != null && !_fallData.IsFallOver)
{
- ShadowSprite.GlobalPosition = new Vector2(pos.X + ShadowOffset.X, pos.Y + ShadowOffset.Y + _throwData.Y);
+ ShadowSprite.GlobalPosition = new Vector2(pos.X + ShadowOffset.X, pos.Y + ShadowOffset.Y + Altitude);
}
else
{
@@ -841,11 +938,11 @@
{
if (Scale.Y < 0)
{
- AnimatedSprite.GlobalPosition = GlobalPosition + new Vector2(0, -_throwData.Y) - _throwData.OriginSpritePosition.Rotated(Rotation) * Scale.Abs();
+ AnimatedSprite.GlobalPosition = GlobalPosition + new Vector2(0, -Altitude) - _fallData.OriginSpritePosition.Rotated(Rotation) * Scale.Abs();
}
else
{
- AnimatedSprite.GlobalPosition = GlobalPosition + new Vector2(0, -_throwData.Y) + _throwData.OriginSpritePosition.Rotated(Rotation);
+ AnimatedSprite.GlobalPosition = GlobalPosition + new Vector2(0, -Altitude) + _fallData.OriginSpritePosition.Rotated(Rotation);
}
}
@@ -904,8 +1001,6 @@
this.AddToActivityRoot(RoomLayerEnum.YSortLayer);
}
- GlobalPosition = _throwData.StartPosition;
-
CalcThrowAnimatedPosition();
//显示阴影
ShowShadowSprite();
@@ -913,31 +1008,31 @@
}
///
- /// 设置投抛状态下的碰撞器
+ /// 设置下坠状态下的碰撞器
///
- private void SetThrowCollision()
+ private void SetFallCollision()
{
- if (_throwData != null && _throwData.UseOrigin)
+ if (_fallData != null && _fallData.UseOrigin)
{
- _throwData.OriginShape = Collision.Shape;
- _throwData.OriginPosition = Collision.Position;
- _throwData.OriginRotation = Collision.Rotation;
- _throwData.OriginScale = Collision.Scale;
- _throwData.OriginZIndex = ZIndex;
- _throwData.OriginSpritePosition = AnimatedSprite.Position;
- _throwData.OriginCollisionEnable = Collision.Disabled;
- _throwData.OriginCollisionPosition = Collision.Position;
- _throwData.OriginCollisionRotation = Collision.Rotation;
- _throwData.OriginCollisionScale = Collision.Scale;
- _throwData.OriginCollisionMask = CollisionMask;
- _throwData.OriginCollisionLayer = CollisionLayer;
+ _fallData.OriginShape = Collision.Shape;
+ _fallData.OriginPosition = Collision.Position;
+ _fallData.OriginRotation = Collision.Rotation;
+ _fallData.OriginScale = Collision.Scale;
+ _fallData.OriginZIndex = ZIndex;
+ _fallData.OriginSpritePosition = AnimatedSprite.Position;
+ _fallData.OriginCollisionEnable = Collision.Disabled;
+ _fallData.OriginCollisionPosition = Collision.Position;
+ _fallData.OriginCollisionRotation = Collision.Rotation;
+ _fallData.OriginCollisionScale = Collision.Scale;
+ _fallData.OriginCollisionMask = CollisionMask;
+ _fallData.OriginCollisionLayer = CollisionLayer;
- if (_throwData.RectangleShape == null)
+ if (_fallData.RectangleShape == null)
{
- _throwData.RectangleShape = new RectangleShape2D();
+ _fallData.RectangleShape = new RectangleShape2D();
}
- Collision.Shape = _throwData.RectangleShape;
+ Collision.Shape = _fallData.RectangleShape;
Collision.Position = Vector2.Zero;
Collision.Rotation = 0;
Collision.Scale = Vector2.One;
@@ -948,7 +1043,7 @@
Collision.Scale = Vector2.One;
CollisionMask = 1;
CollisionLayer = 0;
- _throwData.UseOrigin = false;
+ _fallData.UseOrigin = false;
}
}
@@ -957,22 +1052,22 @@
///
private void RestoreCollision()
{
- if (_throwData != null && !_throwData.UseOrigin)
+ if (_fallData != null && !_fallData.UseOrigin)
{
- Collision.Shape = _throwData.OriginShape;
- Collision.Position = _throwData.OriginPosition;
- Collision.Rotation = _throwData.OriginRotation;
- Collision.Scale = _throwData.OriginScale;
- ZIndex = _throwData.OriginZIndex;
- AnimatedSprite.Position = _throwData.OriginSpritePosition;
- Collision.Disabled = _throwData.OriginCollisionEnable;
- Collision.Position = _throwData.OriginCollisionPosition;
- Collision.Rotation = _throwData.OriginCollisionRotation;
- Collision.Scale = _throwData.OriginCollisionScale;
- CollisionMask = _throwData.OriginCollisionMask;
- CollisionLayer = _throwData.OriginCollisionLayer;
+ Collision.Shape = _fallData.OriginShape;
+ Collision.Position = _fallData.OriginPosition;
+ Collision.Rotation = _fallData.OriginRotation;
+ Collision.Scale = _fallData.OriginScale;
+ ZIndex = _fallData.OriginZIndex;
+ AnimatedSprite.Position = _fallData.OriginSpritePosition;
+ Collision.Disabled = _fallData.OriginCollisionEnable;
+ Collision.Position = _fallData.OriginCollisionPosition;
+ Collision.Rotation = _fallData.OriginCollisionRotation;
+ Collision.Scale = _fallData.OriginCollisionScale;
+ CollisionMask = _fallData.OriginCollisionMask;
+ CollisionLayer = _fallData.OriginCollisionLayer;
- _throwData.UseOrigin = true;
+ _fallData.UseOrigin = true;
}
}
@@ -981,11 +1076,13 @@
///
private void ThrowOver()
{
- //移除投抛的力
- MoveController.RemoveForce(_throwData.ThrowForce);
-
- GetParent().RemoveChild(this);
- this.AddToActivityRoot(_currLayer);
+ var parent = GetParent();
+ var roomLayer = GameApplication.Instance.RoomManager.GetRoomLayer(_currLayer);
+ if (parent != roomLayer)
+ {
+ parent.RemoveChild(this);
+ roomLayer.AddChild(this);
+ }
RestoreCollision();
OnThrowOver();
diff --git a/DungeonShooting_Godot/src/framework/activity/ActivityThrowData.cs b/DungeonShooting_Godot/src/framework/activity/ActivityThrowData.cs
index 73a4b65..3eeacf4 100644
--- a/DungeonShooting_Godot/src/framework/activity/ActivityThrowData.cs
+++ b/DungeonShooting_Godot/src/framework/activity/ActivityThrowData.cs
@@ -3,14 +3,14 @@
public class ActivityThrowData
{
///
- /// 是否是第一次结束
+ /// 是否是第一次下坠
///
- public bool FirstOver = true;
+ public bool FirstFall = true;
///
- /// 是否已经结束
+ /// 下坠是否已经结束
///
- public bool IsOver = true;
+ public bool IsFallOver = true;
///
/// 物体大小
@@ -18,41 +18,6 @@
public Vector2 Size = Vector2.One;
///
- /// 起始坐标
- ///
- public Vector2 StartPosition;
-
- ///
- /// 移动方向, 0 - 360
- ///
- public float Direction;
-
- ///
- /// x速度, 也就是水平速度
- ///
- public float XSpeed;
-
- ///
- /// y轴速度, 也就是竖直速度
- ///
- public float YSpeed;
-
- ///
- /// 初始x轴组队
- ///
- public float StartXSpeed;
-
- ///
- /// 初始y轴速度
- ///
- public float StartYSpeed;
-
- ///
- /// 旋转速度
- ///
- public float RotateSpeed;
-
- ///
/// 碰撞器形状
///
public RectangleShape2D RectangleShape;
@@ -71,11 +36,7 @@
/// 回弹后的速度
///
public float BounceSpeed = 0.8f;
-
- public Vector2 CurrPosition;
- public float Y;
- public ExternalForce ThrowForce;
-
+
//----------- 用于记录原始信息 --------------
public bool UseOrigin = true;
public Shape2D OriginShape;
diff --git a/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs b/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs
index acad95f..8711f36 100644
--- a/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs
+++ b/DungeonShooting_Godot/src/game/item/weapon/gun/Gun.cs
@@ -104,7 +104,8 @@
var xf = Utils.RandomRangeInt(20, 60);
var yf = Utils.RandomRangeInt(60, 120);
var rotate = Utils.RandomRangeInt(-720, 720);
- var shell = ActivityObject.Create(ActivityIdPrefix.Shell + "0001");;
+ var shell = ActivityObject.Create(ActivityIdPrefix.Shell + "0001");
+ shell.PutDown(RoomLayerEnum.YSortLayer);
shell.Throw(new Vector2(10, 5), Master.GlobalPosition, startHeight, direction, xf, yf, rotate, true);
if (Master == GameApplication.Instance.RoomManager.Player)
diff --git a/DungeonShooting_Godot/src/game/room/RoomManager.cs b/DungeonShooting_Godot/src/game/room/RoomManager.cs
index ae6cdc4..fa2f296 100644
--- a/DungeonShooting_Godot/src/game/room/RoomManager.cs
+++ b/DungeonShooting_Godot/src/game/room/RoomManager.cs
@@ -66,21 +66,21 @@
_dungeonGenerator.Generate();
- //填充地牢
- _autoTileConfig = new AutoTileConfig();
- _dungeonTile = new DungeonTile(TileRoot);
- _dungeonTile.AutoFillRoomTile(_autoTileConfig, _dungeonGenerator.StartRoom);
-
- //生成寻路网格, 这一步操作只生成过道的导航
- _dungeonTile.GenerateNavigationPolygon(DungeonTile.AisleFloorMapLayer);
- //挂载过道导航区域
- _dungeonTile.MountNavigationPolygon(this);
- //过道导航区域数据
- _roomStaticNavigationList.AddRange(_dungeonTile.GetPolygonData());
- //门导航区域数据
- _roomStaticNavigationList.AddRange(_dungeonTile.GetConnectDoorPolygonData());
- //初始化所有房间
- _dungeonGenerator.EachRoom(InitRoom);
+ // //填充地牢
+ // _autoTileConfig = new AutoTileConfig();
+ // _dungeonTile = new DungeonTile(TileRoot);
+ // _dungeonTile.AutoFillRoomTile(_autoTileConfig, _dungeonGenerator.StartRoom);
+ //
+ // //生成寻路网格, 这一步操作只生成过道的导航
+ // _dungeonTile.GenerateNavigationPolygon(DungeonTile.AisleFloorMapLayer);
+ // //挂载过道导航区域
+ // _dungeonTile.MountNavigationPolygon(this);
+ // //过道导航区域数据
+ // _roomStaticNavigationList.AddRange(_dungeonTile.GetPolygonData());
+ // //门导航区域数据
+ // _roomStaticNavigationList.AddRange(_dungeonTile.GetConnectDoorPolygonData());
+ // //初始化所有房间
+ // _dungeonGenerator.EachRoom(InitRoom);
GD.Print("生成地牢用时: " + (DateTime.Now.Ticks - nowTicks) / 10000 + "毫秒");
@@ -95,6 +95,10 @@
Player.PickUpWeapon(ActivityObject.Create(ActivityIdPrefix.Weapon + "0001"));
+ var weapon = ActivityObject.Create(ActivityIdPrefix.Weapon + "0001");
+ weapon.PutDown(RoomLayerEnum.NormalLayer);
+ weapon.VerticalSpeed = 100;
+
// for (int i = 0; i < 10; i++)
// {
// var enemy = ActivityObject.Create(ActivityIdPrefix.Enemy + "0001");