【Prominence3D】もよろしく!!
あのRPGツクールの開発部もおすすめする
2Dゲーム用の3Dエフェクト作成ソフト!!
無料体験版を是非触ってみてください!!
トップページ > HSPのひきだし > ★を増やす
2013年04月07日

★を増やす

Pocket

変数を増やす

1個だけ出てくる★を避けてても面白くないので、
★の数を増やしましょう。

完成形では徐々に増えていきますが、
とりあえず最初から200個表示させてみましょう。

さて、★の位置は変数star_xとstar_yに入っています。

200個の★はそれぞれ位置がバラバラになりますが、
一つの変数には一つの値しか入れられません。

どうしたらいいでしょうか…

答えは「変数を200個づつ使う」です。
star_xとstar_y、そして、速度もバラバラですから
star_speedをそれぞれ200個ずつ使います。

変数の名前に数値を使ってもいいので、
star_x001、star_x002、star_x003…star_x200という名前にしましょう。

では、まず★の最初の位置を指定してる部分から直していきましょう。

    ;星の位置
    star_x001 = 800
    star_x002 = 800
    star_x003 = 800

      (途中省略) 
    star_x199 = 800
    star_x200 = 800

    star_y001 = rnd(480-32)
    star_y002 = rnd(480-32)
    star_y003 = rnd(480-32)
 
      (途中省略) 
    star_y199 = rnd(480-32)
    star_y200 = rnd(480-32)


    ;星の速度
    star_speed001 = rnd(5) + 2
    star_speed002 = rnd(5) + 2
    star_speed003 = rnd(5) + 2

      (途中省略)
    star_speed199 = rnd(5) + 2
    star_speed200 = rnd(5) + 2

