按键时修改PShape颜色的实现方法(无需重新定义形状)
按键时修改PShape颜色的实现方法(无需重新定义形状)
嘿,我仔细看了你的问题和代码尝试,其实问题的核心很容易解决——你已经找对了修改颜色的方法,但漏掉了最关键的一步:在draw()循环里重新绘制PShape,这样样式的变化才能显示出来!
方法一:直接修改PShape的fill属性(推荐)
你第一个代码的问题在于:shape(s)只在setup()里调用了一次,之后draw()循环里修改了s.setFill(),但没有重新把形状画到画布上,所以视觉上完全没变化。只要在draw()里每次都重新绘制形状,就能看到颜色更新了。
修正后的代码如下:
PShape s; void setup() { size(100,100); // 只需要定义一次PShape s = createShape(RECT,25,25,50,50); s.setFill(color(75,183,19)); } void draw() { background(255); // 清屏避免之前的绘制残留 // 根据按键状态设置填充色 if(keyPressed && key == 'w') { s.setFill(color(217,93,47)); } else { // 松开w键时恢复初始颜色 s.setFill(color(75,183,19)); } shape(s); // 每次draw循环都重新绘制更新后的形状 }
这个方法完全不需要重新定义PShape,只需要在draw里更新fill后重新绘制即可,逻辑清晰且高效。
方法二:禁用PShape自身样式,使用全局fill
你尝试的disableStyle()思路是对的,但代码里有几个问题:比如自定义的shape()函数和Processing内置的shape()重名了,导致逻辑混乱;而且同样没在draw里重新绘制形状。
正确的disableStyle()用法是让PShape继承全局的fill/stroke样式,这样只要修改全局fill,再重新绘制形状就能改变颜色:
PShape s; void setup() { size(100,100); s = createShape(RECT,25,25,50,50); s.disableStyle(); // 让形状使用全局的样式设置 } void draw() { background(255); // 根据按键设置全局fill if(keyPressed && key == 'w') { fill(217,93,47); } else { fill(75,183,19); } shape(s); // 绘制形状,会自动使用当前的全局fill }
关键总结
不管用哪种方法,核心都是:样式修改后必须在draw()循环里重新调用shape(s)来渲染更新后的形状。只要做到这一点,就完全不需要重新定义PShape对象,就能实现按键切换颜色的效果啦!
备注:内容来源于stack exchange,提问作者Aydan Pronovost
相关产品推荐
相关产品推荐

