You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:43