WSN追加案: シナリオの高解像度対応

Issue #397 resolved
k4nagatsuki repo owner created an issue

現在のCardWirthPyの高解像度対応はシナリオ作成の観点から見て不完全です。

  1. カードイメージは配置の特性上、例えば2×2スケールのために148×188で描いて1×1の時は縮小する、というような事ができません。
  2. 背景イメージはシナリオ側でサイズを指定するため1.のような事が可能ですが、プレイヤー側の背景をスムージングする・しないの設定によって上手く表示できない場合があります。

2.については、強制的にスムージング有無を指定するオプションをシナリオデータに追加すればある程度解決しますが、縮小アルゴリズムが常に同じである保証はできませんし、そもそもベターなアルゴリズムはイメージによって異なります。

この問題については数年来考え続けているのですが、どうも次のような考え方がベターのように思えています。

  1. 音声ファイルに対する*.sliのように、イメージファイルに対する設定ファイルを用意する。例えばfile.bmp.xmlのような。
  2. 設定ファイルには以下のような情報を指定できるようにする。
    • 縮小時にスムージングを行う・行わない(例えば従来のマスク画像のようなものはスムージングしてはいけません)
    • 2×2スケールの時は代替としてこのファイルを使う、4×4の時は……というような代替ファイル指定
  3. プレイヤーのスケール指定に該当する代替ファイルが無い場合、近い解像度のものを拡大・縮小して選択する。2×2の時に指定が無い場合は4×4用を縮小するなど。

この方法ならスケールによってシナリオ作者が望んだイメージを表示させる事ができますし、それを省略して自動的な拡大・縮小に任せる事もできますし、font_?.bmpのような表示方法にも対応できますし、宿側のFaceイメージにも適用できます。

もちろん、背景のスムージング指定などの他の方法と並立させる事もできるはずです。

