我正在尝试创建一个像这样的通用xna物理模块:
class PhysicsModule<T> : where T : Vector2, Vector3
{
private List<PhysicsForce<T>> _globalForces;
public PhysicsModule()
{
_globalForces = new List<PhysicsForce<T>>();
}
/// <summary>
/// Updates the resultant which will be sent to be applied on all entities.
/// </summary>
/// <param name="gameTime">...</param>
public override void UpdateResultant(GameTime gameTime)
{
_resultant = T.Zero;
foreach (PhysicsForce<T> force in _globalForces)
{
T vector = T.Multiply(force.Direction, force.Magnitude);
T modifiedByTime = T.Multiply(vector, (float)gameTime.ElapsedGameTime.TotalSeconds);
_resultant = T.Add(_resultant, modifiedByTime);
}
}
}
class PhysicsForce<T> where T : Vector2, Vector3
{
public T Direction;
public float Magnitude;
}
我知道这段代码不起作用,它只是作为一个样本来说明我想做什么。 这是可能的还是我会更好地拥有像这样的抽象基础
class PhysicsModule2D : PhysicsModule
class PhysicsForce2D : PhysicsForce
答案 0 :(得分:2)
dynamic
关键字或者像MiscUtil那样动态生成代理)。但这会显着降低性能。对于4),首先创建一个通用接口,其中包含您要使用的VectorX上的所有方法。像这样:
interface VectorMath
{
T Add(T v1,T v2);
}
然后使用struct
实现它。然后将该结构作为第二个通用参数传递给您的类。