我有一个程序同时显示5行爆炸。我想知道如何让每次爆炸以不同的速率进行动画制作。这是实际动画精灵的代码:
//=========================================================================
//
// Helper functions
//
//========================================================================
void Sprite_Draw_Frame(LPDIRECT3DTEXTURE9 texture, int destx, int desty, int framenum, int framew, int frameh, int columns)
{
D3DXVECTOR3 position( (float)destx, (float)desty, 0);
D3DCOLOR white = D3DCOLOR_XRGB(255, 255, 255);`
RECT rect;
rect.left = (framenum % columns) * framew;
rect.top = (framenum / columns) * frameh;
rect.right = rect.left + framew;
rect.bottom = rect.top + frameh;
spriteobj->Draw(texture, &rect, NULL, &position, white);
}
void Sprite_Animate(int &frame, int startframe, int endframe, int direction, int &starttime, int delay)
{
if((int)GetTickCount() > starttime + delay)
{
starttime = GetTickCount();
frame += direction;
if(frame > endframe) frame = startframe;
if(frame < startframe) frame = endframe;
}
}
//============================================================================
//
// Function calls
//
//==============================================================================
尝试在Sprite_Animate
中使用随机数作为延迟变量,以便帧以不同的速率延迟。然而,爆炸继续同步动画。
Sprite_Animate
函数只更新全局变量frame
和starttime
,以继续使用Sprite_Draw_Frame
函数绘制每个新框架。
//animate and draw the sprite
for(int i = 0; i < 5; i++)
{
Sprite_Animate(frame, 0, 29, 1, starttime, rand() %100);
Sprite_Draw_Frame(explosion, (i * 100), 100, frame, 128, 128, 6);
}
有一个简单的解决方案,如果有人想要完整的代码,我可以通过请求发送给你。
答案 0 :(得分:0)
所以我明白了。即使是随机delay
值,它们全部同步的原因是因为它们共享相同的全局变量frame
和starttime
。
相反,使用成员变量EXPLOSION
和frame
创建starttime
的结构,而不是使用向量来包含它们。之后它必须经过迭代。
新代码就在这里以防其他人遇到此问题。
//The structue to contain each explosions own frame and starttime variables
struct EXPLOSION
{
int frame;
int starttime;
};
//============================================================================
//
// Function calls
//
//==============================================================================
//animate and draw the sprite
for(int i = 0; i < 5; i++)
{
Sprite_Animate(explosions[i].frame, 0, 29, 1, explosions[i].starttime, rand() % 100);
Sprite_Draw_Frame(explosion, i * 100, 100, explosions[i].frame, 128, 128, 6);
}