正文

游戲數(shù)學(xué)(5)

精通C#游戲編程 作者:(英)斯庫(kù)勒


 

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;

}

總時(shí)間記錄狀態(tài)運(yùn)行了多久。該數(shù)值不斷增加,變得越來(lái)越大,最終會(huì)返回到0。它為正弦函數(shù)填充數(shù)值,得到與前面類似的波形。正弦波將被縮放為在0~1之間震蕩,而不是在-1~1之間震蕩。頻率也將被增長(zhǎng),使脈沖發(fā)生的次數(shù)更多。運(yùn)行這段代碼,查看得到的效果。

有了跳入又跳出視野的效果以后,下一步是使文本不斷變幻色彩。每個(gè)顏色通道都被賦予一個(gè)不同的正弦或余弦波,每個(gè)通道的強(qiáng)度都會(huì)隨時(shí)間改變。

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;

}

很容易隨意使用這段代碼來(lái)獲得各種不同的效果。三角函數(shù)不只可以修改顏色通道,還可以修改文本的位置,如下例所示。要改變文本的位置,必須向Text類添加一個(gè)SetPosition方法。為移動(dòng)文本,組成每個(gè)字符的所有頂點(diǎn)的位置都需要改變。最簡(jiǎn)單的方法是在新位置重新創(chuàng)建所有的字符。

public void SetPosition(double x, double y)

{

CreateText(x, y);

}

定義了Text類的SetPosition方法后,可以在更新循環(huán)中使用它來(lái)創(chuàng)建新的基于文本的特殊效果。

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;

}

這段代碼會(huì)沿著一個(gè)不太規(guī)整的圓移動(dòng)文本。這一次不需要把數(shù)值縮放到0~1之間,相反,它們被加大了,這樣文本的移動(dòng)會(huì)更加明顯。根據(jù)需要,可以使用不同的函數(shù)來(lái)修改文本的位置。

最后這個(gè)示例使文本的每個(gè)字符運(yùn)動(dòng)起來(lái),就好像有一個(gè)波形在傳遞詞一樣。為了設(shè)置文本的每個(gè)字符的運(yùn)動(dòng),必須在Sprite類中添加一個(gè)新的GetPosition方法。精靈的位置從精靈的中心開(kāi)始計(jì)算。

public Vector GetPosition()

{

return GetCenter();

}

把上面的代碼添加到Sprite類以后,可以在更新循環(huán)中使用新的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;

}


上一章目錄下一章

Copyright ? 讀書(shū)網(wǎng) hotzeplotz.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)