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

JS逐帧动画无法运行问题求助(附代码及演示视频)

问题分析与修复方案

你的逐帧动画无法运行的核心问题出在帧计数变量未初始化和帧切换逻辑错误上,以下是具体问题和修复步骤:

1. 未初始化frames变量

你仅声明了let frames;但未赋予初始值,变量默认是undefined。在update函数中执行frames++后,变量会变为NaN(非数字),导致后续依赖frames的帧切换逻辑完全失效。

2. 帧切换逻辑错误

drawDino中你用if(frames == 0)触发帧切换,但frames只会在首次执行前是undefined,之后只会递增,永远不会等于0,因此动画帧完全不会切换。另外dino.period每次在if块中赋值属于冗余操作,应放在对象初始化阶段。


修复后的代码

初始化frames变量及优化dino对象

let frames = 0; // 初始化帧计数器为0

let dino = {
    animation : [
        startRunImg,
        secondRunImg,
        thirdRunImg,
        startRunImg
    ],
    x : dinoX,
    y : dinoY,
    w : dinoWidth,
    h : dinoHeight,
    onGround : true,
    frame : 0,
    period: 5 // 将帧间隔移至对象初始化
}

修改drawDino的帧切换逻辑

function drawDino(){
    let dinoA = dino.animation[dino.frame];
    context.drawImage(dinoA, dino.x, dino.y, dino.w, dino.h);

    if(state.current == state.game){
        // 每经过dino.period帧,切换一次动画帧
        if(frames % dino.period === 0){
            dino.frame = (dino.frame + 1) % dino.animation.length;
        }
    };
};

额外检查点

  • 确认state.current与state.game的状态值匹配,游戏运行时state.current确实等于state.game
  • 验证startRunImg等图片资源已正确加载(可在window.onload中打印图片的width/height确认)

内容的提问来源于stack exchange,提问作者Jask

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:38