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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0925
taraメッセージのちらつきについて5解決


tara

リンク

2008/9/25(Thu) 01:09:58|NO.19740

皆さんお世話になっております。諸氏のアドバイスにより作成中のプログラムも幾分進みました。
ありがとうございます。
夜分に申し訳ないのですが新たな質問ができまして
お伺いに参ってしまいました。


screen 0, 640, 480, 4, 150, 150 title "質問用" //------------------------------------- *test //------------------------------------- gosub *testini goto *testloop stop //-------------------------------------------------------- *testini //-------------------------------------------------------- redraw 0 color 0, 255, 0 : boxf 0, 300 , 640, 480 //下部に緑の箱 color 255, 0, 0 : boxf 35, 17, 145, 56 //赤い箱1つ目 boxf 35, 82, 145, 121 //赤い箱2つ目 redraw 1 color 255, 255, 255 : font "MS 明朝", 20, 1 return //--------------------------------------------------------------------------------------- *testloop //--------------------------------------------------------------------------------------- //マウスカーソルが箱にある時にだけ、箱を青くして、下にメッセージを表示する。 if mousex > 35 & mousex < 145 & mousey > 17 & mousey < 56{ redraw 0 : color 51, 1, 255 : boxf 35, 17, 145, 56 : gosub *a_1 : redraw 1 } else : redraw 0 : color 255, 0, 0 : boxf 35, 17, 145, 56 : gosub *b : redraw 1 //--------------------------------------------------------------------------------------- // if mousex > 35 & mousex < 145 & mousey > 82 & mousey < 121{ // redraw 0 : color 51, 1, 255 : boxf 35, 82, 145, 121 : gosub *a_1 : redraw 1 // } else : redraw 0 : color 255, 0, 0 : boxf 35, 82, 145, 121 : gosub *b : redraw 1 //--------------------------------------------------------------------------------------- await 16 goto *testloop //--------------------------------------------------------------------------------------- *a_1 redraw 0 :pos 35, 330 : color :mes "testです。" mes "ここに色々とメッセージが表示されます。test" redraw 1 : return //--------------------------------------------------------------------------------------- *b redraw 0 : pos 0, 400 : color 0, 255, 0 : boxf 0, 300 , 640, 480 : redraw 1 : return //---------------------------------------------------------------------------------------

こちらを実行頂いて、一番上の箱にマウスを合わせると色が変わり、下にメッセージが
表示されると思います。
次に、*testloop内のコメントアウトしている3行のif文のコメントアウトを消して頂き、
再度実行すると、表示されるメッセージがちらついてしまうのです。
こういった場合はどう対処すればよろしいでしょうか。

実際は箱には画像を使っており、if文、メッセージ共に大量にあります。
何かアドバイス頂ければ幸いです。



この記事に返信する


f(浮気中)

リンク

2008/9/25(Thu) 01:29:03|NO.19745

では、アドバイスな。

redraw はループが始まった時に0にして、ループ一回の処理が終わったらwaitの前辺りで1にして画面更新しろ。
今のままでは結局redraw入れてないのと大差ない。


*bは下のメッセージを削除している訳だな。
上ボタンが反応しなければ消して、下ボタンが反応しなければ消していれば、
結局上ボタンがどんな状態だろうが、したボタンに反応が無ければ消されてるじゃねぇか。


ちらつくのは上ボタンに反応がない時にメッセージを消した状態で画面更新して、
下ボタンに反応してメッセージを書いた状態で画面更新しているからだ。



tara

リンク

2008/9/25(Thu) 01:45:38|NO.19746

アドバイスといいますか当に答えですね。
とてもよくわかりました。
どうもありがとうございます。

redrawの使い所をいまいち解っていなかった為勉強になりました。
書き直して出直して参ります。



GENKI

リンク

2008/9/25(Thu) 01:58:02|NO.19747

redrawの使いどころがおかしいです。
基本的なアニメーションの考え方が理解できていないんじゃないかと思います。

