ActivityObject撞到墙回弹效果
1 parent 3835cac commit eb6b6566f843c2bc4b4a40e0d7729d6a8c4aa52c
@小李xl 小李xl authored on 9 May 2023
Showing 3 changed files
View
84
DungeonShooting_Godot/src/framework/activity/components/MoveController.cs
/// </summary>
public ExternalForce[] GetAllForce()
{
return _forceList.ToArray();
}
 
/// <summary>
/// 获取所有外力的数量
/// </summary>
public int GetForceCount()
{
return _forceList.Count;
}
 
/// <summary>
/// 快速创建一个外力, 该外力为匿名外力, 当速率变为 0 时自动销毁
{
//计算移动
ActivityInstance.Velocity = finallyVelocity;
ActivityInstance.MoveAndSlide();
//新速度
var newVelocity = ActivityInstance.Velocity;
if (newVelocity.X == 0f && _basisVelocity.X * finallyVelocity.X > 0)
{
_basisVelocity.X = 0;
}
if (newVelocity.Y == 0f && _basisVelocity.Y * finallyVelocity.Y > 0)
{
_basisVelocity.Y = 0;
}
 
//调整外力速率
for (var i = 0; i < _forceList.Count; i++)
{
var force = _forceList[i];
if (force.Enable)
//是否撞到物体
var collision = ActivityInstance.GetLastSlideCollision();
if (collision != null) //执行反弹操作
{
var no = collision.GetNormal().Rotated(Mathf.Pi * 0.5f);
newVelocity = (finallyVelocity - _basisVelocity).Reflect(no);
var length = _forceList.Count;
var v = newVelocity / (length / ActivityInstance.BounceStrength);
for (var i = 0; i < _forceList.Count; i++)
{
var velocity = force.Velocity;
force.Velocity = new Vector2(
newVelocity.X == 0f && velocity.X * finallyVelocity.X > 0 ? 0 : velocity.X,
newVelocity.Y == 0f && velocity.Y * finallyVelocity.Y > 0 ? 0 : velocity.Y
);
 
//力速度衰减
if (force.Resistance != 0)
_forceList[i].Velocity = v;
}
}
else //没有撞到物体
{
//调整外力速率
for (var i = 0; i < _forceList.Count; i++)
{
var force = _forceList[i];
if (force.Enable)
{
force.Velocity = force.Velocity.MoveToward(Vector2.Zero, force.Resistance * delta);
}
 
//自动销毁
if (force.AutoDestroy && force.Velocity == Vector2.Zero)
{
_forceList.RemoveAt(i--);
var velocity = force.Velocity;
force.Velocity = new Vector2(
newVelocity.X == 0f && velocity.X * finallyVelocity.X > 0 ? 0 : velocity.X,
newVelocity.Y == 0f && velocity.Y * finallyVelocity.Y > 0 ? 0 : velocity.Y
);
 
//力速度衰减
if (force.Resistance != 0)
{
force.Velocity = force.Velocity.MoveToward(Vector2.Zero, force.Resistance * delta);
}
 
//自动销毁
if (force.AutoDestroy && force.Velocity == Vector2.Zero)
{
_forceList.RemoveAt(i--);
}
}
}
}
}
View
18
DungeonShooting_Godot/src/game/item/weapon/Weapon.cs
public float GetAiScore()
{
return 1;
}
 
protected override void PhysicsProcessOver(float delta)
{
if (IsThrowing)
{
var collision = GetLastSlideCollision();
//collision.GetNormal();
if (collision != null)
{
var force = MoveController.GetForce("throw");
if (force != null)
{
var no = collision.GetNormal().Rotated(Mathf.Pi * 0.5f);
force.Velocity = force.Velocity.Reflect(no);
}
}
}
}
}
View
5
DungeonShooting_Godot/src/game/item/weapon/bullet/Bullet.cs
{
var role = other.AsActivityObject<Role>();
if (role != null)
{
var packedScene = ResourceManager.Load<PackedScene>(ResourcePath.prefab_effect_BulletDisappear_tscn);
var node = packedScene.Instantiate<Node2D>();
node.GlobalPosition = GlobalPosition;
node.AddToActivityRoot(RoomLayerEnum.YSortLayer);
role.CallDeferred(nameof(Role.Hurt), 4, Rotation);
Destroy();
}
}