冒险游戏开发:如何检测console.log是否输出指定内容?
检测console.log指定输出并修复游戏逻辑
原代码问题分析
- 错误的console.log判断:
if (console.log("10000 milliseconds have elapsed"))完全无效——console.log()返回undefined,这个条件永远不成立,还会额外触发一次日志输出。 - 异步逻辑处理错误:
setTimeout是异步执行的,原代码里的动画切换逻辑写在同步代码块中,不可能等到10秒后再执行。
修复方案
不需要直接检测console.log的输出,而是用状态变量跟踪计时完成状态,既可靠又能直接关联游戏逻辑:
- 新增全局状态变量标记计时是否完成
- 在
setTimeout回调中同时更新状态变量 - 在游戏主循环(
draw函数)中检测状态,触发对应的动画切换
修改后的完整代码
var ground = createSprite(0, 425); ground.setAnimation("ground_grass"); ground.width = 1000000000; ground.setCollider("rectangle", 0, 25, 1000000000, 0.5); var player = createSprite(200, 0); player.setAnimation("player_fall"); player.scale = 0.4; var hpbar = createSprite(85, 25); hpbar.setAnimation("hpbar"); hpbar.scale = 0.3; // 新增状态变量:标记10秒计时是否完成 var isAttackTimeoutDone = false; function draw() { background(rgb(102, 204, 255)); //player mechanics player.collide(ground); player.setCollider("rectangle", -19, 75, 120, 210); //move right if (keyDown("d")) { player.setAnimation("player_run"); ground.x = ground.x + 6; } else if ((keyWentUp("d"))) { player.setAnimation("player_idle"); } //move left if (keyDown("a")) { player.setAnimation("player_run_left"); ground.x = ground.x - 6; } else if ((keyWentUp("a"))) { player.setAnimation("player_idle_left"); } //crouch if (keyWentDown("s")) { player.setAnimation("player_crouch"); } else if ((keyWentDown("w"))) { player.setAnimation("player_idle"); } //jump if (keyWentDown("w")) { player.setAnimation("player_jump"); player.velocityY = -7; } if (player.y < 200) { player.velocityY = player.velocityY + 1.5; player.setAnimation("player_fall"); } if (player.y > 300) { player.setAnimation("player_idle"); player.velocityY = 0; player.y = 300; } //slide right if (keyWentDown("e")) { ground.velocityX = ground.velocityX + 25; player.setAnimation("player_slide"); } else if ((keyWentUp("e"))) { ground.velocityX = ground.velocityX - 25; player.setAnimation("player_idle"); } //slide left if (keyWentDown("q")) { ground.velocityX = ground.velocityX - 25; player.setAnimation("player_slide_left"); } else if ((keyWentUp("q"))) { ground.velocityX = ground.velocityX + 25; player.setAnimation("player_idle_left"); } //attack if (keyWentDown("space")) { player.setAnimation("attack"); player.x = player.x + 0.001; // 重置状态,避免上次计时影响 isAttackTimeoutDone = false; setTimeout(function() { console.log("10000 milliseconds have elapsed"); // 计时完成后更新状态变量 isAttackTimeoutDone = true; }, 10000); } // 在主循环中检测状态,切换动画 if (isAttackTimeoutDone) { player.setAnimation("player_idle"); // 重置状态,防止重复触发 isAttackTimeoutDone = false; } drawSprites(); }
关键修改说明
- 状态变量
isAttackTimeoutDone:全局变量跟踪10秒计时是否完成,初始为false。 setTimeout回调更新状态:10秒后输出日志的同时,将状态设为true。- 主循环检测状态:在
draw函数中单独检测状态,一旦为true就切换回idle动画,并重置状态避免重复触发。
内容的提问来源于stack exchange,提问作者EmberJack18
相关产品推荐
相关产品推荐

