« [奮闘記]星空を一気に表示するのだ | トップページ | [奮闘記]流れる星空を背景に、静止したキャラを表示するのだ »

[奮闘記]流れる星空を表示するのだ

※注:この項の内容ですが、星を流すやり方としては駄目な例です。もっといいやり方を「配列を使って星の動きを制御するのだ」で解説しています。命令の解説自体は間違ってないのですが・・・用法は真似しないで下さい(1枚絵を動かすやりかたとしてはさほど間違いではないのですが)。
(2004年5月7日追記)


今度は、RNDを使って描いた星空を、右から左にスクロールさせてみよう。GCOPYの応用技だな。


SCREEN 0,600,400,1,100,50,600,400
CLS 4
RANDOMIZE

;バッファーに星空の絵を描きこみ
BUFFER 2,600,400,1
COLOR 0,0,0 : BOXF 0,0,600,400
REPEAT 1000
RND X,600 : RND Y,400
RND R,7 : RR=(R+1)*32-1
RND G,7 : GG=(G+1)*32-1
RND B,7 : BB=(B+1)*32-1
COLOR RR,GG,BB
PSET X,Y
LOOP

;描画画面の準備
GSEL 0 : COLOR 0,0,0 : BOXF O,O,600,400
PALCOPY 2 : GMODE 1,600,400
POS 0,0 :GCOPY 2,0,0,600,400
;バッファーに描いた画面を複写

;星をスクロールさせる部分
*MAIN
GSEL 2 : POS 0,0
GCOPY 0,0,0,600,400
;現在の画面を保存
GSEL 0
REDRAW 0
;書き換える前に非表示
POS 0,0 : GCOPY 2,1,0,600,400
POS 599,0 : GCOPY 2,0,0,1,400

REDRAW 1
;書き換えた画面を表示
STICK K : IF K=128 : STOP
;ESCが押されたら停止
AWAIT 16
;ウィンドウズにタスクを渡す
GOTO *MAIN

新しい命令がいくつか出てきたぞ~。

SCREEN (ウィンドウID),
(初期化する横幅),(初期化する縦幅),
(初期化するモード)
(配置x軸),(配置y軸)
(ウィンドウの横幅),(ウィンドウの縦幅)
ウィンドウIDを指定したモード、配置、大きさで初期化

「BUFFER」の親戚だね。違いは実際表示する画面かどうかってとこ。「WIDTH」だと大きさと配置しか決められなかったけど、こっちは画面モードの切り替えができるってのが違いみたい。

PALCOPY (ウィンドウID)
別画面で使用されてるパレットを現在の画面に反映する。

2番のウィンドウで使った色を、そのまま0番ウィンドウでも使いますよ~っていう意味でつかってるんだけど、0番ウィンドウに対してのみ、この命令はやらなくてもいいみたい。

GMODE (コピーモード),
(コピーする横幅),(縦幅)
「GCOPY」で、どのような形でコピーをするかを指定する。

0だと普通にコピー(1670万色モードのときに使うのかな?)、1だと高速コピー、2だと高速コピー+(0,0,0)の色が透過するっていう感じらしい。2のモードはキャラの重ね合わせに使えそうだね。

REDRAW (描画モード),
(再描画する画面の左上x軸座標),(y軸座標)
(横幅),(縦幅)
描画モードを指定する。

0で描きこむと、画面上では変化せず、1にすると更新すると。つまり今回の場合、赤字になってる部分で星を流してる(コピーする座標をちょっとづつずらし て、流れてるように見せる)わけだけど、これを『見える』状態でやるとマヌケだから、『見えない』状態で描きこんでおいて、描き終わったら『見える』よう にするというわけ。キャラクタを動かすときなんかも、描き終わってから『見える』ようにしないと画面がチラチラしてしょうがないみたいね。

ここで納得。文字を動かすプログラムも、「描く」→「見えない部分で消す」→「位置を動かして描く」→「見えるようにする」ってやれば、きれいに動いたんだ。

STICK (代入先変数),(非トリガータイプキー指定)
(よく使われる)キーが押されてるか押されてないかをチェックし、押されてる場合はそのキーに対応する数値を変数へ代入。

キャラクタを動かすときなんかは「押してる間だけ動く」っていう感じにしたいわけだから、非トリガータイプキーとして指定するらしい。まぁ今回は「プログラムを停止したいときはESCキーを押す」っていうことをやりたかっただけだから、特に気にしなくてもいいみたい。

AWAIT (処理を待つ時間;単位1/10ms)
処理を一定時間中断する。

HSPの仕様なんだけど、こういう永久ループをさせるときは、必ずWAITかAWAITを入れなきゃだめなのだそうだ。でないと他の入力一切受け付けず、「応答なし」で止まっちゃう^^;

ちなみにAWAITは、前回中断した(AWAITした)時からの待ち時間ということになるそうな。つまり、ループの処理を常に一定に保つ効果があるわけだな。リアルタイムのゲームなんかには不可欠でしょ。ちなみに「 AWAIT 16 」だと、だいたい1秒間に60回くらいの処理速度になる。

さて、次はキャラクタを表示させて、その背景で星空をスクロールさせてみよう。いわゆる重ね合わせ処理って奴だな。

« [奮闘記]星空を一気に表示するのだ | トップページ | [奮闘記]流れる星空を背景に、静止したキャラを表示するのだ »

1.奮闘記」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67538/57445595

この記事へのトラックバック一覧です: [奮闘記]流れる星空を表示するのだ:

« [奮闘記]星空を一気に表示するのだ | トップページ | [奮闘記]流れる星空を背景に、静止したキャラを表示するのだ »