VBで始めるプログラミング 第5回 •関数を作る •シューティングゲームに向けての基礎知識 関数とは 関数 関数とは、大雑把に言ってしまえば、ある情報を入力とすることによって、 その入力に従った処理をおこなってくれる「機械」と考える。 ここで、二つの種類に分けることができる。 関数とサブルーチン •入力に対して、決まった出力を吐き出すような「機械」を関数(ファンク ション)と呼ぶ。 •出力を行わずに処理だけ記述するものをサブルーチンと呼ぶ。 入力 川 川 出 力 関数 サブルーチン 入力 関数の例 入力に対して、それに従った出力をしてくれるものとは、例を挙げる と、「自動販売機」がそれにあたる。入力は「お金」と「製品ボタン」、 出力は、ジュースと対応付けることができる。 では自動販売機をVBで書いてみると、 If 入金額<120 then msgbox(“お金が足りません”) Else if 押されたボタン = “ポカリ” then ポカリ排出 if 押されたボタン = “コーラ” then コーラ排出 if 入金額 > 120 then お釣り排出 End if 関数、サブルーチンのメリット では、この「自動販売機」をしたのようにしてみよう。 If 入金額<120 then msgbox(“お金が足りません”) Else if 押されたボタン = “ポカリ” then ポカリ排出 If 押されたボタン = “コーラ” then コーラ排出 if 入金額 > 120 then お釣り排出 End if 商品 = 自動販売機(入金、ボタン) 左のように、簡単な一行にまとめる ことができる。 別にまとめる必要がないと言えば、 そうであるが、プログラムにおいて、 「どこでなにがおこなわれている か」ということをしっかりと区切るの はとても重要なことなのである。 引数・戻り値 今まで、「入力」とか「出力」とか説明してきましたが、プログラムにおける「関数」で は、入力を「引数」、出力を「戻り値」と呼びます。 一般に、引数は複数個が可能で、戻り値はひとつです。絵に描けば 戻り値 引数 Black box となります。 閑話休題 「どこでなにがおこなわれているか」ということをしっかりと区切るとは? シューティングでたとえるならば、以下のようにプログラムするのが好ましい。 変数上での 自機、弾、敵 の移動 変数上のデータを実際に 描画する。 Timerにより繰り返し 変数上での 当たり判定 変数上で 敵の存在を消す/作る 弾の存在を消す/作る 変数上での 自機、弾、敵 の移動 変数上のデータを実際に 描画する。 Timer 変数上での 当たり判定 変数上で 敵の存在を消す/作る 弾の存在を消す/作る Private sub timer1_timer ‘----------移動--------------------teki.posx=teki.posx+teki.vx ・・・ ・・・ ‘---------あたり判定------------if teki.posx = tama.posx then ・・・ ・・・ ‘--------キャラの作成消去-----teki.exist = false ・・・ ・・・ ‘--------描画----------------------picture1.top = teki.posy ・・・ End sub Private sub timer1_timer call movechara ‘移動 call atari ‘あたり判定 call chara_gd ‘キャラ作成/削除 call mainpaint ‘描画 End sub Private sub movechara teki.posx=teki.posx+teki.vx ・・・ End sub Private sub atari if teki.posx = tama.posx then ・・・ End sub Private sub chara_gd teki.exist = false ・・・ End sub Private sub mainpaint picture1.top = teki.posy ・・・ End sub では、まずはサブルーチンから。 サブルーチンの内部を定義するには、次のように書く。記 述する場所は、もちろんプロシージャ外。 Private sub サブルーチン名(引数名1 as データ型,引数名2 as データ型 ,・・・) させたい処理 End sub 呼び出し部は、 Call サブルーチン名(引数1、引数2、・・・) となる。 例題: 引数を文字列として、その文字列をmsgboxで表示してく れるサブルーチンを書いてみよう (つまり Call msgsub(“えらー!”) とする。) 解答 Private Sub Command1_Click() Call mainprint("エラーだよ~") End Sub Private Sub mainprint(str As String) MsgBox (str) End Sub 次に関数。 関数の内部を定義するには、以下のように記述する。 Private function 関数名(引数名1 as データ型,引数名2 as データ型 ,・・・) as 戻り値のデータ型 させたい処理 関数名 = 戻り値 End function 呼び出し部は、 Answer = 関数名(引数1、引数2、・・・) となる。 例題: 二つの引数a,b(integer)を用意して、その二つの値を足したも のを返す関数を設計して、その結果をtextboxに入れる。 解答 Private Sub command1_Click() Text1.Text = sum(1, 2) End Sub Private Function sum(a As Integer, b As Integer) As Integer sum = a + b End Function ぷろろーぐ? 今の段階で、シューティングゲームを作るとなると、以下のようなものが実現 できる。 敵が動く(timer) 自機を操作する(キー入力) 当たり判定 では、シューティングを実現するためには、他になにが必要か? ゲーム内オブジェクトの生成と消去 ゲーム内オブジェクトの生成と消去 なんだか難しそうな表題だけど、いいたいことは簡単。 ゲームで出現するオブジェクト(弾、敵、爆発)などは、長い眼で見 れば、無限個必要になる。しかし、実際は、有限個のオブジェクト しか生成できない. →不必要になったオブジェクトはどんどん消去し、その空席に新し い、オブジェクトを生成していく。 では、不必要とは何か? •画面外に行った 弾 •倒した 敵 などである。 生成と消去のサブルーチン(1) まず、同時に表示できる敵の数を32、同時に表示できる弾の数を64とする。 よって、コントロール配列により、enemy(0)~enemy(31)、bullet(0)~bullet(63)を配置し、 それをフォーム外に配置する。 生成と消去のサブルーチン(2) ここでは、弾のサブルーチンのみ設計してみる。まず、弾一つ一つが持つ 情報は •位置(top,left) •速度(方向別) •弾の種類 •その弾が存在しているか であろう。ここで、重要なのが、「その弾が存在しているか」。これによって、 弾を消去したり、生成したりする。 生成と消去のサブルーチン(3) ではまず都合により消去のサブルーチンから作る。 概要としては、存在しているかどかのフラグを「偽」にしてしまうだけでよい。よって、 Private sub degenerate(弾番号) 弾番号.存在フラグ = 偽 End sub で作ることができる。つまりこれは以下のような場合に使 う。 For i=0 to 63 If 弾(i).posx < 0 then degenerate(i) Next 生成と消去のサブルーチン(4) 生成のサブルーチンの概要は、 64個の弾の情報を見て、使われていない(存在フラグが偽)弾を、座標、 速度などを変えて再び出現させる、というもの。すると以下のようになる。 Private sub generate(x,y,vx,vy,type) for i=0 to 63 if 弾(i).存在フラグ = 偽 then 弾(i).X座標 = 弾(i).Y座標 = 弾(i).X速度 = 弾(i).X速度 = 弾(i).存在フラグ = 真 end if next End sub 存在フラグ これは生成・消去以外にも使いみちがあって、それは描画の際に使 われる。敵でも弾でも、存在しているもののみが、描画されるべきで あるので、これは以下のように描画される For i=0 to 63 if 弾(i).存在フラグ = 真 then picture(i).top=弾(i).posy picture(i).left=弾(i).posx ・・・・ end if Next
© Copyright 2025 ExpyDoc