public void Update(double elapsedTime)
{
double frequency = 7;
float _wavyNumber = (float)Math.Sin(_totalTime*frequency);
_wavyNumber = 0.5f + _wavyNumber * 0.5f; // scale to 0-1
_text.SetColor(new Color(1, 0, 0, _wavyNumber));
_totalTime += elapsedTime;
}
总时间记录状态运行了多久。该数值不断增加,变得越来越大,最终会返回到0。它为正弦函数填充数值,得到与前面类似的波形。正弦波将被缩放为在0~1之间震荡,而不是在-1~1之间震荡。频率也将被增长,使脉冲发生的次数更多。运行这段代码,查看得到的效果。
有了跳入又跳出视野的效果以后,下一步是使文本不断变幻色彩。每个颜色通道都被赋予一个不同的正弦或余弦波,每个通道的强度都会随时间改变。
public void Update(double elapsedTime)
{
double frequency = 7;
float _wavyNumberR = (float)Math.Sin(_totalTime*frequency);
float _wavyNumberG = (float)Math.Cos(_totalTime*frequency);
float _wavyNumberB = (float)Math.Sin(_totalTime+0.25*frequency);
_wavyNumberR = 0.5f + _wavyNumberR * 0.5f; // scale to 0-1
_wavyNumberG = 0.5f + _wavyNumberG * 0.5f; // scale to 0-1
_wavyNumberB = 0.5f + _wavyNumberB * 0.5f; // scale to 0-1
_text.SetColor(new Color(_wavyNumberR, _wavyNumberG,
_wavyNumberB, 1));
_totalTime += elapsedTime;
}
很容易随意使用这段代码来获得各种不同的效果。三角函数不只可以修改颜色通道,还可以修改文本的位置,如下例所示。要改变文本的位置,必须向Text类添加一个SetPosition方法。为移动文本,组成每个字符的所有顶点的位置都需要改变。最简单的方法是在新位置重新创建所有的字符。
public void SetPosition(double x, double y)
{
CreateText(x, y);
}
定义了Text类的SetPosition方法后,可以在更新循环中使用它来创建新的基于文本的特殊效果。
public void Update(double elapsedTime)
{
double frequency = 7;
double _wavyNumberX = Math.Sin(_totalTime*frequency)*15;
double _wavyNumberY = Math.Cos(_totalTime*frequency)*15;
_text.SetPosition(_wavyNumberX, _wavyNumberY);
_totalTime += elapsedTime;
}
这段代码会沿着一个不太规整的圆移动文本。这一次不需要把数值缩放到0~1之间,相反,它们被加大了,这样文本的移动会更加明显。根据需要,可以使用不同的函数来修改文本的位置。
最后这个示例使文本的每个字符运动起来,就好像有一个波形在传递词一样。为了设置文本的每个字符的运动,必须在Sprite类中添加一个新的GetPosition方法。精灵的位置从精灵的中心开始计算。
public Vector GetPosition()
{
return GetCenter();
}
把上面的代码添加到Sprite类以后,可以在更新循环中使用新的GetPosition方法。
public void Update(double elapsedTime)
{
double frequency = 7;
int xAdvance = 0;
foreach (CharacterSprite cs in _text.CharacterSprites)
{
Vector position = cs.Sprite.GetPosition();
position.Y = 0 + Math.Sin((_totalTime + xAdvance) * frequency)*25;
cs.Sprite.SetPosition(position);
xAdvance++;
}
_totalTime += elapsedTime;
}