我正在尝试构建一个名为GameObject (用于consoleApplication游戏)的类,并且GameObject应该有一个函数"onFrame“,即每0.1秒调用一次。
但是问题是,对于每个gameObject来说,这个函数(void)应该是唯一的--假设我有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!");
})
}但这似乎不是正确的方法。有可能吗?我该怎么做呢?
发布于 2015-11-16 20:20:09
您要寻找的是一个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++ );()是空输入参数集的占位符:
发布于 2015-11-16 20:29:00
你需要的是一名代表。
您的"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++;
}));.
https://stackoverflow.com/questions/33743873
复制相似问题