Allegro 5中精灵帧切换不流畅问题求助(附代码及视频)
龙的动画帧切换不流畅问题解决
你视频里龙的动画看起来所有帧同时跳变,核心问题出在帧计数的逻辑上,我帮你捋捋代码里的问题:
先看你贴的drawShip函数代码:
//this occurs every 1/60 of a second void drawShip(SpaceShip &ship, ALLEGRO_BITMAP *flyingShip) { if (++ship.frameCount >= ship.frameDelay) { if (++ship.curFrame >= ship.maxFrame) { ship.curFrame = 0; ship.frameCount = 0; } } al_draw_bitmap_region(ship.image, ship.curFrame * ship.frameWidth, 0, ship.frameWidth, ship.frameHeight, ship.x, ship.y, 0); }
主要问题:帧计数未及时清零
你的逻辑是只有当curFrame循环回到0的时候,才把frameCount重置为0。但在curFrame还没到maxFrame的时候,frameCount会一直递增,每次进入函数都会满足frameCount >= frameDelay的条件,导致curFrame每一帧都在快速增加,直到触发循环重置——这就造成了所有帧瞬间切换的卡顿感。
修复方案
把frameCount的清零操作移到外层,不管curFrame有没有循环,每次完成帧切换后都重置计数:
void drawShip(SpaceShip &ship, ALLEGRO_BITMAP *flyingShip) { if (++ship.frameCount >= ship.frameDelay) { ++ship.curFrame; if (ship.curFrame >= ship.maxFrame) { ship.curFrame = 0; } // 每次切换帧后都重置计数,确保下一次帧切换需要等待frameDelay个周期 ship.frameCount = 0; } al_draw_bitmap_region(ship.image, ship.curFrame * ship.frameWidth, 0, ship.frameWidth, ship.frameHeight, ship.x, ship.y, 0); }
额外注意点
- 函数参数里的
flyingShip你没用到,代码里用的是ship.image,要确保ship.image已经正确赋值为你加载的shipImage(比如加一句ship.image = shipImage;),否则可能绘制的是空位图或者错误资源。 - 如果你以后要做反向动画(比如
animationDirection = -1),可以把帧递增改成ship.curFrame += ship.animationDirection,然后判断边界的时候也要处理小于0的情况。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

