VBで始めるプログラミング 第5回

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