2014-07-14 92 views
0

我的主循环:按引用传递一个TouchCollection

... 

// Variables declaration 
TouchCollection touch_; 

... 

private void InitializeAll() 
{ 
    ... 
    player = new Player(touch_); 
    ... 
} 

protected override void Update(GameTime gametime) 
{ 
    touch_ = TouchPanel.GetState(); 
    player_.Update(gametime); 
    ... 
} 

我想打电话给TouchPanel.GetState();只是一个时间每次更新,所以我没有把它也在玩家的更新循环,并在所有其他对象的更新需要了解触摸状态的循环。所以我将touch_传入玩家的构造函数,但我不工作:玩家没有看到touch_变量的任何更新。

据我所知,这是一个与每次分配touch_的事实有关的问题。

我该如何解决这个问题?

+1

“touch_”的数据类型是什么?如果它是一个结构体,我可以理解它为什么不起作用。 (是的,它[是一个结构](http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.touch.touchcollection.aspx)) – gunr2171

+0

@ gunr2171那么我该如何解决问题? –

+0

先生Skeet发布了一个很好的答案[通过c#结构参考?](http://stackoverflow.com/a/16614732/2596334),你可能会发现有帮助。 –

回答

1

据我所知,这是一个与touch_每次被分配的事实有关的问题。

确实,你快到了。覆盖touch_的值是可以的,它只是假设您的player_将收到关闭的新值。

请记住,TouchPanel.GetState()返回TouchCollection。这是一个结构,这意味着如果你传递的是一个参数(就像在你的构造函数中那样),它将是一个拷贝的对象,而不是参考它。

解决此问题的超简单方法是:每次将新值传入您的player_.Update()方法。

player_.Update(gametime, touch_); 

现在,当您的播放器更新时,它将有新的数据可供使用。如果你需要更复杂的数据,你将不得不围绕你的数据。

如果你不需要,你可以从玩家的构造函数中移除参数。

+0

此外,这不取决于'TouchCollection'是结构还是类。 'player_'没有引用变量'touch_'本身,即使它是一个类,所以重新分配给'touch_'不会影响'player_'的值。 – Ripple