如何在条件满足后终止指定代码块运行?工程项目技术求助
问题解决与代码优化
一、修复背景自动切回的问题
你的代码里draw()函数每帧都会执行mars.setAnimation("mars");,这就导致哪怕之前把背景改成了space,下一次刷新又会被强制改回mars。解决办法是加一个状态变量,标记是否已经完成宇航员触发的背景切换,只有在未切换时才保留mars的初始动画。
二、条件满足后停止指定代码运行
可以通过状态变量划分游戏阶段,比如用gameStage变量区分"宇航员操作阶段"和"火箭操作阶段",当宇航员触发条件后切换状态,之后只执行火箭相关代码,不再处理宇航员的移动逻辑。
修改后的完整代码
var land = createSprite(200, 200); land.setAnimation("land"); var space = createSprite(200, 200); space.setAnimation("space"); var mars = createSprite(200, 200); mars.setAnimation("mars"); var rocket = createSprite(350, 285); rocket.setAnimation("up"); var astronaut = createSprite(25, 325); astronaut.setAnimation("astronaut"); astronaut.width = 75; astronaut.height = 75; astronaut.visible = 1; // 新增状态变量,标记当前游戏阶段 var gameStage = "astronautPhase"; function draw() { // 只有在宇航员阶段才显示mars背景 if (gameStage === "astronautPhase") { mars.setAnimation("mars"); } // 宇航员阶段:处理宇航员移动和触发条件 if (gameStage === "astronautPhase") { if (keyDown("d")) { astronaut.x = astronaut.x + 3; } if (keyDown("a")) { astronaut.x = astronaut.x - 3; } if (astronaut.x > 330) { mars.setAnimation("space"); astronaut.visible = 0; // 切换到火箭阶段 gameStage = "rocketPhase"; astronaut.destroy(); } } // 火箭阶段:只处理火箭操作,不再执行宇航员相关代码 if (gameStage === "rocketPhase") { if (keyDown("a")) { rocket.setAnimation("left"); rocket.x = rocket.x - 3; } if (keyDown("d")) { rocket.setAnimation("right"); rocket.x = rocket.x + 3; } if (keyDown("w")) { rocket.setAnimation("up"); rocket.y = rocket.y - 3; } if (keyDown("s")) { rocket.setAnimation("down"); rocket.y = rocket.y + 3; } } drawSprites(); }
关键修改点说明
- 新增
gameStage状态变量,明确区分两个操作阶段,避免代码交叉执行 - 把宇航员的移动逻辑、背景初始设置都限定在
astronautPhase阶段内,切换阶段后不再触发 - 触发条件时直接切换阶段,彻底终止宇航员相关代码的运行,同时固定背景状态
内容的提问来源于stack exchange,提问作者Ryan Lin
相关产品推荐
相关产品推荐

