HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0624
Dripパレットモードのバグ5解決


Drip

リンク

2018/6/24(Sun) 18:35:36|NO.84650

こんにちは。

このバグはまだ未報告でしたでしょうか?
パレットモードでgmode 2が正常に動作していないように見えます。

screen 3,256,256,1,100,100:title "画像素材":celdiv 3,256,256,128,128 palette 0,255,0,0:palette 1,0,0,0,1 //パレットID0を赤に、パレットID1を黒(透明)にする color:boxf:palcolor 128:circle 0,0,256,256 //画像素材として灰色の円を描く screen 0,640,480,1,356,100:title "メインスクリーン" //メインスクリーン pos 200,200:gmode 2:celput 3,0,1.5,1.5 //【バグ】黒がそのまま描画されてしまっている pos 180,190:mes "gmode 2" //● ↑の1.5,1.5を消すとなぜか正常動作します(黒が正常に透明色として扱われます。) //● また、パレットID0に黒(r=0,g=0,b=0)を置くとこのバグは発現しません。(2行目のpalette命令を消去すれば確認できます。)
仕様がかなり曖昧です。
また以前ご連絡させていただいたpngファイルの読み込みに関する不具合もまだ未修正のようです。
パレットモードはツールとゲーム双方でかなり活躍する場面が多いので
早い段階でご対応いただきたいです。宜しくお願いいたします。



この記事に返信する


nori

リンク

2018/6/26(Tue) 00:15:15|NO.84653

celput実行の際、縦横倍率が1以外or回転角度が0以外の時に
コピー元のパレットID0が透明色になってるみたいですね。

gsquareでも似たような現象が発生します。
http://hsp.tv/play/pforum.php?mode=pastwch&num=74659



Drip

リンク

2018/6/29(Fri) 23:53:41|NO.84668

noriさん

こんにちは、情報有難うございます。
既に報告されていたバグだったのですね…
公式からのアクションがないということは修正は絶望的なんでしょうか…
昨今インディーゲームではドットゲームの人気は非常に高く
パレット機能は今の時代だからこそ積極的になってほしい部分に感じています。



おにたま(管理人)

リンク

2018/7/1(Sun) 23:10:15|NO.84702

詳細なご報告ありがとうございます。
検証に時間がかかりまして、返信が遅くなり申し訳ありません。
こちらの件ですが、前提としてcelputの1.0倍、角度0.0は通常のgcopy命令が使用され、
それ以外の場合ではgrotate命令相当の機能が使用されます。
パレットモードの挙動としては、RGBが0のパレットはコピーされないというgcopy命令の実装がが正しいです。
それに対して、grotate命令(gsquare命令も)は初代のHGIMGプラグインに実装されていた機能を標準化したもので、
パレットID0のドットを常に透明色として扱っています。パレットID0はRGB0の黒が設定されることを期待した実装になっています。
ご提示頂いたサンプルでは、color 0,0,0で画面をクリアしているので、パレットモードのcolor命令は最も近いパレットIDを選択します。
そのため、パレットID0に黒以外を指定した場合、パレットID0以外が選択されて背景に塗りつぶされることになります。

特に異論がなければ、gcopy命令の挙動に統一する形で今後修正をしていきたいと思います。



Drip

リンク

2018/7/2(Mon) 19:19:40|NO.84711

おにたまさん

ご返信心から感謝いたします。
本件ですが、gmode 2ではマニュアルにて黒が透過されると明記されており、
パレットモード0が透過される動作が異常であることは明白にわかります。
この問題に遭遇した開発者は
「バグだろうけれどパレットID0に黒を置けば一先ず整合性が取れるだろう…」
と考える人が多いかと思います。拡縮回転封印でも何とか整合性が取れます。
逆に「しめしめこの盲点を突いて黒以外を透過するギミックを取り入れよう!」
と考える人は少数派に思えます(私には恐ろしくてできません)。また画像素材
作成の都合でID0に黒を置けないような場合や、読み込まれるpngファイルが
わからないツール作品等の場合、この不具合はボトルネックとなります。
私個人的な意見としてはgcopyの動作に完全に統一していただきたいと思います。

ただ、もしパレットID0が何色かに関わらずパレットID0だけを透過するモードの
ほうが高速だったり、その実装が簡単であればsetreq命令でgmode 2の動作を
現在のgrotate仕様に(gcopyも含め)切り替えられるようにするとか選択肢を
与えていただければ旧動作で作られたプログラムへの救いにもなるかもしれません。
そればかりか透過色を自由に設定できるというHSP2以来の機能向上にも繋がります。
こうしたバージョンアップであれば個人的には大歓迎です。
この不具合を修正される際にこの可能性を意識しながら作業を進め、
もし対応できそうなら対応…という形でもいいかもしれません。

パレットモードはArtLet2Dのカラーマトリックス変換のような機能を標準かつ
超高速で提供しているようなもので、Dishでパレットモードが使えないことが
大変悔やまれます。原理的に難しいことは理解しておりますが、せめてWindows版
だけでもパレットモードを末永くメンテナンスしていただければ幸いです。

