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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0729
瞬圭介スプリクト短縮方法&redraw命令について5解決


瞬圭介

リンク

2010/7/29(Thu) 22:51:26|NO.34078

初めまして。
今、背景が白や黒に変えれる超簡易時計を作っているのですが、
赤や緑などにも変えれるようにすると、スプリクトがどうしても長くなってしまいます。
(同じような命令を並べ続けるため)
下のスプリクトは、黒に変えれるだけです。(本当はめちゃめちゃ長いです)
どうにかして短縮できないでしょうか・・・。
さらに、redraw命令を使っているハズなのですが、微妙にちらつくときがあります。
どなたか解決方法を教えてください。


screen 0,250,500 gsel 0,4 title "超簡易時計" pos 30,0 mes "どの背景にしますか?" pos 85,20 button "黒",*BLACK stop *BLACK Weeks = "日", "月", "火", "水", "木", "金", "土" year=gettime(0) month=gettime(1) week=Weeks(gettime(2)) day=gettime(3) hour=gettime(4) minute=gettime(5) second=gettime(6) redraw 0 screen 0,650,70 cls 4 color 255,255,255 font "MS ゴシック",28 redraw 1 mes "只今の時刻は"+year+"年"+month+"月"+week+"曜日"+day+"日"+hour+"時"+minute+"分"+second+"秒です" await 1000 goto *BLACK



この記事に返信する


SYAM

リンク

2010/7/29(Thu) 22:56:46|NO.34079

短縮については、 配列変数 や サブルーチンジャンプ(gosub,return命令)を覚えましょう。

ちらつきについては、
画面の書き換えを redraw 0 〜 redraw 1 の間に入れるようにしましょう。
今のままでは、mes 命令が外に出てしまっています。



SYAM

リンク

2010/7/29(Thu) 23:05:02|NO.34080

…というか、この例だとそれさえ要らないですね。
ボタンを押したら、押したボタンに応じて 3つの変数に背景の色を代入して、時計の表示部にジャンプすればいいです。
あとは、時計の表示のときに color 命令にその変数を指定すれば、時計の表示部分のスクリプトは1つで済みます。


screen 0,250,500 gsel 0,4 title "超簡易時計" pos 30,0 mes "どの背景にしますか?" pos 85,20 button "黒",*BLACK button "赤",*RED stop *BLACK back_r=0 back_g=0 back_b=0 goto *MAKE_CLOCK *RED back_r=255 back_g=0 back_b=0 goto *MAKE_CLOCK *MAKE_CLOCK screen 0,650,70 font "MS ゴシック",28 Weeks = "日", "月", "火", "水", "木", "金", "土" *DRAW_CLOCK year=gettime(0) month=gettime(1) week=Weeks(gettime(2)) day=gettime(3) hour=gettime(4) minute=gettime(5) second=gettime(6) redraw 0 color back_r,back_g,back_b boxf color 255,255,255 pos 0,0 mes "只今の時刻は"+year+"年"+month+"月"+week+"曜日"+day+"日"+hour+"時"+minute+"分"+second+"秒です" redraw 1 await 1000 goto *DRAW_CLOCK

あまりゴッソリ書き換えると解らなくなるでしょうから、すこしだけ。
配列変数とかがわかるともうちょっとスッキリさせることができる、かも。



瞬圭介

リンク

2010/7/29(Thu) 23:37:02|NO.34081

ありがとうございます。
まだまだ勉強不足ですね(笑)
参考書の配列変数をよーく見なおしておきます



SYAM

リンク

2010/7/30(Fri) 10:39:45|NO.34083

実は、配列だけ解っても足りない気がしてきたので追記。

プログラミングマニュアルにはこんなことも書いてあります。

それぞれのオブジェクトには、オブジェクトIDという番号が割り振られ管理されています。 オブジェクトIDは、0から始まる整数値で、配置命令の実行後にシステム変数statに 代入されます。通常は、画面内に配置した順に自動的に0,1,2,3…と数値が割り振られます。 オブジェクトIDが必要な時は、オブジェクトの一部を後から消したい時、状態を変更したい 時などです。また、押しボタンが押された時には、システム変数statに押されたボタンの オブジェクトIDが代入されます。
※button命令のヘルプには後者しか書いてないのです。
※配置したらstatが変化するオブジェクトの配置命令のヘルプには全部書いてあってもいいと思うんですが。常々。

すると、元のスクリプトの Weeks 配列でやっているようなことを、色やボタンの文字列でもできるようになります。


screen 0,250,500 gsel 0,4 title "超簡易時計" pos 30,0 mes "どの背景にしますか?" pos 85,20 dim object_id, 8 btnstr ="Black","Blue","Green","Cyan","Red","Magenta","Yellow","Gray" back_r = 0, 0, 0, 0,255,255,255,192 back_g = 0, 0,255,255, 0, 0,255,192 back_b = 0,255, 0,255, 0,255, 0,192 repeat 8 button btnstr(cnt), *ON_PUSHED_BUTTON object_id(cnt) = stat loop stop *ON_PUSHED_BUTTON pushed_object_id = stat repeat 8 if(object_id(cnt)==pushed_object_id) { color_idx = cnt break } loop screen 0,650,70 font "MS ゴシック",28 Weeks = "日", "月", "火", "水", "木", "金", "土" *DRAW_CLOCK year=gettime(0) month=gettime(1) week=Weeks(gettime(2)) day=gettime(3) hour=gettime(4) minute=gettime(5) second=gettime(6) redraw 0 color back_r(color_idx),back_g(color_idx),back_b(color_idx) boxf color 255,255,255 pos 0,0 mes "只今の時刻は"+year+"年"+month+"月"+week+"曜日"+day+"日"+hour+"時"+minute+"分"+second+"秒です" redraw 1 await 1000 goto *DRAW_CLOCK

前の変更よりちょっとややこしいところがありますね。
ボタンを押した後、ボタンのオブジェクトIDから色情報のインデックス(back_r,back_g,back_bの添え字に使う数値)を検索しています。
ボタンを配置したときのstat(=オブジェクトID)と、押されたボタンのオブジェクトIDが一致するボタンを探しているわけです。

こうなると、もういくらでも好き放題ボタンが増やせそうです。



瞬圭介

リンク

2010/7/30(Fri) 14:45:50|NO.34088

ご丁寧にありがとうございます。
やっぱ奥が深いですね。



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