如何在实例模式下使用p5.js声音
How to use p5.js sound in instance mode
我正在尝试在同一页面上制作一个具有多个 p5 画布的网站,因此经过大量研究,我得出的结论是,最合适的方法是在 p5 上使用实例模式。
我花了一整天的时间试图理解实例模式,我什至在网上找到了一个可以为我转换它的转换器,但我试图自己完成这一切,只是为了检查错误。问题是我找不到使用实例模式在我的草图中使用声音的方法。我的代码要复杂得多,但即使只是尝试基本的代码,它仍然不起作用。
var s = function(p) {
let song;
p.preload = function() {
p.song = load('thunder.mp3')
}
p.setup = function() {
p.createCanvas(720, 200);
p.background(255, 0, 0);
p.song.loop();
};
};
var myp5 = new p5(s, 'c1');
html, body {
margin: 0;
padding: 0;
}
canvas {
display: block;
}
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>
<script language="javascript" type="text/javascript" src="sketch.js"></script>
<style> body {padding: 0;
margin: 0;
}
<meta charset="UTF-8">
</style>
</head>
<body>
<div id="c1"></div> <br>
<div id="c2"></div>
</body>
</html>
你可以在这里测试它:https://editor.p5js.org/jgsantos.dsn/sketches/rUWb6Nurt
此代码在全局模式下运行良好:
let song;
function preload() {
song = loadSound('thunder.mp3');
}
function setup() {
createCanvas(720, 200);
background(255,0,0);
song.loop();
}
html, body {
margin: 0;
padding: 0;
}
canvas {
display: block;
}
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/addons/p5.sound.min.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
</head>
<body>
<script src="sketch.js"></script>
</body>
</html>
你可以在这里测试它 https://editor.p5js.org/jgsantos.dsn/sketches/_lQcDqOsp
它显示此错误:“未捕获的 ReferenceError:未定义加载(:第 9 行)”
我做错了什么?
提前致谢!
请尝试 post 您 运行 的确切代码。您的问题包含的代码与您在评论中 post 编辑的 link 不同。
但退一步说,我是这样看待实例模式和库的:
- 实例模式意味着属于 sketch 的变量和函数现在通过变量引用,在您的例子中是
p
变量。
- 但是属于库的变量和函数仍然被直接引用,即在“全局模式”中。
换句话说,您不想使用实例模式引用load()
(或者是loadSound()
?)函数。您仍然应该直接引用该函数,因为它来自库而不是特定的草图。
我正在尝试在同一页面上制作一个具有多个 p5 画布的网站,因此经过大量研究,我得出的结论是,最合适的方法是在 p5 上使用实例模式。 我花了一整天的时间试图理解实例模式,我什至在网上找到了一个可以为我转换它的转换器,但我试图自己完成这一切,只是为了检查错误。问题是我找不到使用实例模式在我的草图中使用声音的方法。我的代码要复杂得多,但即使只是尝试基本的代码,它仍然不起作用。
var s = function(p) {
let song;
p.preload = function() {
p.song = load('thunder.mp3')
}
p.setup = function() {
p.createCanvas(720, 200);
p.background(255, 0, 0);
p.song.loop();
};
};
var myp5 = new p5(s, 'c1');
html, body {
margin: 0;
padding: 0;
}
canvas {
display: block;
}
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>
<script language="javascript" type="text/javascript" src="sketch.js"></script>
<style> body {padding: 0;
margin: 0;
}
<meta charset="UTF-8">
</style>
</head>
<body>
<div id="c1"></div> <br>
<div id="c2"></div>
</body>
</html>
此代码在全局模式下运行良好:
let song;
function preload() {
song = loadSound('thunder.mp3');
}
function setup() {
createCanvas(720, 200);
background(255,0,0);
song.loop();
}
html, body {
margin: 0;
padding: 0;
}
canvas {
display: block;
}
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/addons/p5.sound.min.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
</head>
<body>
<script src="sketch.js"></script>
</body>
</html>
它显示此错误:“未捕获的 ReferenceError:未定义加载(:第 9 行)” 我做错了什么? 提前致谢!
请尝试 post 您 运行 的确切代码。您的问题包含的代码与您在评论中 post 编辑的 link 不同。
但退一步说,我是这样看待实例模式和库的:
- 实例模式意味着属于 sketch 的变量和函数现在通过变量引用,在您的例子中是
p
变量。 - 但是属于库的变量和函数仍然被直接引用,即在“全局模式”中。
换句话说,您不想使用实例模式引用load()
(或者是loadSound()
?)函数。您仍然应该直接引用该函数,因为它来自库而不是特定的草图。