スキン -4_Camp.xml におけるレイヤ管理について

Issue #1012 resolved
SRNC created an issue

-4_Camp.xml で、既定のメニューカードやカラーセルよりも前面にセルを置くために、

Py4.3安定版ではレイヤを 100000000000 に設定して表示されていました。

デイリービルド最新版に更新してから、上記のように極端に高いレイヤ値のセル表示時にエラーが発生するようになりました。

(おそらく-4_Camp.xml以外のスキンエリアでも発生するかとは思います)

レイヤ値を 10000 に修正すれば、メニューカードやカラーセルよりも背面になりますが、正常に表示されることを確認しています。

これは仕様なのかバグなのか判断できませんが、

スキンとして、キャンプにおいて前面にセルを表示させたい場合はどのように設定するのが適切なのでしょうか。

念のためエラーログも載せておきます。

======================

Version : 4.3 (32-bit) / 2021-01-30 12:41:47
DateTime: 2021-01-30 14:58:13
Traceback (most recent call last):
File ".\cw\thread.py", line 971, in run
File ".\cw\thread.py", line 1024, in _run
File ".\cw\thread.py", line 1040, in main_loop
File ".\cw\eventhandler.py", line 114, in run
File ".\cw\eventhandler.py", line 399, in lclick_event
File ".\cw\sprite\card.py", line 1562, in lclick_event
File ".\cw\event.py", line 648, in start
File ".\cw\event.py", line 890, in start
File ".\cw\event.py", line 950, in run
File ".\cw\event.py", line 1160, in action
File ".\cw\content.py", line 2228, in action
File ".\cw\sprite\background.py", line 488, in load
File ".\cw\sprite\background.py", line 1243, in load_after
File ".\cw_init.py", line 215, in layer_val
AssertionError

======================

Comments (8)

  1. k4nagatsuki repo owner

    ご報告ありがとうございます。

    これはちょっと悩ましい問題です。まず、従来CWPyではスプライトの管理に4つの整数値を使っていました。

    1. レイヤ値
    2. スプライトの種類(背景セルは同レイヤでもカードより背後に表示される等)
    3. インデックス(カードの順序等)
    4. インデックス2兼使用中カードなどの種類情報(前面背景はカーテンとの関係上ここでインデックス管理。また使用中カードはここで所属スプライトより少し手前に表示されるようにする

    しかしながら、使用ライブラリの都合でこれを単一の整数にまとめる必要が出てきました(正確にはまだ4つの整数を使用できますが、将来も使用できる保証がない)。

    従来は4つそれぞれに対して最大値として32ビット整数型の最大値2147483647を指定していましたが、4つの変数を掛け算などを駆使して1つにまとめるとなると、これを4乗した値が最大値になってしまいます。しかしその値はx86 CPUがサポートする最大の整数値をはるかに超えてしまうため、パフォーマンスの悪化が予想されます。そのため、各値の最大値を抑えることにしました。

    が、そのように大きなレイヤ値を使用しているスキンがある事は想定していませんでした。現在のレイヤ値の最大値は2097152であるため、引っかかってしまっています。というより従来の最大値も超えているのですが、チェック処理が存在しないためすり抜けてしまっています。正しく動いているのはたまたまのように思われます。

    レイヤ値を読み込む際に上限値に抑え込むようにすれば問題は起きなくなるはずですが、今度は異常に大きな値で各レイヤの上下を表現しているような場合に問題になります。そのような事をしていなければ問題はないのですが。

    どうするべきか、ちょっと考えます。

  2. k4nagatsuki repo owner

    ちょっと訂正します。現在のレイヤ値の最大値はたぶん1048576です。上に書いたのはバトル開始カードやデバッグ中のバトルで表示される同行キャストなどシステムで使用するスプライトのレイヤ値です。

  3. SRNC reporter

    対応ありがとうございます。

    エラーは発生しなくなりましたが、キャンプ画面のメニューカードやカラーセルの背面に表示されてしまいます。

    これは現在設定されているレイヤ値100000000000 が2147483647未満に丸められたためと思いますが、スキン側からメニューカードやカラーセルよりも前面にセルは表示できない仕様となりますでしょうか。

    4_Camp.xml に設定したメニューカードをクリックすることで、前面にセルを表示させることを考えております。

  4. k4nagatsuki repo owner

    pull request #202

    特殊エリアのメニューカードは手前に出す必要があるので(シナリオ側の前面セルの下に隠れてしまうのを防ぐため)上限を超えたレイヤ値になるような加算を行っているのですが、前面セルにもそれが必要ですね。追加しておきました。

  5. SRNC reporter

    最新版に更新することで期待される動作となることを確認致しました。

    対応ありがとうございます!

  6. BlinkOpera

    @k4nagatsuki
    本件、報告者による動作確認が行われおり、クローズ可能です。

  7. Log in to comment