为何我的switch语句仅两个case生效?求排查原因
问题排查与解决方案
看起来你遇到的问题核心在于重复定义draw()函数以及对p5.js中draw()函数工作机制的误解,咱们一步步来梳理:
问题根源
在你的switch分支里,每个case都重新声明了一个draw()函数,但JavaScript的函数声明会被提升到当前作用域的顶部,而且后续的函数声明会直接覆盖之前的。这就导致不管你的switch进入哪个分支,最终生效的都是最后一个被解析的draw()(也就是Quadrat分支里的那个)——这就是为什么程序总是走到Quadrat分支的原因。
另外,p5.js中的draw()是框架自带的循环执行函数,它的定义应该是一次性的,不能在运行时动态去重新定义它,而是应该通过状态变量来控制绘制内容。
修正后的代码示例
我们可以用一个变量来存储当前选中的形状类型,然后在固定的draw()函数里根据这个变量来判断要绘制的图形:
// 定义全局变量存储当前要绘制的形状类型 let currentShape = ''; // 示例:模拟触发不同形状分支的逻辑(你可以替换成实际的交互触发,比如按钮点击) function selectShape(shapeType) { currentShape = shapeType; } // 只定义一次draw函数,在内部根据状态变量判断绘制内容 function draw() { background(220); // 每次绘制前清空画布,避免图形叠加 switch(currentShape) { case 'Kreis': ellipse(56, 46, 55, 55); break; case 'Dreieck': triangle(30, 75, 58, 20, 86, 75); break; case 'Quadrat': rect(30, 20, 55, 55); break; case 'Überraschung': let rN = Math.floor(Math.random() * 3); if (rN === 0) { line(30, 20, 85, 75); } else if (rN === 1) { ellipse(56, 46, 55, 55); } else { triangle(30, 75, 58, 20, 86, 75); } break; } }
额外提示
- 调用
background()可以确保每次绘制新形状时清空画布,避免不同图形叠加在一起; - 你需要根据实际场景(比如按钮点击、下拉选择)来调用
selectShape()函数,设置对应的currentShape值,触发不同的绘制逻辑; Überraschung分支的代码也需要调整到draw函数内部,不用再重新定义draw。
内容的提问来源于stack exchange,提问作者Nat_
相关产品推荐
相关产品推荐

