我是C#的新手并用它来编写我的下一个游戏。来自C ++,Java和JavaScript的背景,我很高兴使用C#的匿名函数来简化在C ++和Java中不那么简单的任务。
特别是,我想在我的代码中实现一个类似于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!"); }
(当然,这不会编译,但示例的目的是描述我希望近似的语法。)
根据其他Stack Overflow问题和答案,不可能将属性引用传递给C#中的函数,因此以这种方式将player.x和player.scale传递给函数显然是不可能的,这意味着我必须重新思考我的实施策略。
考虑到C#关于将属性引用传递给函数的约束,还有其他方法可以实现这样的系统吗?或者我是否需要放弃这个想法并使用不那么灵活的方法来缓解属性值?
答案 0 :(得分:0)
经过一些实验和Shoe的评论帮助,我想出了一个解决方案。
首先,假设所有属性都是浮点数。其次,每个属性(player.x,player.scale等)都需要一个显式定义的setter(player.SetX(),player.SetScale()等),它接受一个float并返回void。 / p>
之后,主代码可以这样定义:
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()函数,我们需要做的就是调用它:
Animate(player.SetX, 10.0f, 500.0f);
Animate(player.SetScale, 10.0f, 2.0f);
我稍后会更改它以允许这些调用在一次调用中发生,但这只是一个简单的例子。