Использование функций p5 без формата настройки / рисования

Я относительно новичок в Javascript, и я возился с библиотекой p5 . В Python я могу импортировать одну функцию из библиотеки, используя from x import y statement :

 from subprocess import check_output 

Мой вопрос в том, есть ли способ сделать то же самое с p5 без использования формата setup/draw ? Скажем, например, я хочу использовать функцию noise в одном из моих сценариев; Можно ли импортировать и использовать эту функцию?

С такими вопросами лучше всего просто собрать суперпростой тест, чтобы попробовать:

 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Noise Test</title> <script src="p5.js" type="text/javascript"></script> <script> console.log(noise(100)); </script> </head> <body> Noise Test, check the console. </body> </html> 

Здесь мы загружаем библиотеку p5.js , а затем пытаемся вызвать функцию noise() . Если мы запустим это, мы получим сообщение об ошибке:

 Did you just try to use p5.js's noise() function? If so, you may want to move it into your sketch's setup() function. For more details, see: https://github.com/processing/p5.js/wiki/Frequently-Asked-Questions#why-cant-i-assign-variables-using-p5-functions-and-variables-before-setup index.html:9 Uncaught ReferenceError: noise is not defined 

Мы можем перейти к этому URL-адресу, чтобы прочитать о том, что происходит:

В глобальном режиме имена переменных и переменных p5 недоступны вне настроек (), draw (), mousePressed () и т. Д. (За исключением случаев, когда они помещаются внутри функций, вызываемых одним из этих методов).

Объяснение этому немного сложнее, но оно связано с тем, как настроена библиотека, чтобы поддерживать как глобальный, так и режим экземпляра. Чтобы понять, что происходит, давайте сначала посмотрим, что происходит при загрузке страницы с p5 (в глобальном режиме).

  1. Загружаются скрипты.

  2. загрузки страниц HTML (когда это будет завершено, срабатывает событие onload, которое затем запускает шаг 3).

  3. p5, все функции добавляются в глобальное пространство имен.

Поэтому проблема заключается в том, что скрипты загружаются и оцениваются до запуска p5, когда они еще не знают о переменных p5. Если мы попытаемся назвать их здесь, они вызовут ошибку. Однако, когда мы используем вызовы функций p5 внутри setup () и draw (), это нормально, потому что браузер не просматривает функции при первом загрузке скриптов. Это связано с тем, что функции setup () и draw () не вызываются в пользовательском коде, они только определены, поэтому материал внутри них еще не запущен или не оценен.

Пока не будет запущено p5, что функция setup () фактически запущена (p5 вызывает это для вас), и на данный момент функции p5 существуют в глобальном пространстве имен.

Итак, нет, вы не можете использовать функции p5.js без функций setup() и draw() .

При этом вы можете просто определить функцию обратного вызова, которую вы вызываете из setup() , таким образом, вы знаете, что p5.js функции p5.js :

 <script src="p5.js" type="text/javascript"></script> <script> function doYourStuff(){ console.log(noise(100)); } function setup(){ doYourStuff(); } </script> 

Кроме того, вы можете использовать режим экземпляра .

Это предполагает ручное создание экземпляра p5 и использование этого для вызова функций напрямую, а не для их вызова по всему миру:

 <script src="p5.js" type="text/javascript"></script> <script> var p5 = new p5(); console.log(p5.noise(100)); </script> 

Вы также можете прорыть источник.

Невозможно импортировать одну функцию, но вы можете просто выполнить поиск ctrl + f для нераспределенного источника для p5.js и искать функцию noise() . Затем вы можете скопировать это в свой собственный файл (и любые другие вспомогательные функции, на которые он опирается). Но это, вероятно, будет больше работы, чем просто использование одного из вышеуказанных подходов, плюс это может нарушить авторские права p5.js.