HSP備忘録的な何か1
はたして2はあるのか。あまり一般向けではないので追記にて。
2年ぐらい前にちらっと書いたやつの続きをまだやってます。
ADV部分。立ち絵とか背景できてないんで仮素材。立ち絵ベース+表情を別々に用意し合成して表示するタイプ。こういうシステム組む方が楽しいという罠。え、吉里吉里でいい?
HSPでこの手の(gmode7で背景透過する)立ち絵を表示する場合、
1) 透過PNGをimgloadで読み込む
2) 右に透過情報を持ったBMPをpicloadで読み込む
3) 外部DLLを使用して透過PNGを読み込む
主に1)か2)の方法でやるわけですが、それぞれ問題がいくつかあります。1)はpackfileが利用できない問題がありますし、2)は画像の準備が手間なのとbmpなのでファイルサイズが大きくなってしまう問題が。3)は処理が重くなるという。
元々3)の手法でp2b.dllを利用させてもらっていたのですが、試行錯誤の末2)に落ち着きました。そこでhspaim(HSPアルファブレンド画像メーカー)というソフトを利用させてもらっているのですがこのソフトで作成した画像は半透明部分が暗くなるという仕様が。目の部分とか縁が灰色になってちょっとまずいんですよね。作者様がソースを付属させてくれていたので解読。
右と左に背景白と黒の画像領域を用意し、imgloadでそれぞれに透過PNGを重ねる。左右のピクセルを比較し同じなら不透明、違いがあるならその差が透明度。という処理ですね。
問題となるのは左に用意した画像が黒の上に透過PNGを乗せただけということです。たとえば10%の濃さの白であれば左側の画像は原色の白で右側の透明度で10%を指定するのが本来の画像なのですが、この場合左側の画像には濃い灰色になってしまっています。修正しようとimgloadが使用しているIImgCtxを調べ……資料見つからねえええ。
きっちり修正するなら自前でPNG読んで貼り付けるのが一番なのですがあれチャンク解読やら色々自前でやろうとするともの凄く面倒なんですよね。問題は左側の画像が透明度の影響を受けていることなんで、それを極小にしてやればいい。ということで
mod_pngtomask.hspの84行目(pos 0,0の後ろ)に
repeat 10
imgload _PngFile
loop
を挿入してやれば縁取り問題は軽減されます。繰り返し回数は3〜15ぐらいで。大きいほど重くなりますが精度が上がります。
あ、自分用にはp2b.dll組み込んだやつでbmp作ってますが説明が長くなるので省略。人様のソフトの改変なので配布はしません。
話は戻って開発テスト用プログラムはPNGからBMPに移行途中なのもあってp2b.dll入れてるんですが、文字のアンチエイリアスのためにhgimg3使おうとしたらバッティングしたよ! hginiするだけでエラー吐くから変数名が関数名と被ってるのかと思ったらまさかのinclude部分だったよ! PNGは使わなくなるからまあいいけどね。