关于第二个教程暂时就了解到这么多了,接下来看第三个教程. 这里认识到了hgeSprite,hgeFont,hgeParticleSystem.
来看下sprite的属性
struct hgeSprite { static HGE *hge; hgeQuad quad; float tx, ty, width, height; float tex_width, tex_height; float hotX, hotY; bool bXFlip, bYFlip, bHSFlip; };
看样子sprite像是quad的强化版.
然后来看hgeFont的属性
struct hgeFont { static HGE *hge; static char buffer[1024]; HTEXTURE hTexture; hgeSprite* letters[256]; float pre[256]; float post[256]; float fHeight; float fScale; float fProportion; float fRot; float fTracking; float fSpacing; DWORD dwCol; float fZ; int nBlend; };
Font的属性有好多,其中我比较在意的是buffer,letters,数组分别代表的是字符本身和字符对应的纹理显示?实际上看letters可以看到明显比buffer小很多,256的话刚好是扩展ASCII表的大小.也就是说只表示这么大小么?关于font等下来试试.
在来看hgeParticleSystem相关的内容
struct hgeParticleSystem { static HGE *hge; float fAge; float fEmissionResidue; hgeVector vecPrevLocation; hgeVector vecLocation; float fTx, fTy; float fScale; int nParticlesAlive; hgeRect rectBoundingBox; bool bUpdateBoundingBox; hgeParticle particles[MAX_PARTICLES]; }; struct hgeParticle { hgeVector vecLocation; hgeVector vecVelocity; float fGravity; float fRadialAccel; float fTangentialAccel; float fSpin; float fSpinDelta; float fSize; float fSizeDelta; hgeColor colColor; // + alpha hgeColor colColorDelta; float fAge; float fTerminalAge; }; struct hgeParticleSystemInfo { hgeSprite* sprite; // texture + blend mode int nEmission; // particles per sec float fLifetime; float fParticleLifeMin; float fParticleLifeMax; float fDirection; float fSpread; bool bRelative; float fSpeedMin; float fSpeedMax; float fGravityMin; float fGravityMax; float fRadialAccelMin; float fRadialAccelMax; float fTangentialAccelMin; float fTangentialAccelMax; float fSizeStart; float fSizeEnd; float fSizeVar; float fSpinStart; float fSpinEnd; float fSpinVar; hgeColor colColorStart; // + alpha hgeColor colColorEnd; float fColorVar; float fAlphaVar; };
代码挺长,但是可以理解.在上面的的代码中,hgeParticleSystem中少了一个属性值hgeParticleSystemInfo info;
稍稍了解结构之后再来看程序,和第二个程序几乎没多大逻辑上的差别。区别就在于这次用里粒子系统,所以要想粒子系统中载入一个粒子的图形-->精灵。然后再输出文字,这里我来试试如果输出的字符串长度超过256看会有什么特别的不,我来试试长度为1025吧:
没报错但是我也不知道最后输出是什么样子的。
看教程4的时候突然想到,既然有粒子系统那粒子是怎么加载到某个精灵上去的呢。回到教程3的代码中找到这些语句:
spt=new hgeSprite(tex, 32, 32, 32, 32); spt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NOZWRITE); spt->SetHotSpot(16,16); par=new hgeParticleSystem("trail.psi",spt); par->Fire();
可以看到代码中先选取一个纹理来作为粒子的显示效果,然后再将粒子放到了粒子系统中。那么是不是所有的精灵都会被加载了粒子呢?显然不是这样的,在加载了粒子之后然后选择粒子出现的地方。也就是说粒子和精灵是完全不同地方出现的。我们可以在某一个固定显示精灵,只要让精灵一直移动向一个固定地点就可以:
由图可以看出来,粒子和精灵是相对独立的两个东西。