Comments (27)

  1. k4nagatsuki reporter

    管理ファイルを用意したりせずに済む簡便な方法も平行してあった方がよいかもしれません。

    例えば以下のような名前のファイルを用意して:

    • cast.x1.bmp
    • cast.x2.bmp
    • cast.x4.bmp

    それぞれが1倍・2倍・4倍スケールの時に自動的に選択されて表示されるというのはどうでしょうか。

    もちろんこれは既存のシナリオですでにそのようなファイル名を使用していた場合に誤動作するので、シナリオ側にスイッチを設けるなどの工夫が必要になります。

  2. 権兵衛 七篠

    (ぼそぼそ)ぇ、svg形式とか、解像度関係ないのもこの際一緒にサポートする、とか......

  3. k4nagatsuki reporter

    CWPyの裏方であるpygameライブラリのその裏方のSDLはラスタイメージを基本としていて、SVGのようなベクタイメージを扱うには、それを読み込む手段とラスタ形式に変換する手段が必要です。

    自作するとなるとゲーム数本作る並の巨大な壁になるので、既成のライブラリを探してくる必要がありますが、現時点で目標を達成できるものがあるかは分かりません。ちょっと探したくらいでは見つからないですね。

  4. k4nagatsuki reporter

    pull request #1645

    試験的な実装ですが、cast.bmpがある時にcast.x2.bmpがあれば、2倍以上のスケールの時はそちらを優先して読み込むようにしました。色々試してみましたが、これが一番既存のシナリオに素材を追加するのが楽なように思います。

    シナリオの方では、既存のシナリオに含まれるファイルへの誤爆を避けるため、スケーリングされたイメージファイルが存在すれば使用するオプションをオンにした時のみ機能します。対応するエディタは cwxeditorの20161127b版以降で、当該オプションはシナリオの概略にあります。

    クラシックなシナリオは各種カードのイメージが必ず格納されているため、対応するのは非常に困難です。

    スキンのイメージやエンジンで作成したPCに使う画像は、今のところ無条件にスケーリングされたファイルを探すようにしています。


    pull request #1646

    背景イメージのスムージングの有無をシナリオ側から指定できるオプションを追加。これで、元のファイルを2倍スケールにして縮小して表示したいがスムージングありの縮小じゃないと変になるし……といった場合に対応できます。


    以上の機能のデモとして、シナリオ「六号室の幽霊船」の2倍スケール対応バージョンを作ってみました。描画サイズを2倍にすれば、以下のように表示されるはずです。

    example_scaledimage.jpg

  5. k4nagatsuki reporter

    素材は全部CC0の自作かと思ってたけどよく見たらカード台紙が……。

    上記スクリーンショットのPCとメニューカードの台紙及びPCのライフゲージのイメージは、groupAsk様によって作成され、CardWirth愛護協会によって配布されている「CardWirth ver1.50 Fullpack」に入っているCardWirth.exeから抽出したものです。ReadMe_1st_Full.txt内の「● 著作権/免責/転載に関して」節の内容に基づいてスクリーンショット内に使用しています。

    それ以外のイメージは私が作成したもので、ライセンスはCC0です。

  6. Iraka.T

    シナリオでなくスキンですがこちらに。スケーリング画像があるとオープニングアニメ中に多くのバグが見られます。

    • セルの位置がずれる
    • 回転するカードは.xNがさらに拡大されてしまう
    • アニメ中にF4キーを押してもスケーリング画像が切り替わらない

    https://bitbucket.org/IrakaT/mywirth/downloads/TITLE.zip

  7. k4nagatsuki reporter

    ありがとうございます。pull request #1690とpull request #1691で修正しました。高解像度周りを入れた時に全体をチェックして回りましたが、その時にAnimationCell周りをそっくり見落としていた気がします。

    今年もよろしくお願いします。

  8. Iraka.T

    対応ありがとうございます。修正確認しました。

    そういえばもう新年でした。あけまして、今年もよろしくお願いします。

  9. Iraka.T

    スキンリソース内のフォント画像も.xNがさらに拡大されてしまうようです。

  10. k4nagatsuki reporter

    ありがとうございます。ちょうど折よく(?)そのバグに気づいて直したところでした(pull request #1692)。

    なぜ気づいたかというと、Classicスキンの特殊フォントの拡大を終えて表示を確認していたためです(それもアップロード済みです)。作業が重複してしまった予感がする……。

  11. Iraka.T

    まさに同じ作業をしていました。自前の画像から作業していくべきでしたね。

    ともあれ作業お疲れ様です。ありがとうございます。

  12. Iraka.T

    LEFEBARLIFEGUAGEが二重拡大されました。

    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
    
  13. k4nagatsuki reporter
    • pull request #1694
    • pull request #1695

    ありがとうございます。どちらも修正できたと思います。


    以下は本題とは別の話になります。

    LIFEGUAGEはCWのイメージの中でも少し特殊なやつで、左上から5・5pxの位置を透過色として使用する事になっています。その透過部分にLIFEBARを転写して得られた結果のイメージは左上が透過色となり、ライフバー本体の出来上がりとなります。

    しかし、この描画方法では、例えばアルファ値つきイメージでLIFEGUAGEを用意して、外周部分をアンチエイリアスつきの透過色にする、というような事ができません。そこで、LIFEGUAGE2というリソースが用意されている場合はそちらを優先して使用し、LIFEGUAGE2に対してはLIFEBARを乗算描画し、アルファ値はそのまま活かすようにしました(アルファ値がない場合は左上が透過色)。乗算描画すると何が起きるかを端的にいうと、真っ白な部分にLIFEBARがそのまま描かれるような感じになります。ライフバーでもアンチエイリアスをしたいというような場合はLIFEGUAGE2を利用してください。

  14. Iraka.T

    修正確認しました。

    状態アイコンに.xNがあるものとないものが混在している場合(作りかけでもないと起きないでしょうが)、デバッガのキャラクター状態の編集ダイアログのアイコンが不揃いになりますね。拡大の影響を受けないダイアログでは、.xNを使用しないようにしたほうがいいのではないでしょうか。


    LIFEGUAGE2についてですが、LIFEBARが乗算描画されるのではハイライトを入れることができず、ガラスや金属の光沢を表現することが難しいです。LIFEBARの上にLIFEGUAGE2をアルファブレンドしたほうがいいのではないでしょうか。

  15. k4nagatsuki reporter

    そういえばそうですね。ライフゲージは単純な枠+中身以外に色々な表現方法が考えられるので、特殊フォントとは事情が違います。

    しかし二種類のマスクを用意する必要がある(LIFEBARに大して透過する部分と、カードに載せる時に最終的に透過される部分)ので、単純な合成はできません。

    どうも、マスク用の別のイメージを用意するとかの、別のアプローチが必要そうです。ちょっと考えてみます。

  16. k4nagatsuki reporter

    状態アイコンの方ですが、内部処理がちょっと(かなり)混乱しています。すみませんが修正まで少し時間をください。

  17. k4nagatsuki reporter

    LIFEBARの上にLIFEGUAGE2を描画した上で、LIFEGUAGE2_MASKの透過色が反映されるようにしました。

    昔のゲームのマスク処理のようで少々複雑ですが、2種類の透過情報という問題を解決するには2つのファイルを用いるしかなさそうです。

  18. Iraka.T

    高解像度で荷物袋やカード置き場からカードを取り出そうとすると、ログを吐いて止まります。

    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'
    
  19. k4nagatsuki reporter

    pull request #1714

    ありがとうございます。カード交換が可能な時に表示されるスプライトが高解像度化されていた時に起こる問題でした(選択時の若干明るくした画像を生成する際にスケール情報が失われてしまう)。修正しました。

  20. Iraka.T

    修正を確認しました。ありがとうございます。

    キャラクター情報ダイアログからデザインの編集を行うとき、現在のPCの画像がスケーリングされていないと、Faceフォルダ内のスケーリング画像も無視されてしまうようです。表示のみの無視で、変更してみると反映されるのですが。

  21. k4nagatsuki reporter

    ありがとうございます。pull request #1716で修正しました。

    表示するイメージを読み込む時の条件設定が間違っていました(PCの現在の設定を使用していた)。

  22. Iraka.T

    mode.ini等を利用することで、クラシックシナリオでも高解像度対応できるようにはできないでしょうか。

    また、Table内の.xNはスケーリングが有効でないシナリオでも表示されるようにならないでしょうか。(BloodWirthではTable内の画像も軒並み.x2を作成しましたが、これがクラシックシナリオでは表示できず、共通画像なのにいまいち統一感がありません。強い要望ではないので、簡単に実装できそうになければ労力を割く必要はないと思います)

  23. k4nagatsuki reporter

    クラシックなシナリオは対応困難です。というのも、イメージ格納というものが存在するからです。必然的に全てのキャストカード・効果カード・情報カードは既存のスケールにならざるを得ません。

    背景は、そもそも最初から大きなものを用意して縮小する事ができるので、効果が薄いです。

    とすると対応できるのはメニューカードとメッセージの話者だけという事になりますが、これだけ高解像度化しても結局はチグハグな事になるかと思います。

    ちなみにcwxeditorでは上記格納イメージを参照で設定できるように見えますが、あれはエディタ側の拡張情報で参照の情報を持っています。エンジン側では使っていません。1から対応するのはかなり大変です。

    また、Table内の.xNはスケーリングが有効でないシナリオでも表示されるようにならないでしょうか。

    たしかにそうですね。これは実際簡単なので、pull request #1728で対応しました。

  24. Iraka.T

    諸々修正お疲れ様です。いつもありがとうございます。

    クラシックなシナリオは対応困難です。

    そうですか。個人的に一番高解像度化したいのは、プレイヤーの手元に残るカード類ですから、それができないならたしかに、あまり意味がない気がしますね。

    やはりWSN版を別に用意して解決しようと思います。お答えありがとうございます。

  25. k4nagatsuki reporter

    当初の提案を縮小して.xNのみが実装されていますが、XMLで管理情報を作るなどの方法は手間からいって現実的ではなく、現状で必要充分に思えます。

    という事で完了にしておきます。

  26. Log in to comment