WSN追加案: シナリオの高解像度対応
現在のCardWirthPyの高解像度対応はシナリオ作成の観点から見て不完全です。
- カードイメージは配置の特性上、例えば2×2スケールのために148×188で描いて1×1の時は縮小する、というような事ができません。
- 背景イメージはシナリオ側でサイズを指定するため1.のような事が可能ですが、プレイヤー側の背景をスムージングする・しないの設定によって上手く表示できない場合があります。
2.については、強制的にスムージング有無を指定するオプションをシナリオデータに追加すればある程度解決しますが、縮小アルゴリズムが常に同じである保証はできませんし、そもそもベターなアルゴリズムはイメージによって異なります。
この問題については数年来考え続けているのですが、どうも次のような考え方がベターのように思えています。
- 音声ファイルに対する
*.sli
のように、イメージファイルに対する設定ファイルを用意する。例えばfile.bmp.xml
のような。 - 設定ファイルには以下のような情報を指定できるようにする。
- 縮小時にスムージングを行う・行わない(例えば従来のマスク画像のようなものはスムージングしてはいけません)
- 2×2スケールの時は代替としてこのファイルを使う、4×4の時は……というような代替ファイル指定
- プレイヤーのスケール指定に該当する代替ファイルが無い場合、近い解像度のものを拡大・縮小して選択する。2×2の時に指定が無い場合は4×4用を縮小するなど。
この方法ならスケールによってシナリオ作者が望んだイメージを表示させる事ができますし、それを省略して自動的な拡大・縮小に任せる事もできますし、font_?.bmp
のような表示方法にも対応できますし、宿側のFaceイメージにも適用できます。
もちろん、背景のスムージング指定などの他の方法と並立させる事もできるはずです。
Comments (27)
-
reporter -
(ぼそぼそ)ぇ、svg形式とか、解像度関係ないのもこの際一緒にサポートする、とか......
-
reporter CWPyの裏方であるpygameライブラリのその裏方のSDLはラスタイメージを基本としていて、SVGのようなベクタイメージを扱うには、それを読み込む手段とラスタ形式に変換する手段が必要です。
自作するとなるとゲーム数本作る並の巨大な壁になるので、既成のライブラリを探してくる必要がありますが、現時点で目標を達成できるものがあるかは分かりません。ちょっと探したくらいでは見つからないですね。
-
reporter pull request #1645
試験的な実装ですが、
cast.bmp
がある時にcast.x2.bmp
があれば、2倍以上のスケールの時はそちらを優先して読み込むようにしました。色々試してみましたが、これが一番既存のシナリオに素材を追加するのが楽なように思います。シナリオの方では、既存のシナリオに含まれるファイルへの誤爆を避けるため、スケーリングされたイメージファイルが存在すれば使用するオプションをオンにした時のみ機能します。対応するエディタは cwxeditorの20161127b版以降で、当該オプションはシナリオの概略にあります。
クラシックなシナリオは各種カードのイメージが必ず格納されているため、対応するのは非常に困難です。
スキンのイメージやエンジンで作成したPCに使う画像は、今のところ無条件にスケーリングされたファイルを探すようにしています。
pull request #1646
背景イメージのスムージングの有無をシナリオ側から指定できるオプションを追加。これで、元のファイルを2倍スケールにして縮小して表示したいがスムージングありの縮小じゃないと変になるし……といった場合に対応できます。
以上の機能のデモとして、シナリオ「六号室の幽霊船」の2倍スケール対応バージョンを作ってみました。描画サイズを2倍にすれば、以下のように表示されるはずです。
-
reporter 素材は全部CC0の自作かと思ってたけどよく見たらカード台紙が……。
上記スクリーンショットのPCとメニューカードの台紙及びPCのライフゲージのイメージは、groupAsk様によって作成され、CardWirth愛護協会によって配布されている「CardWirth ver1.50 Fullpack」に入っている
CardWirth.exe
から抽出したものです。ReadMe_1st_Full.txt
内の「● 著作権/免責/転載に関して」節の内容に基づいてスクリーンショット内に使用しています。それ以外のイメージは私が作成したもので、ライセンスはCC0です。
-
シナリオでなくスキンですがこちらに。スケーリング画像があるとオープニングアニメ中に多くのバグが見られます。
- セルの位置がずれる
- 回転するカードは
.xN
がさらに拡大されてしまう - アニメ中にF4キーを押してもスケーリング画像が切り替わらない
-
reporter ありがとうございます。pull request #1690とpull request #1691で修正しました。高解像度周りを入れた時に全体をチェックして回りましたが、その時に
AnimationCell
周りをそっくり見落としていた気がします。今年もよろしくお願いします。
-
対応ありがとうございます。修正確認しました。
そういえばもう新年でした。あけまして、今年もよろしくお願いします。
-
スキンリソース内のフォント画像も
.xN
がさらに拡大されてしまうようです。 -
reporter ありがとうございます。ちょうど折よく(?)そのバグに気づいて直したところでした(pull request #1692)。
なぜ気づいたかというと、Classicスキンの特殊フォントの拡大を終えて表示を確認していたためです(それもアップロード済みです)。作業が重複してしまった予感がする……。
-
まさに同じ作業をしていました。自前の画像から作業していくべきでしたね。
ともあれ作業お疲れ様です。ありがとうございます。
-
LEFEBAR
とLIFEGUAGE
が二重拡大されました。MIND1.x2
を用意してデバッガから精神状態を変更しようとしても動作せず、ログを吐きました。Traceback (most recent call last): File "cw\debug\statusedit.pyo", line 292, in OnMentality File "cw\dialog\edit.pyo", line 448, in __init__ File "wx\combo.pyo", line 978, in Append wx._core.PyAssertionError: C++ assertion "width == m_usedImgSize.x && height == m_usedImgSize.y" failed at ..\..\src\common\bmpcboxcmn.cpp(146) in wxBitmapComboBoxBase::OnAddBitmap(): you can only add images of same size
-
reporter - pull request #1694
- pull request #1695
ありがとうございます。どちらも修正できたと思います。
以下は本題とは別の話になります。
LIFEGUAGE
はCWのイメージの中でも少し特殊なやつで、左上から5・5pxの位置を透過色として使用する事になっています。その透過部分にLIFEBAR
を転写して得られた結果のイメージは左上が透過色となり、ライフバー本体の出来上がりとなります。しかし、この描画方法では、例えばアルファ値つきイメージで
LIFEGUAGE
を用意して、外周部分をアンチエイリアスつきの透過色にする、というような事ができません。そこで、LIFEGUAGE2
というリソースが用意されている場合はそちらを優先して使用し、LIFEGUAGE2
に対してはLIFEBAR
を乗算描画し、アルファ値はそのまま活かすようにしました(アルファ値がない場合は左上が透過色)。乗算描画すると何が起きるかを端的にいうと、真っ白な部分にLIFEBAR
がそのまま描かれるような感じになります。ライフバーでもアンチエイリアスをしたいというような場合はLIFEGUAGE2
を利用してください。 -
修正確認しました。
状態アイコンに
.xN
があるものとないものが混在している場合(作りかけでもないと起きないでしょうが)、デバッガのキャラクター状態の編集ダイアログのアイコンが不揃いになりますね。拡大の影響を受けないダイアログでは、.xN
を使用しないようにしたほうがいいのではないでしょうか。
LIFEGUAGE2
についてですが、LIFEBAR
が乗算描画されるのではハイライトを入れることができず、ガラスや金属の光沢を表現することが難しいです。LIFEBAR
の上にLIFEGUAGE2
をアルファブレンドしたほうがいいのではないでしょうか。 -
reporter そういえばそうですね。ライフゲージは単純な枠+中身以外に色々な表現方法が考えられるので、特殊フォントとは事情が違います。
しかし二種類のマスクを用意する必要がある(
LIFEBAR
に大して透過する部分と、カードに載せる時に最終的に透過される部分)ので、単純な合成はできません。どうも、マスク用の別のイメージを用意するとかの、別のアプローチが必要そうです。ちょっと考えてみます。
-
reporter 状態アイコンの方ですが、内部処理がちょっと(かなり)混乱しています。すみませんが修正まで少し時間をください。
-
reporter pull request #1696
たぶんなんとかなったと思います。
-
reporter LIFEBAR
の上にLIFEGUAGE2
を描画した上で、LIFEGUAGE2_MASK
の透過色が反映されるようにしました。昔のゲームのマスク処理のようで少々複雑ですが、2種類の透過情報という問題を解決するには2つのファイルを用いるしかなさそうです。
-
高解像度で荷物袋やカード置き場からカードを取り出そうとすると、ログを吐いて止まります。
Version : 2.0 Alpha 1 / 2017-01-11 19:58:02 DateTime: 2017-01-11 23:07:11 Traceback (most recent call last): File "cw\thread.pyo", line 707, in run File "cw\thread.pyo", line 737, in _run File "cw\thread.pyo", line 746, in main_loop File "cw\eventhandler.pyo", line 113, in run File "cw\eventhandler.pyo", line 618, in executing_event File "cw\dialog\cardcontrol.pyo", line 1165, in test_aptitude File "cw\thread.pyo", line 3378, in show_numberofcards File "cw\sprite\background.pyo", line 1288, in __init__ File "cw\sprite\background.pyo", line 1300, in update_scale File "cw\thread.pyo", line 3348, in get_selimage File "cw\imageretouch.pyo", line 118, in add_lightness File "cw\util.pyo", line 738, in copy AttributeError: 'Depth1Surface' object has no attribute 'scr_scale'
-
reporter pull request #1714
ありがとうございます。カード交換が可能な時に表示されるスプライトが高解像度化されていた時に起こる問題でした(選択時の若干明るくした画像を生成する際にスケール情報が失われてしまう)。修正しました。
-
修正を確認しました。ありがとうございます。
キャラクター情報ダイアログからデザインの編集を行うとき、現在のPCの画像がスケーリングされていないと、Faceフォルダ内のスケーリング画像も無視されてしまうようです。表示のみの無視で、変更してみると反映されるのですが。
-
reporter ありがとうございます。pull request #1716で修正しました。
表示するイメージを読み込む時の条件設定が間違っていました(PCの現在の設定を使用していた)。
-
mode.ini
等を利用することで、クラシックシナリオでも高解像度対応できるようにはできないでしょうか。また、
Table
内の.xN
はスケーリングが有効でないシナリオでも表示されるようにならないでしょうか。(BloodWirthではTable
内の画像も軒並み.x2
を作成しましたが、これがクラシックシナリオでは表示できず、共通画像なのにいまいち統一感がありません。強い要望ではないので、簡単に実装できそうになければ労力を割く必要はないと思います) -
reporter クラシックなシナリオは対応困難です。というのも、イメージ格納というものが存在するからです。必然的に全てのキャストカード・効果カード・情報カードは既存のスケールにならざるを得ません。
背景は、そもそも最初から大きなものを用意して縮小する事ができるので、効果が薄いです。
とすると対応できるのはメニューカードとメッセージの話者だけという事になりますが、これだけ高解像度化しても結局はチグハグな事になるかと思います。
ちなみにcwxeditorでは上記格納イメージを参照で設定できるように見えますが、あれはエディタ側の拡張情報で参照の情報を持っています。エンジン側では使っていません。1から対応するのはかなり大変です。
また、
Table
内の.xN
はスケーリングが有効でないシナリオでも表示されるようにならないでしょうか。たしかにそうですね。これは実際簡単なので、pull request #1728で対応しました。
-
諸々修正お疲れ様です。いつもありがとうございます。
クラシックなシナリオは対応困難です。
そうですか。個人的に一番高解像度化したいのは、プレイヤーの手元に残るカード類ですから、それができないならたしかに、あまり意味がない気がしますね。
やはりWSN版を別に用意して解決しようと思います。お答えありがとうございます。
-
reporter - changed status to resolved
当初の提案を縮小して
.xN
のみが実装されていますが、XMLで管理情報を作るなどの方法は手間からいって現実的ではなく、現状で必要充分に思えます。という事で完了にしておきます。
-
reporter Issue
#48was marked as a duplicate of this issue. - Log in to comment
管理ファイルを用意したりせずに済む簡便な方法も平行してあった方がよいかもしれません。
例えば以下のような名前のファイルを用意して:
cast.x1.bmp
cast.x2.bmp
cast.x4.bmp
それぞれが1倍・2倍・4倍スケールの時に自動的に選択されて表示されるというのはどうでしょうか。
もちろんこれは既存のシナリオですでにそのようなファイル名を使用していた場合に誤動作するので、シナリオ側にスイッチを設けるなどの工夫が必要になります。