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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0617
nori2画面でpalette命令を使用する際について7解決


nori

リンク

2016/6/17(Fri) 00:49:06|NO.75892

2画面以上でpaletteモードを使用する際、palette命令でRGB値を変更した場合に、
直前の他の画面の変更まで反映されてしまいます。

以下のスクリプトではボタンを押下した際に画面0のパレット番号0のみ変更していますが、
直前に行った画面1の変更まで反映されています。

画面を切り替えてpalette命令を使用する際、他の設定等が必要なのでしょうか?


screen 0,,,screen_palette palette 0 , 0 , 0 , 0 , 0 palette 1 , 255 , 0 , 0 , 0 palette 2 , 0 , 255 , 0 , 0 palette 3 , 0 , 0 , 255 , 1 repeat 4 palcolor cnt boxf cnt * 36 , 0 , cnt*36 + 35 , 35 loop screen 1,,,screen_palette palette 0 , 127 , 127 , 127 , 0 palette 1 , 255 , 127 , 127 , 0 palette 2 , 127 , 255 , 127 , 0 palette 3 , 127 , 127 , 127 , 1 repeat 4 palcolor cnt boxf cnt * 36 , 0 , cnt*36 + 35 , 35 loop pos ,36 button gosub "palette",*PaletteChange stop *PaletteChange gsel 0 palette 0 , 64 , 64 , 64 , 1 redraw 1 return

以下の環境にて確認しております。
windows7
hsp Version 3.4

以上、よろしくお願いします。



この記事に返信する


KA

リンク

2016/6/17(Fri) 19:17:28|NO.75897

>>画面0のパレット番号0のみ変更していますが、
>>直前に行った画面1の変更まで反映されています。

screen 1
で設定した
>>palette 0 , 127 , 127 , 127 , 0
>>palette 1 , 255 , 127 , 127 , 0
>>palette 2 , 127 , 255 , 127 , 0
>>palette 3 , 127 , 127 , 127 , 1

screen 2

>>palette 0 , 64 , 64 , 64 , 1

つまり
>>palette 1 , 255 , 127 , 127 , 0
>>palette 2 , 127 , 255 , 127 , 0
>>palette 3 , 127 , 127 , 127 , 0
>>palette 0 , 64 , 64 , 64 , 1
と同じ事です。



nori

リンク

2016/6/18(Sat) 23:10:23|NO.75905

>>KA様
palette命令に関しては以下の認識でよろしいでしょうか?
1.更新スイッチをonにした場合過去すべての更新が反映される。
2.gselによる画面変更しても過去の更新は保持される。
3.2画面のパレットが異なる際、一部のパレットのみ変更するには別途管理し、全てのパレットを更新する必要がある。



KA

リンク

2016/6/19(Sun) 22:30:28|NO.75915

そもそもパレット設定は対象画面全てに共通です。
事前にパレットを設定し、PALCOLORで指定する使い方です。

パレットカラーだった昔のWINDOWSでは、質問と同様の現象で
色化けが起こっていたのも良い思い出です。



nori

リンク

2016/6/20(Mon) 23:39:21|NO.75929

基本的にはpaletteの異なる画面は扱わないという前提なのですね。
更新の為のパレットテーブルは1つという事で、更新FLGが0の場合は現在選択されている画面とは無関係に共通のテーブルを更新、
FLG1の際のみgselが有効という事でよろしいでしょうか?

若干気になったのですがbmppalette命令内でpalette命令使用しているので注意が必要ですね。
256色使用している場合は良いのですが、それより少ない場合には前のパレットを引き継いでしまいます。

直接は関係ないのですが、bmppalette命令では4bitBMPでもparette取得を行い、色数指定していなかった際、256色分のpaletteを
本来paletteデータではないエリアから取得しているので、表示上は問題無いのですがデータとして扱う場合には
上記と同様注意が必要かと思われます。
helpには8bitBMP以外は何もしないとありますが、実際の動作とは異なるので一応報告させていただきました。



(--)

リンク

2016/6/21(Tue) 22:15:28|NO.75937

たしかにパレット機能はウィンドウごとになっていると便利かもしれないですね
そこでpalette関連命令の互換性を保ったまま、パレットテーブルの情報を
ウィンドウごとにするモジュールを作ってみました。
せっかくなので公開してみます。
使い方は通常と変わりません。
これをインクルードしておくと、質問者さんのご提示のスクリプトが
予想通りに動くかと思います。
速度面も考えると、理想的にはHSPインタプリタの方を書き換えたいところですが。



/*** paletteEx.as ***/ #module __paletteEx #deffunc local init current_id = -1 mref pal, 69 // original palette buf sdim pals, 769, 10 // usedflag[1] + RGBdata[768] return #deffunc _paletteEx_init int id memexpand pals.id, 769 poke pals.id, 0, 1 // usedflag = true repeat 768 : poke pals.id, cnt+1, cnt/3 : loop memcpy pal, pals.id, 768, 0, 1 current_id = id palette@hsp -1, 0, 0, 0, 1 return #deffunc _palette int p1, int p2, int p3, int p4, int p5 id = ginfo_sel if (peek(pals.id, 0) == 0) : _paletteEx_init id if (p1 >= 0) { poke pals.id, p1*3+1, p2 poke pals.id, p1*3+2, p3 poke pals.id, p1*3+3, p4 } if (p5) { memcpy pal, pals.id, 768, 0, 1 current_id = id palette@hsp -1, 0, 0, 0, 1 } return #deffunc _palcolor int p1 id = ginfo_sel if (peek(pals.id, 0) == 0) : _paletteEx_init id if (id != current_id) { memcpy pal, pals.id, 768, 0, 1 current_id = id } palcolor@hsp p1 return #undef palette #undef palcolor #define global palette _palette #define global palcolor _palcolor #global init@__paletteEx /*** End of paletteEx.as ***/



nori

リンク

2016/6/21(Tue) 23:58:36|NO.75938

>(--)様
モジュールまで提示していただき有難うございます。
とても参考になりました。
palcopy命令が削除されてるあたり、異なるpaletteは推奨しないという事なのかもですね。



cocoa

リンク

2016/6/23(Thu) 00:51:14|NO.75959

>異なるpaletteは推奨しないという事なのかもですね。
ディスプレイが256色モードならそうかもしれませんが、そうでないなら別にそんなことはないと思います。
パレット機能が縮小されているのは単にパレット自体が過去のものという感じなんだとおもいます。
現在のPC環境ではパレットを使う必要自体がもうなくなっていると思います。



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