>前提としてcelputの1.0倍、角度0.0は通常のgcopy命令が使用され、
>それ以外の場合ではgrotate命令相当の機能が使用されます。
余談ですがcelputとgrotateって実は全然違いますよね^^;
Dish限定かもしれませんが、grotateの拡縮サイズの最小単位は1ドットですが、
celputでは小数点以下無限なため、特に非常にゆっくりと拡縮する物体が
grotateよりも遥かに美しく描画され、大変有り難く使わせていただいております。

追伸:
以前報告させていただいたパレットモードで初期化されたバッファへのpngファイル
読み込み不良の問題ですが、こちらも修正いただけますと幸いです。
また、pngフォーマットのパレットデータの吸出しは非常にわかりやすく、
bmppalette命令のpng版もあったら大変便利です。
以下に私が使用しているpngpalette命令と、パレットモードで256色pngファイルを
読み込めない問題を暫定的に回避しているサンプルスクリプトを貼ります。
ヘッダ読み込みを3200バイトに固定しているのは文字列変数自動拡張が不安なのと
巨大なPNGファイルや破壊されたPNGファイルでも読み込みを高速化して安定動作
させることを目的としています。
最後の画像読み込みでは画像のパレット割り当ては近似色の割り当てになるため、
正確なパレットID割り当てに対応できておらず、HSP側で対応いただきたい部分です。

//pngpalette命令はpngファイルからパレットデータを読み込みます。 //bmppalette命令のようにexistはしません。 //存在しないファイルを読み込もうとしたらHSPエラーしたほうが親切という考えです。 #module #deffunc pngpalette str ns //ns=読み出すPNGファイル名。成功するとstatに取得されたパレット数が返る。 //最大3200バイトまでヘッダを読み込む(見たことないですがそれ以上先にPLTEチャンクがあると発見不可能) sdim data,3208:bload ns,data,3200 //PNGファイルのヘッダーなら処理を開始する if lpeek(data,0)=1196314761 & lpeek(data,4)=169478669:{ //ヘッダは常に 89 50 4E 47 0D 0A 1A 0A palMax=0 //発見されたパレットデータサイズ repeat 3200-768-8,8 //読み込んだデータから最大パレットデータサイズとヘッダサイズを引いた回数テスト //★破壊された最悪なPNGファイルを読み込んでも最大202ループで処理が完了する。 index=cnt+3:repeat 4:poke data,cnt,peek(data,index-cnt):loop //チャンクサイズは反転している chankSize=lpeek(data,0) //チャンクサイズを代入する if chankSize<0:break //データサイズ異常(チャンクサイズは最低0である) memcpy data,data,4,0,cnt+4:poke data,4,0 //dataにチャンクタイプを書き込む //★↓これをコメント解除すると取得されたチャンクタイプとサイズが確認できる。 ;dialog ""+data+"/"+chankSize:wait 10 if data="IDAT":break //IDATチャンクを発見したので以降PLTEチャンクは絶対に存在しない if data="PLTE":{ //PLTEチャンク発見 index=cnt+8 //パレット情報が羅列されているインデックスを記録 //パレットデータサイズはRGBの羅列なので必ず3で割り切れ、かつ768バイト以上存在し得ない if chankSize\3!0 | chankSize>768:chankSize=0 //データが異常ならサイズリセット(失敗) palMax=chankSize/3 //パレット数をチャンクサイズから計算して代入。(↑の失敗も反映) break } continue cnt+chankSize+12 //次のチャンクサイズへ飛ぶ(repeat回数を振り切れると処理終了) //+12はデータサイズ(4)+チャンクタイプ(4)+CRC(4)で合計12バイト loop if palMax:{ //パレットデータサイズが正常に取得された場合 repeat 256 if cnt<palMax:{ //パレットデータがあればその色を設定 palette cnt,peek(data,index+cnt*3),peek(data,index+cnt*3+1),peek(data,index+cnt*3+2),(cnt=255) }else{ //パレットデータがなければ黒を設定 palette cnt,0,0,0,(cnt=255) } loop return palMax //成功(パレット情報を持つPNGファイル) } } return 0 //失敗(要因:フルカラーPNGファイル・破壊されたPNGファイル・PNGファイル以外) #global //使用サンプル screen 0,640,480,1 //パレットモードでメインスクリーン初期化 dialog "png",16:if stat!1:end //PNGファイル選択・読み込み pngpalette refstr //パレットデータを吸い出す if stat:{ //パレットデータが取得されていれば画面に情報出力 maxColor=stat gmode 1,8,8 repeat 256 palcolor cnt:grect cnt\8*8+4,cnt/8*8+4 loop //↓HSP3.5:256色pngファイルはパレットモードで読み込めないバグを回避↓ //ただし、この方法はパレットIDが正確にトレースされないので注意(近似色割り当て) celload refstr,3:gmode 0,ginfo_sx,ginfo_sy:pos 64,0:gcopy 3,0,0 dialog "取得成功・色数:"+maxColor }else{ dialog "取得失敗:PNGファイルがパレットモードではありません。" }

長文失礼致しました。以上となりますが、宜しくお願いいたします。



Drip

リンク

2018/7/3(Tue) 07:00:33|NO.84714

度々失礼いたします。どうしても誤字が気になってしまいまして、私の文の冒頭の
>パレットモード0が透過される動作が異常であることは明白にわかります。
パレットモード0が透過って意味不明ですが、パレットID0が透過 の間違いです。
失礼いたしました…



ONION software Copyright 1997-2023(c) All rights reserved.