背景をスクロールする(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に対応する絵
  背景

 1行分のデータを、1つの変数に入れます。変数は文字列型です。文字列型変数の配列変数宣言はsdim文で行います。第1引数は変数名です。第2引数は変数の大きさを指定します。何バイトまで入れられるか、です。半角文字1文字は1バイト、全角文字1文字は2バイトです。第3引数は1つめの要素数で、上の場合はステージ数です。第4引数は2つめの要素数で、上の場合は行数です。backmapは2次元配列です。
 ステージ数は、実際の数より1少ない数を指定します。また行は、最初を0行目として数えます。例えば、backmap.0.0は、ステージ1の0行目のデータです。
 個々のマップチップは、64×64ドットにしています。ゲーム画面の横幅は320ドットなので、1行には5個のデータがあります。データは","(カンマ)で区切って並べることにします。1つのデータは2つの数字からなっています。1桁めは、絵のファイルで、左から何番目のマップチップかを表しています。64×64ドットの矩形を1つのブロックとすると、何番目のブロックにあたるか、です。一番左を0ブロック目として数えます。2桁めの数字は上から何番目かを表しています。マップチップの図に付した数字がその番号です。
 表示される絵との対応が分かりやすいように、添え字の数字が大きい方から順に書いています。(ちなみに、後ろの要素から並べることを「降順」と言います。前の要素から並べるのは「昇順」です。)

 このデータは結構長いので、別のファイル(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が文字列型になるのでしょう。


[目次へ][前へ][次へ] inserted by FC2 system