我正在尝试弄清楚如何让用户使用P5和JS上的按钮单击来逐步执行算法。我的另一个代码接受一些文本,并显示一些在下面提到的算法中使用的自定义字符单元格。我希望用户单击Next按钮,让它逐步执行,并在执行每一步之前等待用户输入。
下面是一个代码片段
async function straightforward(patternCells, textCells){
const timeout = async ms => new Promise(res => setTimeout(res, ms));
let nextStep = false;
forwardButton = createButton("->",0,0);
forwardButton.position(confirmButton.x + backButton.width, 400);
forwardButton.mousePressed(() => next = true)
//Do some set up and display the button
for (var i = 0; i < textLen; i++) {
var j = 0;
await waitButtonNext();
//algorithm runs here
}
async function waitButtonNext() {
while (nextStep === false) await timeout(1); // pause script but avoid browser to freeze ;)
nextStep = false; // reset var
}
chrome上的控制台也没有错误。
2条答案
按热度按时间epggiuax1#
有很多方法可以做到这一点。一种方法是在每一步创建一个函数数组,每当按下按钮时一次执行一个函数。
例如:
这个例子有点做作,因为每一步都没有动画。一个更真实的例子应该包含动画。
一种继续避免
draw
函数中if
/else
令人讨厌的链的方法(尽管这在紧要关头确实有效)是在每一步替换draw
,并且可选地根据需要操作noLoop()
和loop()
以开始和停止动画。一个二个一个一个
更进一步说,假设你想重复一个步骤。这在这个设计中是非常容易的。不是永久地从动作数组中移动每个函数,而是保留一个索引来引用应该采取的动作。响应按钮点击,改变索引并调用相应的函数。这是在p5.js中实现"场景"的一种方法。在某些情况下,使用每个状态都有明确命名的键的对象可能是有意义的,例如
{titleScreen: () => ..., endingScreen: () => {...}}
等。请参见使用p5.js从一个场景过渡到下一个场景以了解对此的完整处理。您还可以"旋转"行为数组以创建循环重复,例如:
如果愿意,可以将所有这些场景或步骤函数存储在单独的外部文件中,从而使代码易于维护。
yqhsw0fo2#
实现这一点的一种方法是,将希望执行一次的脚本放入一个单独的函数中,在按下按钮时调用该函数,同时在单独的变量中跟踪已完成的迭代