You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:28:52