ウソです。ごめんなさい。こんなのやってられません(^ ^;

真面目に打ち込んじゃった人がいたら本当にごめんなさい。

考え方は正しいんですよ。

変数を大量に扱うのもホントの話。

でも、これだけのために600行も書くのはアホらしいですね。

そこで、HSPを作った人は大量の変数を
楽に扱う方法を用意してくれました。

それを「配列」といいます。

配列

今回のように、同じような変数を複数使いたい場合は次のように書きます。

dim 変数名, 個数

こう書くと、指定した個数の変数がいっきに作られます。

作られた変数名は「変数名(0)」「変数名(1)」「変数名(2)」「変数名(3)」…となります。

つまり、たとえば
dim x, 5
と書いた場合は「x(0)」「x(1)」「x(2)」「x(3)」「x(4)」という
5つの変数が作られます。

(0)~(4)の5個です。x(5)は無いので注意してください。

ちなみに、この()の中に書く番号のことを「添え字」と言います

やってみよう

今回は、star_xとstar_y、star_speedが200個ずつ必要なので、こうなります。

    ;星の位置
    dim star_x, 200
    dim star_y, 200
    star_x = 800
    star_y = rnd(480-32)

    ;星の速度
    dim star_speed, 200
    star_speed = rnd(5) + 2

これで変数が200個ずつできました。

次に、star_x(0)~star_x(199)に全部800を代入します。

ここで配列の最大のありがたみがわかります。

配列の添え字(変数名の後ろの番号)は変数で指定することもできます。

つまり、0番から199番まで全部800にするには、こう書けばいいんです。

    ;星の位置
    dim star_x, 200
    dim star_y, 200
    a = 0
    repeat 200

        star_x(a) = 800
        a = a + 1
    loop


    star_y = rnd(480-32)

わかりますか?

まず変数aに0を代入しています。

repeat-loopは、その間を指定した回数繰り返すんでしたね?

まず、star_x(a)と書いてありますが、aには0が代入されているので
star_x(0)=800と書いたのと同じです。

次にa+1をaに代入しています。

これでaは1増えて1になります。

これを繰り返すわけですから、次はstar_x(1)=800と書いたのと同じになります。

ということで、star_x(0)~star_x(199)までが全部800になります。

このように、配列はループと併用した時に真価を発揮します。

 

システム変数

先ほど書いた部分をちょっと修正します。

    ;星の位置
    dim star_x, 200
    dim star_y, 200

    a = 0 (削除)
    repeat 200
        star_x(cnt) = 800
        a = a + 1 (削除)
    loop

変数名をaの代わりにcntに変更しました。

そして、変数に0を代入する部分と、1ずつ増やす部分を削除しました。

なんと、これだけでstar_x(0)~star_x(199)までが全部800になります。

なぜかというと、cntという名前の変数は特別な変数で、
ループが始まるときに勝手に0が代入され、
処理を繰り返すたびに勝手に1ずつ増える変数になります。

cntは「カウンター」の略です。

repeat-loopを使うときはこの変数が
すごく便利なので是非覚えておいてください。

cnt以外にも、勝手に何らかの値が入る変数がいくつかあります。

そういう変数を「システム変数」と呼びます。

他にどんなシステム変数があるについては、
機会があれば別なところで紹介します。

【メモ】
cntが使えるのはrepeat-loopの間だけです。
gotoを使った繰り返しの中では使えません。

 

他の変数も初期化する

star_xはすべて800になりましたので、ほかの二つの変数も最初の値を代入しましょう。

    ;星の位置
    dim star_x, 200
    dim star_y, 200
    repeat 200
       star_x(a) = 800
       star_y(a) = rnd(480-32)
    loop
    star_y = rnd(480-32) (削除)

    ;星の速度
    dim star_speed, 200
    repeat 200
        star_speed(cnt) = rnd(5) + 2
    loop

こんな感じですね。

 

全部ループ処理にする

変数の初期化(最初の値を代入すること)はできましたが、
それだけではダメです。

まだ、★の表示も、移動も、1個分の処理しかしていません。

衝突判定もそうですね。

それらの処理を全部ループ処理にします。

具体的にいうと、star_x, star_y, star_speedという変数を
使っている部分はすべて修正しなければなりません。

star_x(0)~star_x(199)という変数を作りましたが
「star_x」という()が付かない変数はもう無い
ということを意識してください。

少しプログラムが複雑になってきたかと思うので、
一度全体を載せておきますね。

    ;乱数の初期化
    randomize 

    ;スクリーンを作成
    screen 0, 800, 480

    ;自機の位置
    player_x = 100
    player_y = 200

    ;星の位置
    dim star_x, 200
    dim star_y, 200
    repeat 200
        star_x(cnt) = 800
        star_y(cnt) = rnd(480-32)
    loop

    ;星の速度
    dim star_speed, 200
    repeat 200
        star_speed(cnt) = rnd(5) + 2
    loop

    ;フォントの設定
    font "MS ゴシック", 32

*メインループ
    ;画面をクリア
    color 0, 0, 255
    boxf

    ;自機を表示
    color 0, 255, 0
    pos player_x, player_y
    mes "●"

    ;自機移動
    stick key, 15
    if(key & 4){ ;→を押した
        player_x = player_x + 5
    }
    if(key & 1){ ;←を押した
        player_x = player_x – 5
    }
    if(key & 2){ ;↑を押した
        player_y = player_y – 5
    }
    if(key & 8){ ;↓を押した
        player_y = player_y + 5
    }

    ;星の移動
    repeat 200
        star_x(cnt) -= star_speed(cnt)
    loop

    ;星の表示
    color 255, 255, 0
    repeat 200
        pos star_x(cnt), star_y(cnt)
        mes "★"
    loop

    ;★が左端に出た
    repeat 200
    if(star_x(cnt) < -32){
        star_x(cnt) = 800 ;ふたたび右端へ
        star_y(cnt) = rnd(480-32) ;高さはランダム
        star_speed(cnt) = rnd(5) + 2 ;速度もランダム
    }
    loop

    ;自機と★の衝突判定
    repeat 200
        if((star_x(cnt) > player_x – 20) and (star_y(cnt) > player_y – 20) and (star_x(cnt) < player_x + 20) and (star_y(cnt) < player_y + 20)){
        end ;プログラム終了
    }
    loop

    await 16
    goto *メインループ

 

これで実行すると、200個の★が一気に出てきて、
どれかにぶつかるとプログラムが終了するはずです。

 

今回のポイント

  • 「dim 変数名, 個数」と書くと、
    変数名(0)、変数名(1)、変数名(2)…という複数の変数が作られる。
    これを「配列」という。 
  • 「cnt」という名前の変数は、repeat(ループ開始)のところで0が代入され、loop(ループ終了)のところで自動的に+1される。

Pocket


★を増やす” への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。

 ■ツール・ゲーム  ■講座  ■素材  ■その他  ■管理人へ
  Prominece3D   エフェクト画像の描き方   戦闘エフェクト素材   CG作品   お問い合わせ
  ウディタミネンス   ロゴの描き方   投稿エフェクト   書籍   管理人を応援
  Relocater   HSP講座      
  Prominece        

Copyright © 2011-2015 藤宮翔流 All Rights Reserved.