ここから先だけど、キミたちはどんなゲームを作りたいんだい?
うーんそうだねえ。ボクは・・・
シューティングだシューティング!チョウのように舞いハチのように刺す!アットウテキな連射で全部ぶっこわす!まさにゲームの中のゲーム!
・・・まあ、ワンパク君がそこまで言うならシューティングでいいよ。
カンタンなシューティングゲームなら初心者にも作りやすいから、ボクも賛成するよ。
となると、なにから手をつけようかなあ・・・
そんなのはわかりきったことだぜ。ムジヒなこうげきでプレイヤーを殺しにくる、ものすごいラスボスをつくろうぜ。死ぬがよい!
うーん、ものすごいラスボスはものすごい高度なプログラムが必要だよ。たとえばかっこいい弾幕やレーザーを打つにも、三角関数やらなにやら・・・
ううっ、また数学か!プレイヤーを殺しにいく前にオレサマが殺されちまう・・・
まずは手始めにザコキャラから作ろう。ザコキャラもものすごいラスボスも、基本は同じだからね。
よし!ウデがなるぜ!エディットモードに切りかえてと・・・お、しまった。なんか読んでたな。BackSpaceで全部消すのめんどくせえんだよな。
ああごめん、大事な事を教えてなかったね。今みたいにエディットモードになにかプログラムが残っていて、きれいさっぱり消したい時は、ダイレクトモードでNEW命令を実行してね。NEWって入力してEnterだよ。これでエディットモードのプログラムはきれいさっぱり消えるんだ。
ふふん、NEWか。よし、カモーンニュープログラム。
いいかい、プレイヤーと同じで、敵もスプライトを使うよ。
じゃあ、下のプログラムを入力してみてね!敵を1体だけ出してみたよ!
'てきのざひょう
EX=200:EY=60
'てきのスプライトID
EID=100
'てきスプライトひょうじ
SPSET EID,1203
SPOFS EID,EX,EY
LOOP
'てきをうごかす
EX=EX+RND(3)-1
EY=EY+RND(3)-1
SPOFS EID,EX,EY
VSYNC
ENDLOOP
ふふん、どうってことないプログラムだな!なんか日本語がまざってるのと、スプライトIDってのがナゾなのと、LOOPの後の行で頭にスペース入れてるのと、からっぽの行があるのと、RNDってのがちっともわからないがよ!
自信たっぷりにぜんぜんわからないって言うんだね
じゃあ説明するよ。
まず1行目、ワンパク君のいう日本語があるね。頭に'がついてるのに気がついたかな。これはコメントって言うんだ。
'という記号を使うと、その後ろは行の一番最後まで無視されるんだ。
無視されるって、ちっともやくにはたたないってことか?
プログラムとしての役目はないんだけど、無視されるって事は逆に言うと'の後ろは何を書いてもいいって事だね。
実際のプログラムでは、コメントはプログラムで何をやっているかの説明を書いておくのに使うんだよ。変数の役目やわかりづらい動作の説明を書いとくと、わかりやすいだろ?
1行目に「てきのざひょう」って書いて、次の行でEXとEYをセットしてるってことは、EXとEYが敵の座標ってことか。なるほど、たしかにわかりやすいぜ。
わかってくれたみたいだね!ちなみに'から後ろはプログラムとしては無意味だから、入力しなくても問題ないよ。あとでわかりづらくなっちゃうけどね。
じゃあ次にいこう。コメントに書いてあるスプライトIDだけどこれはカンタン。スプライトの番号っていう意味さ。
IDってのは英語のidentificationとかidentifierの頭2文字を取った略語で、日本語だと識別子っていう難しい訳もあるけど、プログラムの中でIDって出てきたら番号の意味だと思えばいいよ。
次は11行目から。LOOPのうしろで頭にスペースを入れてるのはインデントっていう、プログラムを見やすくする工夫なんだ
このインデントも使っても使わなくてもプログラムの動きは変わらないよ。行の頭にスペースを入れても無視されるんだ。
こうやってLOOPとENDLOOPのあいだにある行の頭にインデントをつけると、どこがループの中で実行されるか一目でわかると思わないかい?あとでためしにスペースを削除してみて、どっちが見やすいかたしかめてみるといいよ。
コメントやインデントをつけたり、変数の名前をわかりやすくして、読みやすいプログラムを書くと、バグも出にくくなるし、バグが出た時も原因をさがしやすくなるからとっても大事な事なんだ。
それと、5行目や9行目に改行だけ入っている空の行があるよね?これもプログラムを読みやすくするための工夫さ。作文で段落を分けるように、プログラム中でやっている事のかたまりごとにこうやってすきまを空けるだけでプログラムが読みやすくなるんだよ。もちろん空の行を入れてもプログラムの動きは変わらないんだ。
ふん、つまりプログラムもセイリセイトンが大事って事だな!おりこうさんの考えそうなことだぜ!
まあそういうこと!
さてもうひとつのRND。12行目と13行目だね。これは関数の一種さ。関数はおぼえてるかな?
なんだかよくわからないけどいろんな値を返すんだよな。これはナニを返してくれるんだ?
RNDは乱数ってのを返してくれるんだ。てっとりばやく言うと、呼ばれるたびにサイコロを振ってバラバラな数を返してくれるんだよ。
てことは、1から6まで何が返ってくるかわからないけど、どれかが返ってくるってことか?
おしいね。RNDに引数として3ってのが指定されてるだろ?RNDは0から引数-1までの目があるサイコロを振って結果を返すって言えばわかるかな?
つまり3だと、0から2を返すと・・・0,1,2のどれかをバラバラに返すってことか。
正解!
そうすると、このEXとEYの2つの式はナニをやってるかというと、えーと・・・
EXに0,1,2のどれかをたして、1をひく・・・
んんん?んんんんん?
ワンパク君、12章で、左右ボタンが押された時の事を思いだしてみて!
あの時は左ボタンが押されたら1をひいて、右ボタンが押されたら1をたしたんだったな。座標のXが小さくなると左に、大きくなると右にいったワケだ。
0,1,2のどれかをたして1をひくってことは、まとめると -1,0,1のどれかをたすってこと?
-1をたすってのは1をひくのとおなじだから・・・-1だと左、1だと右にいくってことか!
あいかわらず調子いいじゃないか!その通りだよ!じゃあEYのほうはどうだろう?
XがYにかわっただけってことは、-1だと1減るから上、1だと1増えるから下に動くってこと?
よし、-1,1はわかったぜ。0の場合は・・・EXもEYも0をたしても何も変わらないな。つまり動かないってことか!
いいね!つまりこの12,13行目のふたつの式は何をやっているかというと?
ちょっと待てよ、こたえがもう出かかってるぜ・・・
RNDの返してきたバラバラな0,1,2によって、テキトウに上下左右に動く!
正解!じゃあ実際に動かしてみようか!
よし、動けオレのシモベよ!
・・・
ちゃんと動いたね!
また反応がうすい・・・
動いたけどよう、今回もジミっつうか、なんかコバエが飛んでるっつうか、ザコにしてももう少しかっこいい動きを・・・
適当に上下左右に動くだけだと、あまりおもしろい動きにはならないねえ。
じゃあ、こんなのはどうかな?
'てきのざひょう
EX=200:EY=60
'てきのそくど
EVX=0:EVY=0
'てきのいどうじかん
ETIME=0
'てきのスプライトID
EID=100
'てきスプライトひょうじ
SPSET EID,1203
SPOFS EID,EX,EY
LOOP
IF ETIME==0 THEN
'うごくほうこうをきめる
EVX=RND(3)-1
EVY=RND(3)-1
ETIME=20
ENDIF
'てきをうごかす
ETIME=ETIME-1
EX=EX+EVX
EY=EY+EVY
SPOFS EID,EX,EY
VSYNC
ENDLOOP
ちょっと長くなったし、変数もふえたよ!これは先に動かしてみよう!
どれどれ・・・おお?ハエからトンボに進化した気がするぞ!
このプログラムを説明をするよ!
最初のプログラムVSYNCごとに座標をてきとうに1ずつ変えていたよね。
今回は、動かす方向を適当に決めたら、その後しばらくはその方向に移動し続けるようにしたんだ。
その前に、15行目のIFの書きかたなんかおかしくないか?THENの後ろに何も書いてないし、あと20行目にあるENDIFなんてのもはじめて見るぜ。
これはIF文のもうひとつの書き方で、ブロックIF文て言うんだ。
今までのIFの書き方で書くとこうなるよ
IF ETIME==0 THEN EVX=RND(3)-1:EVY=RND(3)-1:ETIME=20
つまり、ETIMEが0だったら、EVXとEVYに-1,0,1を適当に入れて、ETIMEに20を入れるっていう意味。
とはいえ、これだとTHENの後ろに:を使ってたくさんの命令をつなげて書いてあって、読みづらいと思わないかい?
たしかに、THENの後ろがクシャクシャっとしててわかりづらいね。
そう。:を使うとたくさんの命令を1行にまとめて書けるけど、つなげればつなげれるほどわかりづらくなるんだ。同じような命令をまとめて書きたい時以外は、:は使わないほうが読みやすくなる。でもTHENのうしろで:を使わないと、1個の命令しか書けない。そこで登場するのがこのブロックIF文だよ。
ブロックIF文のしるしはカンタン。THENのうしろに命令を何も書かない。そうすると、SmileBASICは次の行以降もずっとTHENの時に実行する命令だと思いこむんだ。
そして、ENDIF命令。これはここまでがTHENの時にやる事ですよっていう意味なんだよ。
ENDIFを書かないとどうなるんだ?
ブロックIF文でENDIFを書かないと、ENDIFがない!っていうエラーが出るから注意してね。
なるほどな・・・このプログラムだと、THENとENDIFのあいだにある16行目から19行目が、THENの時に実行されるってことだな!
そう!ついでに、16行目から19行目にもインデントがついてるよ。こうするとどこがTHENの時に実行されるかひとめでわかるだろ?
よーし、あとは解読するだけだな・・・
わかんねえ!なんかイッキにむずかしくなった気がするぞ!
そうだねえ。しばらく動く方向を固定するってのを入れただけなんだけど、それだけでかなりむずかしくなるんだ。すごいラスボスを作るってのがどれほど大変なのかなんとなく想像できるんじゃないかな。
くそう、オレはあきらめないぜ。まってろラスボス!
ヒントを出そうか。ETIMEってのがこのプログラムのカギになる変数なんだ。ETIMEに注目してプログラムの最初から動作を追っていってごらん。
よし・・・さいしょは6行目、ETIMEが0だな。そのままLOOP突入と。
で、15行目、いきなりIFでETIMEが0だったら、だから、THENだな。ブロックIF文だから16行目から先を実行すると。
コメントは飛ばして17,18行目、EVX,EVYには・・・お、これは最初のプログラムでいう-1,0,1のどれかが入るってことか。
そして19行目でETIMEに20を入れると。そしてENDIFが来たからブロックIF文はおしまい、と。
23行目、ETIME=ETIME-1。ここでETIMEは19になる。
24,25行目、EXとEYにそれぞれEVXとEVYをたすってことは、IF文の中で決めた-1,0,1のどれかの値どおりに、上下左右に動くってことだな。ここから先は最初のプログラムと変わってなさそうだな。
いいね!じゃあENDLOOPでLOOPのところにもどったらどうなる?
またIFだな。こんどはETIMEは0じゃないから、THENはスキップと。これはENDIFのうしろ、21行目まですっとばすってことだな?
正解!そのままいこう。
それで、ETIMEがこんどは18になって、EX,EYにまたEVX,EVYをたして、ということは、最初のTHENの中で入れた方にまた動くのか。
で、またENDLOOPが来て、ETIMEが17になって、また同じ向きに動いて、16になって、また同じ向きに動いて・・・
ははあ・・・つまりはだ!
おお?
ETIMEが0になるまでのあいだ、20回は同じ向きに動くってことか!
20回動くとETIMEが0になるから、THENの中に入って、EVX,EVYの値が変わる、つまり動く向きが変わる。そしてそのあと20回はTHENをスキップするから、20回同じ向きに動く!なんてこった!
おめでとう!よくわかったね!
SmileBASICはすごくカンタンな言語だから、どんなにむずかしく見えても、今やったみたいに1命令ずつ動きを追っていけば、かならず理解できるはずさ。これからもこうやってプログラムの動きを調べていくと、しらずしらずの間にいろんな書きかたを覚えられるよ。そうすればすごいラスボスも夢じゃないね!
今回は敵の動きをカンタンにRND関数で作ったけど、もっと凝った動きを作る時は、あらかじめ作っておいたかっこいい動きのとおりに動かしたり、プレイヤーのいる場所によって動きかたを変えたり、いろんな事をするよ。どんなに複雑な事をしても、最終的にはこのプログラムでいうEXとEYをどんどん変えていけば、絵がプログラムにしたがって画面の中を動き回るんだよ。
プレイヤーはコントローラーの操作でEX,EYが変わるし、敵はプログラムで勝手に変わっていく。そう考えると、プレイヤーと敵は「動かすきっかけが違う」っていうだけでそれ以外実はいっしょっていうのは、頭のかたすみにおいとくといいかもね。
そうそう、ダミーとは違うけど、敵の動きのプログラムもAIと言えるよ。実際最近のすごいゲームだと、ダミーみたいな本当のAIで敵が動いていてものすごく賢い動きをしたりするんだ。
ワンパク君は本当に見上げたもんじゃ。わしも見習わんといかんな。
さて、今回2つのプログラムを紹介したが、手で入力してもかまわないし、入力したくないめんどくさがりやさん用に公開キーも作っておいた!42APE33QJじゃ!
プチコン4の作品を見るで公開作品に行ってXボタンを押すと公開キー入力画面が出てくる。そこで42APE33QJと入力するとダウンロードができるぞい。ローカルにしょしんしゃガイド13しょう サンプルという作品が増えてると思うから、そこでマイナスボタンを押すと、3つのプログラムが出てくる。P1が最初、P2が2番目のプログラムじゃ。MAIN.PRGは使わないので気にせんでええぞ。そのまま選んで+ボタンを押すと実行できるぞい。
実行したあとは、+ボタンでプログラムを止めたあと、プチコン4の最初の画面に戻ってプログラムを作るを選んでくれい。ジョイコンXボタンかUSBキーボードのF4キーを押すとプログラムを見る事ができる!
ちなみにこのやりかたは他の作品でも使えるんじゃ。他の人の作品を遊んで、こいつはすごい!どうやってるか見てみたい!と思ったら、+ボタンでプログラムを止めて、プログラムを作るに行けばプログラムをのぞく事ができるぞい。すごい人のプログラムを調べるのはとても良いプログラミングの勉強になるから、ためしてみてくれい。