いよいよ敵をやっつけられるんだな!
じゃあいつものように。敵をやっつけるって、なにをすればいいのかな?
そんなのカンタンだぜ!敵にタマが当たったら敵がブッこわれる!
じゃあ、敵に弾が当たったらって、どうやったらわかるかな?
そんなのカンタンだぜ!敵にタマが・・・あれ?スマイルベーシックってそんな事もわかんねーのかよ!
前回ハカセが言ってたとおり、プログラミング言語ってのは命令した事しかしないんだ。そして敵に弾が当たったかどうか調べる命令なんて存在しないし、そもそもどれが敵でどれが弾かなんて事も知らない。全部プログラムしてあげなきゃダメなのさ。
ワタシは違いますがネー!
出やがったなダミー!
でやがったななんて人をオバケのように言っちゃだめでショートサカ頭!アタシは人でないですがネーHAHAHAー
おいインテリ、こいつもプログラムなんだろう?なんでこんなにへらず口をたたけるんだ!
口は減るもんじゃナイヨ。減って足りないのはオマエサンの脳味噌だヨ!
ダミーはAIだからねえ。直接このしゃべり方をプログラムしたわけじゃなくて、たくさんのおしゃべりを学習したら勝手にこんなしゃべり方になっちゃってこまってるんだよ・・・
インテリ、ドンマイ!悩みがあるなら相談にノルヨ!人生相談もいっぱい学習したカラね!
ああ・・・
・・・
ともかく話を先に進めよう。あらためて、敵に弾が当たったらって、どうやったらわかるかな?
そんなのカンタンだぜ!当たり判定デスヨ!
アタリハンテイ?なんだそりゃ?
ああもう、答えを言っちゃったし。そう、当たり判定っていうのを使うんだ。
当たり判定ってのは、その名の通り、当たったかどうかを判定するっていう意味だよ。
つまり、敵と弾が当たったか当たらないかを、その当たり判定っていうので判定できるってこと?
そういうこと!
なんだよ、ベンリな物があるんじゃねーか!ダミーお前知ってんだろう?そいつを教えろよ!
いや知らネー
なにい?
ワタシのプログラムには使われてマセンし。当たり判定大きすぎだこのクソゲー!とか当たり判定バグってるこのクソゲー!言ってる人ならネットにいまシタよ。
そんだけかよ!
ダミーが拾ってきたのは、ゲームの当たり判定が気に入らなくて文句言っている人達の話で、プログラミングとは無関係だね。実際ダミーのプログラムでは当たり判定は必要ないから組み込まれていないよ。
当たり判定っていうのはさきも言った通り当たったかどうかを判定するっていうだけの意味で、判定する方法にはいろんな方法があるんだ。今回は一番カンタンな方法を使おう。実はSmileBASICのスプライトはカンタンな当たり判定を行う機能が入っているんだ。
まずはSPCOL命令。これはスプライトに当たり判定用の長方形を設定する命令さ。設定方法は何種類かあるけど、まずは一番カンタンなのを使おう。
スプライトの絵と全く同じ場所・大きさの長方形でいいなら、これだけでいいよ!
当たりを判定したいスプライトには全部設定する必要があるから注意してね。今回は敵と弾両方だね。
あとは、例えば敵と弾の当たりをチェックしたい時に、SPHITSP関数を使えばOK!。当たったら1、当たっていなかったら0を返すんだ。
IF SPHITSP(敵,弾)==1 THEN 当った時の処理
本当はちゃんと数学的な基本から覚えといた方がいいんだけど、ちょっと難しいから説明は省略するよ。ともかく、これでスプライト同士が当たったかどうかはチェックできるよ。
なんだよ、さんざん脅かしといていいモノがあるじゃねえか!
あとは当たった時の処理だね。当たったらどうしたい?
そりゃあ爆発だろう!ゲージュツ的に爆発させようぜ!
爆発させるのはまだちょっと難しいかな。今回は音を出して敵を消すだけにしようか。
チェッ、つまらねえが今日のところは勘弁しといてやるぜ。
スプライトを消すのは、この前使ったSPCLR命令を使うよ。
音を出すにはBEEP命令を使うよ。BEEP 音番号でいろんな音を鳴らせるんだ。音番号はスマイルツールで確認できるよ。
よし、それだけわかれば十分だ!
・テキに当たり判定をつける
・テキがいるときだけテキを動かす
・SPHITSPでタマに当たってるか調べて、当たってたらテキとタマを消す
って事だな。仕様もバッチリ。じゃあプログラムを書くぜ!
'---てき----------------------------
'てきのかず
ECOUNT=10
'てきのざひょう
DIM EX[ECOUNT]
DIM EY[ECOUNT]
'てきのそくど
DIM EVX[ECOUNT]
DIM EVY[ECOUNT]
'てきのいどうじかん
DIM ETIME[ECOUNT]
'てきがいる?
DIM ENEMY[ECOUNT]
'てきのスプライトID
DIM EID[ECOUNT]
'てきざひょうしょきか
FOR I=0 TO ECOUNT-1
EX[I]=200
EY[I]=60
NEXT
'てきのスプライトをつくる
FOR I=0 TO ECOUNT-1
EID[I]=100+I
SPSET EID[I],1203
SPOFS EID[I],EX[I],EY[I]
SPCOL EID[I]:'てきにあたりはんていをつける
ENEMY[I]=1 'てきがいるときは1に
NEXT
'---プレイヤー-------------------------
'プレイヤーのざひょう
PX=200
PY=200
'プレイヤーのスプライトID
PID=10
'プレイヤーのえのばんごう
PPIC=3323
'たまのスプライトID
TID=20
'たまのえのばんごう
TPIC=3386
'たまがある?
TAMA=0
'プレイヤーのスプライトをつくる
SPSET PID,PPIC
SPOFS PID,PX,PY
'---メインループ-----------------------
LOOP
'---プレイヤーしょり----------------------
'さゆうにうごかす
IF BUTTON(1,#B_LLEFT)==1 THEN PX=PX-1
IF BUTTON(1,#B_LRIGHT)==1 THEN PX=PX+1
IF PX<0 THEN PX=0
IF PX>400-16 THEN PX=400-16
SPOFS PID,PX,PY
'まずたまがないことをチェック
IF TAMA==0 THEN
'つぎにボタンをチェック
IF BUTTON(1,#B_RRIGHT)==1 THEN
'たまはっしゃ!
'たまのざひょうはプレイヤーとおなじ!
TX=PX:TY=PY
SPSET TID,TPIC
SPOFS TID,TX,TY
SPCOL TID:'たまもあたるように!
BEEP 111:'はっしゃおんもだすぜ!
TAMA=1
ENDIF
ENDIF
'たまがあるときだけ!
IF TAMA==1 THEN
'たまをうえにうごかす
TY=TY-5
SPOFS TID,TX,TY
'たまががめんからとびでたか?
IF TY<0 THEN
TAMA=0
SPCLR TID
ENDIF
ENDIF
'---てきしょり-------------------------
FOR I=0 TO ECOUNT-1
IF ENEMY[I]==1 THEN
IF ETIME[I]==0 THEN
'うごくほうこうをきめる
EVX[I]=RND(3)-1
EVY[I]=RND(3)-1
ETIME[I]=20
ENDIF
'てきをうごかす
ETIME[I]=ETIME[I]-1
EX[I]=EX[I]+EVX[I]
EY[I]=EY[I]+EVY[I]
SPOFS EID[I],EX[I],EY[I]
IF SPHITSP(TID,EID[I]) THEN
'あたった!
BEEP 11:'ばくはつ!
SPCLR EID[I]:'てきをけす
ENEMY[I]=0:'てきがいなくなったので0にする
SPCLR TID:'たまもけす
TAMA=0
ENDIF
ENDIF
NEXT
VSYNC
ENDLOOP
あんがいカンタンに書けたな。いきおいで弾の発射音もつけてやったぜ!
ワンパク君、カンペキだよ!敵に弾が当たった時に、敵だけじゃなくちゃんと弾も消してるじゃないか。きっとそのまま飛んで行くだろうと思ったのに。
ヒヒヒ。ほめても何も出ないぜ!
SmileBASICはゲームで良く使うけど書くのが大変な処理をカンタンに書ける命令をいろいろ持っているんだ。当たり判定もそのひとつだね。スプライトの絵だけじゃなく音もゲーム用の効果音やBGMをいっぱい持っているよ。
なに?BGMもならせるのか!せっかくだからなんかならそうぜ!
そうだね。じゃあスマイルツールを使って、鳴らしたいBGMを探してみてよ
どれどれ・・・よし、40番だ!もっとかっこいい曲もあるけど、それはすげえラスボス用にとっておくぜ
OK!BGMを鳴らす方法はカンタンだよ。BGMPLAY 曲の番号 で鳴らせるんだ。
なるほどな、じゃあプログラムの一番最初にBGMPLAY 40と書いて、実行!
おー!
音がつくと一気に本物のゲームっぽくなるね!
そうだね!音ってのはゲームを盛り上げるすごく大事な要素なんだ。だから中には音は一番最後につける人もいるんだよ。
盛り上げる大事な要素なら一番最初につけといた方がいいんじゃねえか?
ゲームが本当におもしろいかどうかが音でごまかされちゃうのを嫌うんだ。音がなくても本当に面白いゲームは面白いからっていうリクツだね。
ふん、世の中にはいろんなヤツがいるな。オレはもちろん最初から盛り上がる方がいいぜ!
その考え方はワンパク君らしいのう!ところで、音で盛り上がっているが、なんかこう物足りないところはないかのう。
なんだジジイ、人の成果にケチつけにきたのか?不満点なんてないぜ!並みいる敵を連射連射・・・あれ、連射がきかねえぞ?
まさに音でごまかされるとるのう。
くそっ、インテリ!どうすりゃ連射できるんだ!
連射かあ・・・敵を増やしたのとおなじような事を弾でもやればいいんだけど・・・
ムリムリー、大改造じゃないデスカ。インテリさん、ニワトリみたいな頭にはムリですヨー、3歩アルいたら忘れちゃいマス。
うおー、ダミーてめえ!
IF文ふたつつなげるだけで論理演算も使えないようなヤツにはムリムリー。じゃあサヨナラー。
うっ
うっ
インテリ!ジジイ!そのロンリーエンジンだかなんだかを教えろ!ギザギザ女を見返してやるぜ!
うう・・・
うう・・・
二人そろって渋い顔してどうしたの?