2

我使用 Visual C# 2010 express。我正在开发一款游戏,并且遇到了一个小的新手问题。问题是,我想我们正在处理一种最佳实践类型的情况,而我真正帮助过的几本初学者书籍都没有,所以我希望你们能做到。

所以,我有两种形式,一种是启动画面/启动形式,另一种是主游戏窗口。我创建了一个包含所有世界数据的类,当用户在第一个屏幕中单击“新游戏”时,将生成该类的一个新实例并填充数据。

到现在为止还挺好。

newgame 按钮除了创建世界实例外,还打开了主游戏窗口。问题是,在主游戏窗口中,当我尝试使用游戏世界实例的属性时,它说它在此上下文中不存在。

所以,如果我做对了,创建的实例只存在于第一个表单类中......对吗?

所以如果我想移动整个数据,我是否应该序列化并保存世界级的实例数据,并以第二种形式加载它?或者我应该如何处理这个问题。

我知道这是一个非常新手的问题,我可以破解它来工作,但问题是 - 我真的觉得我必须了解我所做的一切。

提前致谢!

4

4 回答 4

3

您需要在游戏表单上创建一个构造函数,该构造函数接受您的世界类的实例并将其分配给相同类型的字段 - 游戏表单方法可以访问该字段。

World world;

// constructor
public GameForm (World world)
{
  this.world = world;
}

// Can now use `world` in all `GameForm` methods

代替构造函数注入(如我在示例中所示),您可以使用属性注入,尽管我更喜欢前者(倾向于确保正确初始化 - 尽管您可能想要检查是否null传入)。

于 2012-08-29T09:46:09.877 回答
1

如果在启动画面中有世界数据对象的引用,你可以将它分配给主画面中的一个公共成员,或者通过构造函数将它传递给主画面。

所以在启动画面中

FrmMain frmMain = new FrmMain();
frmMain.WorldData = this.WorldData;

如果它是启动画面的实例成员

或者类似的东西

FrmMain frmMain = new FrmMain();
frmMain.WorldData = new WorldData();

甚至

FrmMain frmMain = new FrmMain(this.WorldData);

或者

FrmMain frmMain = new FrmMain(new WorldData());

使用 FrmMain 构造函数作为

public FrmMain(WorldData worldData)
{
    this.m_WorldData = worldData;
}

看看在表单之间传递数据

于 2012-08-29T09:46:18.137 回答
1

假设您只使用 Windows 窗体,而不是 XNA 或类似的框架,其中没有 winforms。

启动形式:

void StartButton_Click(object sender, EventArgs e)
{
    GameWorld gw = new GameWorld();
    // Initialize gw instance here

    GameForm mainForm = new GameForm(gw);
    mainForm.Show();
}

并在游戏表单中添加一个构造函数:

public class GameForm
{
    private GameWorld _gw;
    public GameForm()
    {
        InitializeComponent();
    }
    public GameForm(GameWorld gw) : this()
    {
        _gw = gw;
    }
}

此时您可以在游戏表单中使用私有变量_gw。

另外,我建议通过构造函数传递 GameWorld 实例,而不是属性,因为该值对表单至关重要。通常,属性可能更适合提供一种调整某些行为的方法,并且任何构造函数参数都可以被视为对象正常工作的必需参数。您还可以将默认构造函数(没有参数的构造函数)设为私有。

于 2012-08-29T09:51:09.597 回答
0

根据数据的大小以及世界对象类是否可序列化,您可能会考虑缓存它。然后每个需要数据的表单都可以在需要时从缓存中获取。

于 2012-08-29T10:37:01.060 回答