p5.js 2.0 仮リリース 気付いたこといろいろ

# はじめに
　p5.jsの2.0がテスト運用の段階に入りました。正式リリースは来年の夏頃です。いくつもの新機能が用意されており、すでに話題になっています。2.0バージョンのレファレンスはこちら：

https://beta.p5js.org/reference/

互換性についてはここにガイドがあります。いろいろ書いてあります。

https://github.com/processing/p5.js-compatibility

ReleaseNoteはこちらです。正式リリースまでにいろんな変更が為されるでしょう。

https://github.com/processing/p5.js/releases/tag/v2.0.0

既にQiitaの記事を書いてくださっている人もいます。

https://qiita.com/youtoy/items/d9f26b3ad3f18e381035

そういうわけなので、自分もわかる範囲でなんかゆるく書こうと思いました。

　なお、現在もデフォルトは1.11.5のままです。OpenProcessingでは2.0.0をデフォルトにすることもできますが、任意です。従来のスケッチだと容易にエラーまみれになる可能性があるので、当然の処置です。

## p5.js 2.0について気付いたこといろいろ

### createVectorで2つ以上の引数を指定するとフレンドリエラ―が出る（2025/04/23現在）

![wr3g3t3g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/195c2cb3-2618-46c3-8285-e8bbd739756f.png)

　現在、createVectorを使うと引数が2つ以上の場合にエラーが出ます。p5.Vectorで作る場合はエラーが出ないのでそうしましょう。もし毎フレーム100回とか1000回とか呼び出していたりすると悲劇です。なお2.0.0では引数は最大4つまで取ることが出来るようです。原因はバリデーションバグなので動作自体は正常です。

### image()の第一引数にcreateGraphicsで作ったものを入れるとフレンドリエラ―が出る（2025/04/23現在）

![eg3g3g3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/37434528-7e50-4c8f-9f7e-8a26527a9d46.png)
　imageの第一引数にcreateGraphicsで作ったオフスクリーンキャンバスを入れるとフレンドリエラ―が出ます。原因はp5.Graphicsの位置づけがp5.Elementの継承ではなく独立クラスになったため、imageの第一引数がこれを許していないがために起きているようです。これもバリデーションバグなので、動作自体は正常ですが、毎フレーム実行することを考えるとうっとうしいですね...まあdisable使えばいいんですが。
　単に画像を貼り付けたいだけならeltを取り出してdrawImageをコンテクストから使えばいいです。

![fwfg3wg3v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/dd19117c-5355-443e-8c26-648dabdc87df.png)

### createGraphicsで作るオフキャンバスに地のpixelDensityが反映されない
　pixelDensityが2の場合、createGraphicsで作るキャンバスもpixelDensity,というかcss上のサイズとデータ領域としてのサイズの比が2になります。今まではそうでしたが、2.0.0ではそうではなくなっています。

1.11.5の場合
![11111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/a3007a3b-2a0d-4cfb-ad24-54a6864b7c99.png)
このように2倍になっていますが...

2.0.0の場合
![2222222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/8decc595-ddd2-4a44-a100-6214c197f9e3.png)
このようにどっちも100になっています。つまりすべてpixelDensityは1の扱いです。ところでidが同一になっていますね...よくない仕様だと思います。同じidを付与することは可能なんですが、idの価値がないので、別々にすべきではないでしょうか（1.11.5以前ではそもそもidが無い）。なおdocument.getElementById("defaultCanvas0")を使うと先に用意された地のキャンバスが取得されます。
　pixelDensityを揃えるにはこうします。
![erf23r3f3rf3t3g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/fdbd2367-5e10-48a4-bd66-69e8206225c1.png)
ついでにidが同じなのを嫌う場合はsetAttributeを使えばいいです。

### createGraphicsで作ったグラフィックがsave関数を持たない
　saveの仕様が変わりました。

https://beta.p5js.org/reference/p5/save/

以前のようにgr.saveではセーブされません。
![sdfsvdsaveeeeevvv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/5a187ff3-4a96-4915-b990-6bc1e2409ac8.png)

このようにエラーが出ます
![egerg4rhsaveeee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/4db38da2-453e-4915-a60c-b969a7fab8b0.png)

第一引数をキャンバスにしましょう。
![saveveveveve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/9846d094-255e-4b51-a0df-4c5bfc1458e4.png)

### preloadが廃止されている（asyncを使う指示）
　preloadが廃止されました。これからはasyncとawaitを使いましょう。

https://dev.to/limzykenneth/asynchronous-p5js-20-458f

![ef3f3g3g3gg3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/32752803-b06d-45d1-9a84-7a6f0af8db30.png)

![wf3fgf34g3g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/97495697-ab10-49c5-975f-a129e8a623f9.png)

### カスタムフォントで絵文字が化けてしまう問題が解消されている（うれしい）
　カスタムフォントを使うと、以前はたとえばふい字と絵文字が両立できませんでした。また、斜体も反映されませんでした（FontFaceという裏技があるんですがもう取り上げたのでここでは割愛します）。

![ef3f3gg3tttttt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/f2f1b746-c1a7-4a3e-93fb-02021b260ccd.png)

これが解消されました。本来のjsの仕様です。嬉しいですね。letterSpacingも機能するようです。

![wfevrrrrrr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/256e8238-e4c3-4d23-b6de-89498ec718f8.png)

### this.canvasで地のキャンバスにアクセスできない
　今までは
```js
function setup() {
  createCanvas(400, 400);
  console.log(this.canvas);
}
```
でキャンバスが取れたんですが、2.0.0では取れません。ちょっとやり方が分かんないので、現在はdocument.getElementByIdで対処しています。無いと不便なので。

![wf3evr656666.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/69e9730e-7214-4cff-8e99-114049497e60.png)

多分なんか方法があるはずです。

### webGLでthis._renderer.GLで地のキャンバスのレンダラーにアクセスできない
　drawingContextで同じものが取得できるのでそうしてください。this._renderer.GLという記法を採用しているコードは根元から崩れることになります。まあ横着なのであまり良くないですね。webGLもまだまだできないことがたくさんあるので、そういうことがやりたい場合に利用価値があります。というか、無いと単純に不便です。

### textToModelでextrudeに正の数を指定すると法線のエラーが大量に出る（2025/04/23現在）
　文字メッシュが導入されました。

https://beta.p5js.org/reference/p5.font/texttomodel/

問題なく使えるんですが、extrudeというのがあって、厚みのあるメッシュを作る際の法線関連のバグが解消されていません。

![wegf3grb3333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437349/28323740-6513-4fd1-b740-1982192ac704.png)

ただそこまで気にするほどでもないので、特に問題ないかと思います。動作は正常です。

# おわりに
　便利な新機能がたくさんあるので気にせず使ったらいいと思います。バグは随時解消されていくはずですが、気になった場合はこちらからissueをお送りください。

https://github.com/processing/p5.js/issues

いつだったか話題になっていたスクリーン座標を取得する関数も実装されました。嬉しいですね。

https://beta.p5js.org/reference/p5/worldtoscreen/

　ここまでお読みいただいてありがとうございました。