p5.js中draw()函数内使用keyIsPressed报错:未定义引用错误
解决p5.js实例模式下draw()中keyIsPressed未定义的问题
你遇到的问题核心是p5.js实例模式的特性限制——当你通过var mazeDisplay = function(p) { ... }创建自定义p5实例时,所有p5的内置变量(比如keyIsPressed、key、mouseX这类)都属于这个p实例对象,并非全局可用,直接调用keyIsPressed自然会触发未定义错误。
修复方案:使用实例对象的p.keyIsPressed替代全局调用
只需要把代码里的keyIsPressed替换为p.keyIsPressed就能解决报错。如果要检测具体按键,同样要通过p.key来获取当前按键值。
举个修改后的代码片段示例:
var myp25; // 全局变量,用于同步修改 var globalMazeState = 0; var mazeDisplay = function(p) { p.setup = function() { var canvas = p.createCanvas(400, 400); }; p.draw = function() { p.background(220); // 检测按键按住状态 if (p.keyIsPressed) { // 根据不同按键修改全局变量 switch(p.key) { case 'ArrowUp': globalMazeState += 1; break; case 'ArrowDown': globalMazeState -= 1; break; } // 可视化全局变量状态 p.text('当前全局状态值:' + globalMazeState, 20, 30); } }; }; myp25 = new p5(mazeDisplay);
额外提示:处理单次按键触发(避免持续按住重复修改)
如果你的需求是按一次键只修改一次全局变量(而非按住时持续触发),可以在实例内维护一个状态变量来跟踪按键是否已处理:
var myp25; var globalMazeState = 0; var mazeDisplay = function(p) { var keyHasProcessed = false; // 标记按键是否已处理过 p.setup = function() { p.createCanvas(400, 400); }; p.draw = function() { p.background(220); if (p.keyIsPressed) { if (!keyHasProcessed) { if (p.key === ' ') { globalMazeState = 0; // 按空格重置全局状态 } keyHasProcessed = true; // 标记为已处理,避免重复触发 } } else { keyHasProcessed = false; // 松开按键后重置标记 } p.text('当前全局状态值:' + globalMazeState, 20, 30); }; }; myp25 = new p5(mazeDisplay);
这样就能在draw()函数内正常检测键盘事件,同时同步修改全局变量了。
内容的提问来源于stack exchange,提问作者Adam Lee
相关产品推荐
相关产品推荐

