频道栏目
读书频道 > 软件开发 > C# > 精通C#游戏编程
8.1.2 使用三角函数实现特殊效果
2012-08-01 16:15:54     我来说两句
收藏   我要投稿

本文所属图书 > 精通C#游戏编程

本书通过引导读者创建一个基本的游戏,展示了如何使用c#和OpenGL一步步地开发出简单、整洁而可靠的代码。C#是一种高级编程语言,而OpenGL是业界显示图形最常用的方法。本书概述了创建优秀游戏项目时采用的方法和...  立即去当当网订购

创建一个新的游戏状态SpecialEffectsState。这个状态将演示如何使用Text类以及刚才讨论的正弦和余弦函数创建很酷的特效。

class SpecialEffectState : IGameObject

{

Font _font;

Text _text;

Renderer _renderer = new Renderer();

double _totalTime = 0;

 

public SpecialEffectState(TextureManager manager)

{

_font = new Font(manager.Get("font"), FontParser.Parse("font.fnt"));

_text = new Text("Hello", _font);

}

 

public void Update(double elapsedTime)

{

}

 

public void Render()

{

Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

_renderer.DrawText(_text);

_renderer.Render();

}

}

基本的状态只是渲染出文本“Hello”。使用这个正弦值很容易使文本的透明度从0逐渐变化为1,然后又从1变化为0。这里使用的是文本,但是使用精灵或模型也一样很简单。


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;

}


您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:8.1.1 绘制图形
下一篇:8.2 向量
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站