2

我正在开发非常简单的 Roguelike 游戏(仅针对我自己)并得到一个问题:

由于不可能创建一个可以从我的程序的任何类访问的跨类结构对象(游戏案例中的实体),所以使用什么来创建跨类对象?我正在考虑将所有新创建的对象(实体)存储在静态对象数组中,但我想这个问题有更简单的解决方案。

问题本身:如何使用您自己的属性创建跨类可访问对象?

谢谢大家,我找到了我正在寻找的东西。

4

5 回答 5

2

似乎您尝试struct在不同的类之间传递值类型(a),并且您注意到当您在一个地方更新值时,它不会更改另一个地方的值。

这就是值类型和引用类型之间的基本区别。

如果您struct自己创建,您可能希望将其定义为一个类。

如果没有,您可以将所有结构包装在一个类中,并将该类作为您的状态对象传递。

如果您所拥有的只是一个相同类型结构的列表(如 Points),只需传递 List 本身。C# 集合作为类实现。

public class GameState
{
    public Point PlayerLocation { get; set; }
    public List<Point> BulletPoints { get; set; }
    public double Health { get; set; }
}

现在您可以创建一个 GameState 并将其传递给不同的类:

public class Game
{
    private GameState _state = new GameState();
    private BulletUpdater _bulletUpdater = new BulletUpdater();

    public void Update()
    {
        _bulletUpdater.UpdatePoints(_state);

        // Points have now been modified by another class, even though a Point is a struct.
    }
}

public class BulletUpdater
{
    public void UpdatePoints(GameState state)
    {
        for (int i = 0; i < state.BulletPoints.Count; i++)
        {
            Point p = state.BulletPoints[i];
            state.BulletPoints[i] = new Point(p.X + 1, p.Y + 1);
        }
    }
}

如果我要写,请记住上面的代码:

Point p = state.BulletPoints[i];
p.X += 1;
p.Y += 1;

不影响原点!当您从列表或类中读取值类型时,只会将该值复制到局部变量中。因此,为了反映您对存储在引用类型中的原始对象的更改,您需要像这样覆盖它:

state.BulletPoints[i] = p;

同样的原则是为什么以下内容也不起作用:

state.PlayerLocation.X += 5; // Doesn't do anything
state.PlayerLocation.Y += 5; // Also doesn't do anything

在这种情况下,编译器会告诉你你做错了什么。您只是在修改属性的返回值,而不是支持字段本身。你必须这样写:

state.PlayerLocation = new Point(state.PlayerLocation.X + 5, state.PlayerLocation.Y + 5); // This works!
于 2013-10-25T14:30:15.497 回答
2

您可以执行以下操作:

  1. 使用 IoC 框架,例如Ninject。您可以设置 Ninject 为所有用途创建单个实例。

  2. 另一种选择是使用单例模式设计模式

  3. 第三个是使用静态属性

于 2013-10-25T14:33:18.923 回答
0

这是可能的。publicstatic课呢?

public static class CrossClassObject
{
   public static object MyProperty { get; set; }

   public static void MyMethod() {}
}

当然,这个类应该放在与其他类相同的命名空间中。

如何使用它?

class OtherClassInTheSameNamespace
{
   private void SomeMethod()
   {
      var localVariable = CrossClassObject.MyProperty; // get 'cross-class' property MyProperty

      CrossClassObject.MyMethod(); // execute 'cross-class' method MyMethod()
   }
}
于 2013-10-25T14:24:46.900 回答
0

不知道您要实现什么...但是如果您想要一个可“跨类”访问的对象列表,只需创建一个带有对象列表的静态类,然后当您从任何其他类引用您的类时,您将可以访问其对象列表。这是这样的:

public static class ObjectController
{
    private static IList<object> existingObjects;

    public static IList<object> ExistingObjects
    {
        get 
        {
            if (existingObjects == null)
            {
                existingObjects = new List<object>();
            }
        }
    }
}

public class MyObject
{
    public MyObject()
    {
        ObjectController.ExistingObjects.Add(this);
    }

    public void Delete()
    {
        ObjectController.ExistingObjects.Remove(this);
    }
}

然后你可以添加类似的东西

MyObject newObj = new MyObject();
//// other stuff... This object should now be visible to whatever other class references ObjectController
newObj.Delete();
于 2013-10-25T14:28:33.457 回答
0

听起来您想使用单例模式: http ://en.wikipedia.org/wiki/Singleton_pattern

以下是 C# 中的示例:

public class Singleton
{
    static Singleton()
    {
        Instance = new Singleton();
    }

    public static Singleton Instance { get; private set; }
}
于 2013-10-25T14:30:36.703 回答