【ドット絵エディタ制作】3回目:JSONファイルの保存

お絵描きしたデータをJSONファイルにしてローカルに保存できるようにした。

作ったもの

ドロップダウンメニューから「保存」-「JSON形式」をクリックすると、
ファイルのがダウンロードできる。
メニューには「読み込み」があるが未実装。

確認用ページ

ソースコード

クラス図

数が増えてきて見にくかったので、
メンバを非表示にし、クラスの依存関係のみを表示した。

DrawLayerクラスに描画されている内容をCanvas2DrawLayerDataクラスで解析して、DrawLayerDataクラスを作成する。
PixcelArtDataクラスはDrawLayerDataクラスをまとめる役割。

将来的にレイヤー数を増減できること想定しているため、Data系クラスの構造や処理が複雑になってしまった。

つまづきポイント

色・座標データ抽出は、絵周囲の空白領域の除外が重要

ファイルにデータを書き出すにあたり、できる限り不要なデータは除外したかった。
Canvasから色情報を取得すること自体は難しいことではないが
それだと絵周辺の空白領域の情報も含んでしまうため不要なデータを多く含んでしまうことになる。

そのため、処理を
 1.どこまでが空白領域なのかを調べる
 2.1で得た情報をもとに、絵の描かれている領域の色情報を取得する
と二段階にわけた。

TypeScriptではクラスの多重継承ができない

ドロップダウンメニューはBootstrapのコンポーネントを利用しているが
これの処理を拡張するためにFileDropdownMenuクラスを作成した。

当初はbootstrap.Dropdownを継承して作成していたが、
イベント発火やイベントリスナーの機能も欲しくなり、
createjs.EventDispatcherも継承したくなった。

しかし、TypeScriptでは多重継承ができないので、
bootstrap.Dropdownの継承をあきらめ、
createjs.EventDispatcherのみ継承するラッパークラスにした。

参考:TypeScript での多重継承 | Delft スタック

File System Access APIがTypescriptでエラーになった

ローカルにファイルを保存する際にFile System Access APIを利用しようとしたところ、
TypeScriptのエラーがでてしまいコンパイルができなかった。

調べてみたところ、TypeScript側の問題のようで
以下のパッケージをインストールしたら無事にコンパイルできた。

npm i -D @types/wicg-file-system-access

なお、File System Access APIはChromium系ブラウザでのみサポートされており、
FirefoxやSafariではサポートされていないようなので、
それらに向けては、Aタグを使った従来のダウンロード方法で実装した。

参考:javascript – Uncaught (in promise) TypeError: window.showOpenFilePicker is not a function – Stack Overflow
File System Access APIを使ってローカルファイルの読み書きを試してみる – Qiita
ファイルをダウンロード保存する方法 – JavaScript の基本 – JavaScript 入門

追加したイシュー


ひとこと

書き出したデータの内容が正しいかどうかは、読み込んでみないとわからない…。