背景をスクロールする(1/2) |
背景を描画し、スクロールします。
1.変数の初期設定をする |
2.背景のデータを用意する |
3.背景を描画する |
背景のデータを配列変数に入れておき、それに従って描画します。
1.変数の初期設定をする |
「ゲームスタート時の初期設定」に次の1行を追加します。
stageno=1
これはステージ数です。このサンプルプログラムでは、全部で3ステージとします。(短いですが、まあサンプルですので。)
2.背景のデータを用意する |
絵のファイル(samplecg.bmp)に、マップチップを追加しました。マップチップとは、背景を構成するパーツです。
これはステージ1のマップチップです。これをどういうふうに並べるかを、配列変数backmapに入れます。
sdim backmap,14,3,100 ; ステージ1のデータ backmap.0.71="40,71,71,71,40" ・ ・ ・ backmap.0. 6="40,41,61,51,40" backmap.0. 5="40,41,70,51,40" backmap.0. 4="40,41,61,51,40" backmap.0. 3="40,41,70,51,40" backmap.0. 2="40,41,61,51,40" backmap.0. 1="40,41,70,51,40" backmap.0. 0="60,41,61,51,60" |
backmap.0.0〜backmap.0.6に対応する絵 |
このデータは結構長いので、別のファイル(backmap.as)に書いて、メインとなるファイル(sample10.as)とは分けることにします。sample10.asの中に
#include "backmap.as"
と書くと、その部分にbackmap.asの内容を連結します。つまり、backmap.asの内容をそこにコピー、ペーストしたのと同じことになります。
実行する時は、sample10.asの方を実行して下さい。
数値と文字列
HSPでは、変数に入るのは数値(整数)か文字列です。では「1」は数値でしょうか? 文字列でしょうか? n=1 と書いた場合、これは数値です。 n="1" と書いた場合、これは文字列です。 数値の1と文字列の1の違いは、それを用いて計算ができるかどうか、です。 a=1 b="1" mes a+2 mes b+2 stop これを実行すると、 3 12 と表示されます。bは文字列なので、2と連結されたのです。 文字列としての数字を、数値としての数字に変換するには、"int"という命令を使います。 a="1" int a 数値としての数字を、文字列としての数字に変換するには、"str"という命令を使います。 a=1 str a sequence="3,5,8,1,6" 今、","で区切られたいくつかの数字が並んだ文字列が代入されている変数sequenceがあるとします。例えば4文字目を取り出すにはこうします。(カンマも含めて数えて4文字目、です。先頭を0文字目とします。) strmid n,sequence,4,1 引数は左から順に、取り出した文字列を代入する文字列型変数、取り出す対象となる変数、何バイト目から取り出すか(先頭が0バイト目)、何バイト取り出すか、です。 この命令を行うとnには文字列としての"8"が代入されます。 5つの数字を足し算して表示する処理は以下のようになります。 sum=0 repeat 5 strmid n,sequence,cnt*2,1 int n sum=sum+n str n loop mes sum nは文字列型なので、int命令で数値にしてから足し算しています。strmid命令の第1引数には文字列型変数を指定するので、str命令で文字列型に戻しています。 これが独立した一つのプログラムである場合はいいのですが、もっと大きなプログラムの一部である場合、変数nは別の場所で、別の用途で使っているかもしれません。この処理に入る前、nは数値型になっているかもしれません。すると、1回目のループで、文字列型の変数を指定すべき所に数値型の変数を指定することになります。これはいいことではありません。命令によっては「パラメータの型が違います」というエラーになります。そこで、以下のように書きます。 sum=0 repeat 5 n=0 str n strmid n,sequence,cnt*2,1 int n sum=sum+n loop mes sum 3行目でnに0を入れていますが、数値であれば0でも何でも構いません。これが独立した一つのプログラムである場合、あるいは他の部分でnという変数を使っていない場合、"n=0"がないと、1回目のループの"str n"で、nにはまだ何も入っていないのに型変換することになります。これもいいことではありません。(なくても正しく動作します。何も代入しなかった場合、変数にはデフォルトで0が入っています。しかしデフォルトで0が入っていることを前提とした書き方をすべきではありません。) ただ、これは少々神経質な書き方かもしれません。以下でもちゃんと動作します。 sum=0 repeat 5 strmid n,sequence,cnt*2,1 int n sum=sum+n loop mes sum たぶん、前にnに入っていた値がなんであるかに関わらず、strmid命令を行えば自動的にnが文字列型になるのでしょう。 |