我正在尝试构建一个名为GameObject的类(用于consoleApplication游戏),而GameObject应该有一个函数" onFrame"这就是所谓的,每0.1秒一次。
但问题是,这个函数(void)应该对每个gameObject都是唯一的 - 让我们说我有GameObject:G1,G2。 G1会在它的onFrame中将变量增加1,而G2会在控制台上打印一些内容(只是示例)。
有可能吗?
我试着这样做:
class GameObject
{
public void onFrame;
public GameObject (void of) //constructor
{
onFrame = of;
Thread t = new Thread(runOnFrame);
t.isBackgroundThread = true;
t.Start();
}
protected void runOnFrame ()
{
while (true)
{
Thread.Sleep(100);
if (onFrame != null) onFrame(); //EDIT: that (0) was typed by mistake
}
}
}
主要功能:
public static int i = 0;
static void Main (string[] args)
{
GameObject G1 = new GameObject(new void (){
i++;
});
GameObject G2 = new GameObject(new void () {
Console.WriteLine("OnFrame is being called!");
})
}
但它似乎不是正确的方法...... 可能吗?我该怎么做?
答案 0 :(得分:6)
您正在寻找的是Action
,与void
代表相同:
class GameObject
{
public Action onFrame;
public GameObject (Action of) //constructor
{
onFrame = of;
Thread t = new Thread(runOnFrame);
t.isBackgroundThread = true;
t.Start();
}
protected void runOnFrame ()
{
while (true)
{
Thread.Sleep(100);
if (onFrame != null) onFrame();
}
}
}
但我建议使用Timer
而不是在连续循环中调用thread.Sleep
。
传递委托的一种方法是使用lambda语法:
GameObject G1 = new GameObject(() => i++ );
()
是空输入参数集的占位符:
答案 1 :(得分:1)
您需要的是代表。
您的“onFrame”定义应如下所示:
public delegate void SimpleDelegate();
public SimpleDelegate onFrame;
你的构造函数会变成这样:
public GameObject (SimpleDelegate of)
{
onFrame = of;
Thread t = new Thread(runOnFrame);
t.isBackgroundThread = true;
t.Start();
}
然后,这样的事情:
GameObject G1 = new GameObject(new SimpleDelegate(() => {
i++;
}));
.....