とりあえず、スクリプトを順を追って読んでいけばちらついている原因は分かるかと思います。
redraw 1とすると画面上に描画されてしまうと言うことを意識しながらスクリプトを
追いかけてみてください。(出来れば紙とペンで図でも書きながら。)

とりあえずポイントだけ取り上げると…。
・どちらかのボックス上にカーソルがあるとき、メッセージ表示。
・ボックス上にカーソルがないときメッセージ削除。
どちらの処理も描画直後にredraw 1してるのですぐさま表示されますね。
カーソルはひとつなのでどちらかのボックス上にカーソルがあるときは、
どちらかのボックス上にカーソルがないわけで。
1ループする間に書いては消し、書いては消し…。


しかし、ちらつきが起きる根本的な原因はメインループ*testloopのなかで何度も
redrawして書いたり消したりを見せているのが一番の原因です。
普通はこんな感じになります。

*main redraw 0 color 255,255,255 : boxf : color : pos 0,0 ;画面初期化 ;↓中身はここから。ここから先でredraw命令は絶対に使わない。 ;ここで最終的に表示される絵を作る。 ;絵を作っている途中はredraw 0がきいているので見えない。 mes "描画命令" ;↑中身はここまで。ここまではredraw命令は絶対に使わない。 redraw 1 await 16 goto *main
redraw 1はループの最後に1回だけ使用します。

こちらの記事も参考にしてみてください。
http://hspdev-wiki.net/?HSP%B9%D6%BA%C2%2F%B4%F0%CB%DC%C5%AA%A4%CA%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%A4%CE%A5%D1%A5%BF%A1%BC%A5%F3





うお。結局全部答えてしまった…。orz



tara

リンク

2008/9/25(Thu) 02:04:28|NO.19748

>>GENKI氏

解り易くご丁寧にありがとうございます。
胸の痞えが取れました。
リンク先を含め、もっと勉強して参ります。



tara

リンク

2008/9/25(Thu) 02:11:32|NO.19749

解決済みにしておきながら恐縮ですが投稿させて頂きます。
既に解答を頂いてますが修正したものを載せさせて頂きます。


screen 0, 640, 480, 4, 150, 150 title "質問用" //------------------------------------- *test //------------------------------------- gosub *testini goto *testloop stop //-------------------------------------------------------- *testini //-------------------------------------------------------- redraw 0 color 0, 255, 0 : boxf 0, 300 , 640, 480 //下部に緑の箱 color 255, 0, 0 : boxf 35, 17, 145, 56 //赤い箱1つ目 boxf 35, 82, 145, 121 //赤い箱2つ目 redraw 1 color 255, 255, 255 : font "MS 明朝", 20, 1 return //--------------------------------------------------------------------------------------- *testloop //--------------------------------------------------------------------------------------- redraw 0 pos 0, 400 : color 0, 255, 0 : boxf 0, 300 , 640, 480 //*bの処理をループの先頭に //マウスカーソルが箱にある時にだけ、箱を青くして、下にメッセージを表示する。 if mousex > 35 & mousex < 145 & mousey > 17 & mousey < 56{ color 51, 1, 255 : boxf 35, 17, 145, 56 : gosub *a_1 } else : color 255, 0, 0 : boxf 35, 17, 145, 56 //--------------------------------------------------------------------------------------- if mousex > 35 & mousex < 145 & mousey > 82 & mousey < 121{ color 51, 1, 255 : boxf 35, 82, 145, 121 : gosub *a_1 } else : color 255, 0, 0 : boxf 35, 82, 145, 121 //--------------------------------------------------------------------------------------- redraw 1 await 16 goto *testloop //--------------------------------------------------------------------------------------- *a_1 pos 35, 330 : color :mes "testです。" mes "ここに色々とメッセージが表示されます。test" return //---------------------------------------------------------------------------------------

正常に動作するようになりました。
お二方、どうもありがとうございました。



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