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

冒险游戏开发:如何检测console.log是否输出指定内容?

检测console.log指定输出并修复游戏逻辑

原代码问题分析

  1. 错误的console.log判断:if (console.log("10000 milliseconds have elapsed")) 完全无效——console.log()返回undefined,这个条件永远不成立,还会额外触发一次日志输出。
  2. 异步逻辑处理错误: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();
}

关键修改说明

  1. 状态变量isAttackTimeoutDone:全局变量跟踪10秒计时是否完成,初始为false。
  2. setTimeout回调更新状态:10秒后输出日志的同时,将状态设为true。
  3. 主循环检测状态:在draw函数中单独检测状态,一旦为true就切换回idle动画,并重置状态避免重复触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:01:04