我试图在我的" Game"中更改RichTextBox中的文本。来自另一个" Engine"在Visual Studio社区2013中的项目,已经被" Game"项目。我尝试访问它的所有内容都没有通过Intellisense显示RichTextBox,导致红线,以及"引擎"项目拒绝建设。
通过检查网站和Google,我尝试使RichTextBox保持静态和其他一些技巧,包括我自己想出的一个 - 制作第三个项目并参考其他两个。一切都没有用。
这应该是我现在拥有的代码的重要部分:
在Game.cs中,我有公开课:namespace Game
{
public partial class Game : Form
{
... //All the code for the form
}
}
在Game.Designer.cs中的我有RichTextBox public和static:
namespace Game
{
partial class Game
{
... // All the other unimportant stuff
public static System.Windows.Forms.RichTextBox rtbMessages; //I've fixed the errors this caused in InitializeComponent() already
}
}
现在来自我的"引擎"项目,我会尝试这样的事情(简化,但它显示了我正在尝试做的事情):
using Game;
nameSpace Engine
{
public class Monster
{
... // Properties, Constructor, etc.
public static bool IsDead(string name, int currentHP)
if (currentHP <= 0)
{
Game.rtbMessages.Text += String.Format("You have killed {0}.{1}", name, Environment.NewLine);
return true;
}
return false;
}
}
}
我现在只使用我能够在网上找到的基本教程学习C#和面向对象的编程3周了,但是从我所学到的,我老老实实地不会这样做。知道为什么这不起作用。我尝试添加来自&#34; Engine&#34;回到&#34;游戏&#34;,但我得到一个错误,说这将创建一个循环依赖,因为&#34;游戏&#34;已引用&#34;引擎&#34;。
这甚至可能吗?我开始怀疑了。
编辑:我错误地假设&#34; Project&#34;只是VS用于命名空间的名称。问题不在于他们在不同的名称空间中,而是在不同的项目中。因此,三振出局。
答案 0 :(得分:2)
Dependancies(项目引用)应该只是单向的。事实上,VS非常努力地让你无法创建循环引用,正如你已经发现的那样。
通常,&#34;游戏&#34;项目将参考&#34;引擎&#34;项目。不是相反。引擎永远不需要知道游戏项目中的类型。
如果引擎 需要了解游戏类型,那么架构就会出现问题。游戏类型实际上应该是引擎类型,或者您在引擎中编码的功能是游戏特定的,应该在游戏项目中。
在您的情况下,功能(更新rtbMessages控件)属于游戏项目。所以从游戏代码中你应该做这样的事情:
if (Engine.Monster.IsDead("monster name", monster_hp)) {
Game.rtbMessages.Text += String.Format("You have killed {0}.{1}", name, Environment.NewLine);
}
并从rtbMessages
功能中删除Monster.IsDead
更新。
此外,我会考虑再做一次改变
你真的需要Monster.IsDead
是静态的吗?想必你已经提到了怪物。 IsDead
类型上的非静态Engine.Monster
方法可能更有意义。您甚至可以将其设为Engine.Monster
类的只读属性。