|
|
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
以上、よろしくお願いします。
|
|
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
と同じ事です。
|
|
2016/6/18(Sat) 23:10:23|NO.75905
>>KA様
palette命令に関しては以下の認識でよろしいでしょうか?
1.更新スイッチをonにした場合過去すべての更新が反映される。
2.gselによる画面変更しても過去の更新は保持される。
3.2画面のパレットが異なる際、一部のパレットのみ変更するには別途管理し、全てのパレットを更新する必要がある。
|
|
2016/6/19(Sun) 22:30:28|NO.75915
そもそもパレット設定は対象画面全てに共通です。
事前にパレットを設定し、PALCOLORで指定する使い方です。
パレットカラーだった昔のWINDOWSでは、質問と同様の現象で
色化けが起こっていたのも良い思い出です。
|
|
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 ***/
| |
|
2016/6/21(Tue) 23:58:36|NO.75938
>(--)様
モジュールまで提示していただき有難うございます。
とても参考になりました。
palcopy命令が削除されてるあたり、異なるpaletteは推奨しないという事なのかもですね。
|
|
2016/6/23(Thu) 00:51:14|NO.75959
>異なるpaletteは推奨しないという事なのかもですね。
ディスプレイが256色モードならそうかもしれませんが、そうでないなら別にそんなことはないと思います。
パレット機能が縮小されているのは単にパレット自体が過去のものという感じなんだとおもいます。
現在のPC環境ではパレットを使う必要自体がもうなくなっていると思います。
|
|