让我的头围绕OOP(C#)的可怕麻烦

时间:2011-04-08 17:12:04

标签: c# winforms oop xna

我一直在使用非OOP语言(主要是脚本或Web开发),例如Lua很长一段时间。我现在在C#方面已经变得非常先进了,但就目前的项目而言,我已经成功了。

我正在制作一种游戏,用各种类型的东西制作2D环境。

我正在使用我在网络上找到的将XNA移植到winform中的示例,它运行正常,没有延迟或任何其他内容。

但这不是我的问题。我绝对没有IDEA如何使实例类与另一个实例类没有实例的实例类进行通信。

基本上,我已经创建了一个带有按钮的“插入”界面来插入一个地形,然后在Treeview1中出现。如何告诉表单“回复”用户选择了地形(我正在使用他们选择的枚举),并告诉表单将​​节点添加到树视图中?

5 个答案:

答案 0 :(得分:4)

你可以做几件事。

您需要建立一种机制,通过该机制在对象之间传递引用。以下是我认为您的问题的一个小例子,以及可能的解决方案。

我将展示父母/子女的关系。

public class Book
{
    public string BookText { get; set;}
}

public class Library
{
    private Book myBook = new Book();
}

在这种情况下,图书馆可以参考/交谈/与图书进行交流,因为它了解图书。但在这种情况下,您必须在创建库时创建该书。我们改变这个,以便我们可以向图书馆添加图书。

public class NewBook
{
    public string BookText {get;set;}
    public Library ParentLibrary {get;set;}
}

public class BetterLibrary
{
    private List<NewBook> books = new List<NewBook>();

    public bool AddNewBookToLibrary(NewBook bookToAdd)
    {
        books.Add(bookToAdd);
        booktoAdd.ParentLibrary = this;
    }
}

现在,我们已经创建了一个可以添加书籍的库,现在库可以与任何已添加的书籍进行对话。图书馆能够遍历书籍集并对每本书执行一些操作。

此外,已添加到库中的每个NewBook实例都知道哪个库实例是它的父实例,并且可以访问父库上的公共功能。

这是一种挂起实例的简单方法。它可以应用于您创建的任何类。在树视图中显示的任何对象中,书籍和库类可以替换为控件和控件父项或父/子关系。

这是回答你的问题吗?发表评论,如果您需要更多,我会更新。

答案 1 :(得分:3)

对象实例可以通过几种方式进行通信。通常他们会引发事件,而另一个实例可能已经在该事件上注册了一个事件处理程序。

有时候他们会引发一个事件,控制器实例会有一个注册的处理程序,它会引用各种其他实例,并找出要做的事情。

答案 2 :(得分:1)

声明,举起一个事件并消耗它。

实例的动词形式是“实例化”。

答案 3 :(得分:0)

没有看到您的代码,听起来您需要一个活动。 This tutorial有点陈旧,但仍然很好,并会告诉您如何在应用程序中实现事件。

答案 4 :(得分:0)

如果我理解正确,你需要某种共享模型。该模型可以通过两种方式处理:

  1. 使用XNA生成一些图纸
  2. 填充树状视图以便进行编辑
  3. 我知道有一个模型可以定义您的2D世界。因此,可以使用静态方法来获取当前在应用程序中加载的模型(例如,WorldEnvironment.Current)。 您的游戏引擎必须绘制它在WorldEnvironment.Current中找到的内容。另一方面,使用Winforms编辑此WorldEnvironment.Current实例。任何更改都将对其他“视图”(XNA视图或WinForms)可见。我前段时间做了类似的事情,在一个窗口上使用XNA,在另一个窗口上使用WPF。

    在其他类型的应用程序中,我建议避免使用静态方法,并根据需要使用一些注册单例或命名实例的控制/依赖注入反转模式。但对于一个简单的游戏编辑器,我认为这是最简单的方法。