从另一个类编辑类属性

时间:2019-01-27 17:08:46

标签: c# class reference

标题可能过于简单,因此请在此处阅读整个问题。

我有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”向网格物体添加重力来进行测试。在管理器中,我仅添加一个网格,然后在应该施加重力的地方放置一个断点,然后击中该断点。我看到重力吸引的网格正在成功更改其速度和位置,但在屏幕上看不到。我看到我的玩家站着不动,而不是跌倒。这仅意味着将玩家网格的副本添加到物理管理器中的网格列表中,而不是真实玩家的网格。当然,这只是在该级别的构造函数的第一个版本中发生的。

是否有办法将关卡的构造函数排除在所有这些网格业务之外?

1 个答案:

答案 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);

我要说的是,我很困惑您在构造函数中创建了许多对象,这不是一个好习惯。结果就像您说的那样,对象无处不在,但实际上没有人控制。您需要真正考虑哪些对象控制着其他对象。