标题可能过于简单,因此请在此处阅读整个问题。
我有4个班级:关卡,玩家,网格物体和物理管理器。
管理者应该管理网格。播放器只有一个网格(网格包含多个点击框)。它们都被加载到关卡的构造函数中。
目标是让玩家类创建自己的网格,然后关卡应该将该网格添加到经理的网格列表中。
这就是我希望代码的结构(以及当前的结构):
public class Player
{
public SFPhyMesh Mesh { get; set; }
public Player()
{
Mesh = new Mesh();
}
}
public class PhysicsManager
{
public List<Mesh> Meshes;
public void AddMesh(Mesh mesh)
{
Meshes.Add(mesh);
}
}
public class Level
{
PhysicsManager physics;
Player player;
public Level()
{
player = new Player();
physics = new PhysicsManager();
physics.AddMesh(player.Mesh);
}
}
请注意,我忽略了所有次要的部分。
这里的问题是AddMesh
函数创建了一个副本以添加到列表中。我尝试将ref
关键字放在参数之前,但没有成功。我还尝试为玩家的网格物体创建一个公共变量,而不是与ref
函数中的AddMesh
关键字一起创建一个公共属性,但是没有成功。看起来像这样:
public class Player
{
public SFPhyMesh Mesh;
...
}
public void AddMesh(ref Mesh mesh)
{
Meshes.Add(mesh);
}
public class Level()
{
player = new Player();
physics = new PhysicsManager();
physics.AddMesh(ref player.Mesh);
}
唯一可行的方法是Level
的构造函数如下:
public class Level
{
PhysicsManager physics;
Player player;
public Level()
{
var pMesh = new Mesh();
player = new Player();
player.Mesh = pMesh();
physics = new PhysicsManager();
physics.AddMesh(pMesh);
}
}
我不希望班级担心每个玩家的/敌人的/实体的网格。我需要这些类的每一个来负责它自己的网格。但是我很难为物理经理提供球员网眼记忆中的确切位置。
我通过使用标签“ falling”向网格物体添加重力来进行测试。在管理器中,我仅添加一个网格,然后在应该施加重力的地方放置一个断点,然后击中该断点。我看到重力吸引的网格正在成功更改其速度和位置,但在屏幕上看不到。我看到我的玩家站着不动,而不是跌倒。这仅意味着将玩家网格的副本添加到物理管理器中的网格列表中,而不是真实玩家的网格。当然,这只是在该级别的构造函数的第一个版本中发生的。
是否有办法将关卡的构造函数排除在所有这些网格业务之外?
答案 0 :(得分:2)
我相信您正在寻找Level上的AddPlayer方法:
public class Level
{
PhysicsManager physics;
public Level()
{
physics = new PhysicsManager();
}
public void AddPlayer(Player Player)
{
physics.AddMesh(Player.Mesh);
}
}
您需要使用以下代码来调用它:
Level myLevel = new Level();
myLevel.AddPlayer(newPlayer);
我要说的是,我很困惑您在构造函数中创建了许多对象,这不是一个好习惯。结果就像您说的那样,对象无处不在,但实际上没有人控制。您需要真正考虑哪些对象控制着其他对象。