#author("2023-11-19T10:40:34+09:00","default:post","post") *簡単なシェルの揚げ方 [#t8d16a3e] シェルの作成は里々の領分ではないので、ここでは自力で絵を描ける・編集できる人向けのサクッと作る手順を紹介。~ 参考情報/2023年11月時点。 ---- #contents ---- ~ シェルの仕様書は先人の努力の積み重ねもあって高機能だが、そのぶん複雑にもなっている。~ 新機能もどんどん追加されているので、マニュアルがまだ追い付いていないことも多い。~ そこで、以下では現在の主流SSPを前提としたシンプルな手順を紹介。~ なにはともあれマニュアルはSSP公式仕様書へ。~ 着せ替えやアニメーションもちょっと解説が膨大になりやすいのでここでは割愛します。 -[[UKADOC - シェルの作り方>http://ssp.shillest.net/ukadoc/manual/dev_shell.html]] -[[UKADOC - descript.txt>http://ssp.shillest.net/ukadoc/manual/descript_shell.html]] -[[UKADOC - surfaces.txt>http://ssp.shillest.net/ukadoc/manual/descript_shell_surfaces.html]] *シェル画像の用意 [#gd1ea871] ゴースト名\shell\masterフォルダ内に画像を作る。~ (フォルダの構成は[[ファイル構成]]を参照)~ 過去の仕様も使えるので色々こんがらがるが、''今は新機能によってpnaを用意したり背景を原色にする等は必要なくなった''。~ **ベース画像を描こう [#c84ba1fd] 画像形式は''PNG32(32bit-PNG、アルファチャンネル透明度つきPNG)''で保存しよう。~ ファイル名は自分で覚えやすいもので。~ #ref(surface_base.png); ※ここではあくまで例としてAIさんに描いてもらいました。 **差分画像を作ろう [#e8c92da6] 表情などの差分はできるだけ透明部分(元絵の外縁部)を含めないように切り取るのがポイント。~ 解像度も変更しないのが吉。 #ref(surface_parts.png); 同じく形式は''PNG32(32bit-PNG、アルファチャンネル透明度つきPNG)''で保存しよう。~ こちらもファイル名は自分で覚えやすいもので。~ **当たり判定の画像を作ろう [#e2b6633c] &color(#FF0000){なにそれ!?};…と思った人もいると思うが、これを使うとかなり手間を省ける。~ (当たり判定がいらない場合は下記はスルーして欲しい)~ ゴーストの当たり判定については触った事があると思う。~ 従来はsurfaces.txtに書き込む情報なのだが、座標の数字を一つ一つ入力しなければならなかったため、これがまた非常に手間がかかるものだった。~ しかし、現在ではこれを画像で代用できるようになり、絵を描けるなら''この手間を省略できるようになった''。~ 具体的には、2値ペンなどを使い、こういうものを作る。~ #ref(surface_region.png); 画像形式はPNG。特に気にせずPNG32でよい。~ ただし、塗った色情報(RGB)はきちんとメモに控えておくこと!~ この画像の例では -頭(Head)が赤・R=255 G=0 B=0 -顔(Face)が緑・R=0 G=255 B=0 -胸(Bust)が紫・R=255 G=0 B=255 という色の情報をメモしておこう。~ 作るときは下図のようなイメージで。~ 使っているお絵描きツールで上から新規レイヤーで塗っていくとやりやすい。~ #ref(surface_region2.png); *descript.txtを作る [#fc4afd70] ここからはテキスト編集作業。~ メモ帳でもいいけど、なんかよさげなテキストエディタを選ぶと捗るはず。~ descript.txtはゴーストの辞書本体側(ghost)にも同じ名前のファイルがあるので、混同しないように気を付けて!~ こっちはシェル側のdescript.txt。 charset,UTF-8 craftmanw,作者名 type,shell name,シェルの名前 seriko.use_self_alpha,1 どれも重要だが、「seriko.use_self_alpha,1」に注目。~ これを書いておかないと用意したPNGの透明度が適用されない。~ また、下のsurfaces.txtに共通して、「charset」はShift_JISかUTF-8の文字コードを指定しよう。~ (今のwindowsで新規作成→テキストドキュメントで作った場合、文字コードは''UTF-8''になっているはず)~ これが違うと全角文字が化けるので、逆に化けていたなら文字コードが間違っているとも言える。~ *surfaces.txtを作る [#j1fe34ad] これさえ終わればシェルの最低限の体裁は整う。頑張って。 charset,UTF-8 descript { version,1 } surface0 { element0,base,ベース画像.png,0,0 collisionex0,Head,region,当たり判定画像.png,255,0,0 collisionex1,Face,region,当たり判定画像.png,0,255,0 collisionex2,Bust,region,当たり判定画像.png,255,0,255 } surface1 { element0,base,ベース画像.png,0,0 element1,overlayfast,差分画像その1.png,0,0 collisionex0,Head,region,当たり判定画像.png,255,0,0 collisionex1,Face,region,当たり判定画像.png,0,255,0 collisionex2,Bust,region,当たり判定画像.png,255,0,255 } surface2 { element0,base,ベース画像.png,0,0 element1,overlayfast,差分画像その2.png,0,0 collisionex0,Head,region,当たり判定画像.png,255,0,0 collisionex1,Face,region,当たり判定画像.png,0,255,0 collisionex2,Bust,region,当たり判定画像.png,255,0,255 } こんな感じで書いていけばサーフェス番号(0)と(1)と(2)が完成!~ ざっくりな解説 -&color(#ff0000){descriptブレス};~ ここでversion,1を指定しておかないと、以下でふんだんに使っている新仕様が機能しない。必須。 -&color(#ff0000){surface*ブレス};~ これの*で指定した数字が、サーフェス番号に対応する。0番のサーフェスにはsurface0{}という風に。 -&color(#ff0000){element*,描画メソッド,ファイル名,X,Y};~ 画像ファイルの指定。まんまお絵描きアプリの「レイヤー」。elementは数字の大きい方が上になる。~ 描画メソッドはレイヤーの合成方法。baseはまるごと、overlayfastは透明部分以外を重ねるみたいな。~ 要するに一番下のレイヤーはbaseで、上に重ねるレイヤーをoverlayfastにすればいい。~ XYは重ねる座標をpx単位でいじれる。ベースと差分画像の大きさが一緒なら0,0でいいから楽! -&color(#ff0000){collisionex*,当たり判定名,region,ファイル名,R,G,B};~ 画像のどの色を当たり判定にするかの指定。~ さっきメモした色情報を正確に書いていこう。 なお、このままシェルにぶちこんだ場合、SSPが「Surface10が存在しないよ!」とエラーを言ってくるが、これは伺かが伝統的に0番と10番を最初のデフォルト立ち絵として呼び出すため(メインが0、相方が10)なので、10番を定義すれば解消するし、surface10.pngという名前の画像ファイルを用意する事でも解決する。~ surface10.pngを用意する場合は1ドットの画像にしておくとよい。強制的に透明になる。~ いずれにせよ致命的なエラーではないので安心しよう。~ **もっと記述量を減らしたい! [#w507b105] いちいちcollisionexの行をコピペしまくるのが面倒!~ って感じたなら上の例は下のように書き換えられる。~ これで記述する手間をかなり省けるはず。~ charset,UTF-8 descript { version,1 } surface0-2 { element0,base,ベース画像.png,0,0 collisionex0,Head,region,当たり判定画像.png,255,0,0 collisionex1,Face,region,当たり判定画像.png,0,255,0 collisionex2,Bust,region,当たり判定画像.png,255,0,255 } surface.append1 { element1,overlayfast,差分画像その1.png,0,0 } surface.append2 { element1,overlayfast,差分画像その2.png,0,0 } -&color(#ff0000){surface0-2};~ surfaceブレスは「0-99」とか「0,2,4」といった指定方法が可能。~ つまりここでは0番1番2番の全部にベース画像と当たり判定を設定している。 -&color(#ff0000){surface.append*};~ これは*で指定したサーフェス番号にさらに追記する時に使う。~ 今回の例では同じベースや当たり判定はsurfaceブレスで一括で指定しておいて、~ surface.appendブレスで1番と2番のelement1に差分画像を設定している。 *余談 [#j402e2be] **差分の組み合わせは何を選べばいい?という話 [#ia04b9d6] シェルの差分の組み合わせの方法は、大きく分類すると2パターンある。~ ここでは上とは別のAI氏に描いてもらった絵を加工したものを例に解説。 ***パーツ分割タイプ [#qba50041] こちらはベースをのっぺらぼうにしておいて、上に目・口といった差分パーツを重ねていくパターン。~ 描き手にもよるが、顔パーツを別レイヤーで描いているならばカンタン。 #ref(ex_parts1.png); &color(#0000ff){''利点と難点''}; -表情パターンを全部いちいち書き出す必要がない。また、あとから絵のパーツの修正するのが楽。 -surfaces.txtで全ての組み合わせを書かねばならず、テキスト編集作業が膨大。 ***まるごとタイプ [#h15366e5] こちらは差分画像をパーツ周辺で切り取るか、もしくはまどろっこしい差分なんかでなく立ち絵まるごと一枚絵に出力するパターン。 #ref(ex_parts2.png); &color(#0000ff){''利点と難点''}; -めんどくさいsurfaces.txtのテキスト作業量がとにかく大幅に減る。本当に減る。 -サーフェスの数だけ何度も絵を書き出す必要がある。あとからパーツの修正しようとすると地獄。