2014-12-29 20 views
0

我是C#的新手,並使用它來編寫我的下一個遊戲。來自C++,Java和JavaScript的背景,我很高興使用C#的匿名函數來簡化在C++和Java中不那麼簡單的任務。在C#中實現類似jQuery的animate()函數#

特別是,我想在我的代碼中實現一個類似於jQuery的animate()函數的系統:將一組變量從其初始值緩動到一組新值,然後在完成時執行回調。我明白如何在C#中使用匿名函數和回調函數,所以這沒有問題,但我不確定如何將屬性及其相關值傳遞給函數。作爲一個例子,我的目標是這樣的,以便將玩家的x座標從初始值減小到目標值500,同時在10.0秒的過程中將他的縮放值減小到2.0f:

game.animate({ player.x: 500, player.scale: 2.0f }, 10.0f, delegate() { Console.WriteLine("Callback has been called!"); } 

(這不會編譯,當然,但本例的點來描述我希望能近似的語法。)

根據其他堆棧溢出的問題和答案,這不是可能將屬性引用傳遞給C#中的函數,因此將player.x和player.scale傳遞給函數在這個w中顯然是不可能的唉,這意味着我不得不重新思考我的實施策略。

是否有任何其他方式可以實現這樣的系統,因爲C#對傳遞屬性引用的約束有限制?或者我是否需要放棄這個想法,並採用較不靈活的方法來緩解財產價值?

+0

'不可能將屬性引用傳遞給C#中的函數'。它在方法聲明中使用'out'或'ref'。否則,你可以傳遞一個像「Player」這樣的引用類型。 – Shoe

+0

@Shoe謝謝,我會給你一個鏡頭。這可能是我誤解了其他關於SO的問題,或者自這些帖子發佈以來事情發生了變化。 – Josh1billion

+0

@Shoe它沒有工作;在對該函數的調用中,我收到一個編譯錯誤,說我無法將屬性作爲參數傳遞。 我的函數簽名看起來是這樣的: 公共無效動畫(REF float屬性,浮targetValue,行動回調= NULL) 和呼叫看起來是這樣的: game.Animate(REF this.x,900.0f,空值); – Josh1billion

回答

0

從Shoe的評論中得到一點實驗和幫助,我想出了一個解決方案。

首先,假設所有屬性都是浮動的。其次,每個屬性(player.x,player.scale等)都需要一個明確定義的setter(player.SetX(),player.SetScale()等),它接受一個float並返回void。

之後,主代碼可以被定義,像這樣:

public delegate void PropertySetter(float newVal); 

public void Animate(PropertySetter setter, float time, float valToSet, Action callback=null) 
{ 
    // the implementation-specific code for interpolating values will go here. and call "callback" when complete, if it's non-null. 
} 

,並使用動畫()函數,我們需要做的就是把它就像這樣:

Animate(player.SetX, 10.0f, 500.0f); 
Animate(player.SetScale, 10.0f, 2.0f); 

稍後我會改變它以允許這些呼叫在一次呼叫中發生,但這是一個簡單的例子。