|
|
|
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文、メッセージ共に大量にあります。
何かアドバイス頂ければ幸いです。
| |
|
2008/9/25(Thu) 01:29:03|NO.19745
では、アドバイスな。
redraw はループが始まった時に0にして、ループ一回の処理が終わったらwaitの前辺りで1にして画面更新しろ。
今のままでは結局redraw入れてないのと大差ない。
*bは下のメッセージを削除している訳だな。
上ボタンが反応しなければ消して、下ボタンが反応しなければ消していれば、
結局上ボタンがどんな状態だろうが、したボタンに反応が無ければ消されてるじゃねぇか。
ちらつくのは上ボタンに反応がない時にメッセージを消した状態で画面更新して、
下ボタンに反応してメッセージを書いた状態で画面更新しているからだ。
|
|
2008/9/25(Thu) 01:45:38|NO.19746
アドバイスといいますか当に答えですね。
とてもよくわかりました。
どうもありがとうございます。
redrawの使い所をいまいち解っていなかった為勉強になりました。
書き直して出直して参ります。
|
|
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
|
|
2008/9/25(Thu) 02:04:28|NO.19748
>>GENKI氏
解り易くご丁寧にありがとうございます。
胸の痞えが取れました。
リンク先を含め、もっと勉強して参ります。
|
|
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
//---------------------------------------------------------------------------------------
正常に動作するようになりました。
お二方、どうもありがとうございました。
| |
|