さあ、プレイヤーキャラを出そう!
おう・・・
あれ、今回はテンション低いね。
この前も言ったけどよう、12章のアレをくっつけるんだろう?結果のソウゾウがつくからつまんねえよなあ・・・
もちろんそれだけじゃなくて、今回は弾を出すところまで作ろうかと思うんだ。
ガタッ
いきなり顔が明るくなったね。
さっそくやろうぜインテリ先生よう!
まずは12章を参考に、左右に動くプレイヤーをくっつけるよ。イチゴが不評だからもっとシューティングっぽいキャラにしよう。
そういやこの前も敵キャラにいきなり1203番とか書いてたけどよ、お前どうやってキャラをさがしてるんだよ。まさか1203回キャラを出しつづけたのか?
ハハ、まさかそんな事はしないよ。プチコン4にはちゃんと便利なツールがついてるんだ。
プチコン4には組み込まれている音・BGM・スプライトの絵を確認できるツールが入っているんだよ。
チッ、キャラを出しつづけたならすげえ根性だと思ったのによ。
せっかくコンピューターを使ってるんだから、こういう事はスマートにやらないとね。
うぉぉなんだそのおりこうさんなセリフは!全身にムシズがはしるぜ!
ワンパク君だってラクなほうがいいだろう?スマートってのはラクって事さ
くっそー、反論できねえ・・・そりゃあラクなほうがいいに決まってるじゃねえか・・・
じゃあツールの出しかたから説明するね。ソフトキーボードでZLかZRボタンを押しながら、スマイルツール1って書いてるボタンをタッチしてみて。マウスでクリックでもいいよ。USBキーボードならF9キー一発さ。
なんかいっぱい出てきたぞ!
ソフトキーボードを使っている人は、画面が変わったら-ボタンで一旦ソフトキーボードを閉じてね。
これがSMILETOOLだよ。最初は効果音(BEEP)のページが出てるけど、コントローラーのL,Rボタンでページを切替えられるんだ。SPDEF定義っていうページに行ってごらん。
絵がいっぱい出てきたぞ・・・0番はイチゴ、1番はミカン・・・SPSETに食わせるあの番号か!
そう!方向ボタンで好きな絵を探せるんだ。8192個あるから探すのも一苦労だけどね。
は、8192個!見てるだけで日がくれちまうな。
おんなじ絵で設定が微妙に違うだけの物とか、絵の大きさが違うだけの物とかもいっぱいあるけどね。ゲームで使いそうな絵はほとんど入ってるんじゃないかな。
Aボタンで拡大表示ができるよ。探し終わったらXボタンかESCキーで抜けられるよ・・・
あれ、聞いてない。
おお?このロボットっぽいのもかっこいいな・・・いや・・・
よし決めた!オレは3323番でいくぜ!
きにいったキャラが見つかったようだね。
SMILETOOLはダイレクトモードでもエディットモードでも使えるんだ。覚えとくといいよ。
インテリ君、SMILETOOLの下の方に出ているSPDEF なんとか・・・ってなにかな?
ああ、それはスプライトの絵の定義内容なんだ。SPSETで出てくる絵は、こういう命令とこういう引数でできていますよって言ってるんだよ。
どういう絵にするかはここにも出ているSPDEFっていう命令で定義するんだけど、それはもう少し後で説明するよ。
さっそくその3323番をプレイヤーキャラにして出してみよう!
'---てき----------------------------
'てきのかず
ECOUNT=10
'てきのざひょう
DIM EX[ECOUNT]
DIM EY[ECOUNT]
'てきのそくど
DIM EVX[ECOUNT]
DIM EVY[ECOUNT]
'てきのいどうじかん
DIM ETIME[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]
NEXT
'---プレイヤー-------------------------
'プレイヤーのざひょう
PX=200
PY=200
'プレイヤーのスプライトID
PID=10
'プレイヤーのえのばんごう
PPIC=3323
'プレイヤーのスプライトをつくる
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
'---てきしょり-------------------------
FOR I=0 TO ECOUNT-1
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]
NEXT
VSYNC
ENDLOOP
だんだん長くなってきたね!
どれどれ・・・3323番にした以外はたしかに12章をくっつけただけだな。おや、コメントがふえてるぞ?
プログラムが長くなればなるほど中身を理解するのはむずかしくなるからね。今回は、「ここからプレイヤー」「ここから敵」っていう大きなグループに分けて、その境目にコメントを入れたよ。こうやって横線のようにしたらさらにわかりやすいと思わないかい?
たしかに!
このメインループっていうコメントはなんだ?たしかにループのとこに書いてるけどよ。
プログラムの一番中心になる処理を書いたループの事をメインループと呼ぶんだ。今のところはあまり意味がないけど、これからここがどんどん変わっていくよ。
じゃあ実行してみようか!
本当に前回のプログラムと12章のプログラムが合体した動きだな。そしてここからが今回の本番というわけだ!
そう!じゃあ行くよ。ねえ、「弾を撃つ」プログラムって、君たちならどう書く?
ちょっと待てよ・・・まずタマをうつボタンが押されたかどうかは絶対に必要だな。
あとはカンジンのタマだ。プレイヤーのタマだから、ボタンが押されたらタマスプライトを作って、あとはそいつを上に動かせばいいんじゃねえか?
いい調子だね。これで完成率50%ってところかな。折り返し地点だね。
そんなわけねえだろう。オレのチミツな計算じゃこれでバッチリのはずだ。見てろよ。
'---てき----------------------------
'てきのかず
ECOUNT=10
'てきのざひょう
DIM EX[ECOUNT]
DIM EY[ECOUNT]
'てきのそくど
DIM EVX[ECOUNT]
DIM EVY[ECOUNT]
'てきのいどうじかん
DIM ETIME[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]
NEXT
'---プレイヤー-------------------------
'プレイヤーのざひょう
PX=200
PY=200
'プレイヤーのスプライトID
PID=10
'プレイヤーのえのばんごう
PPIC=3323
'たまのスプライトID
TID=20
'たまのえのばんごう
TPIC=3386
'プレイヤーのスプライトをつくる
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 BUTTON(1,#B_RRIGHT)==1 THEN
'たまのざひょうはプレイヤーとおなじ!
TX=PX:TY=PY
SPSET TID,TPIC
SPOFS TID,TX,TY
ENDIF
'たまをうえにうごかす
TY=TY-5
SPOFS TID,TX,TY
'---てきしょり-------------------------
FOR I=0 TO ECOUNT-1
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]
NEXT
VSYNC
ENDLOOP
おお?なんか色が付いた行があるぜ。
プログラムが長くなってきたからね、ワンパク君がいじった行だけ色を変えたよ。
いらねえ世話を焼きやがって、見やすいにもほどがあるぜ。
とにかく、われながらカンペキな出来じゃねえか?タマっぽい絵もさがしたし、タマだからスピードも速くしてやったぜ。よし、実行!
・・・あれ
エラーだ。スプライトが作られていないって。
そんなバカな、プログラムはカンペキだ!これはプチコン4のバグにまちがいねえぞ。スマイルブームめ、オレサマの仏の顔は1回かぎりだぜ、速攻カクサンして炎上・・・
ワンパク君、これはプチコン4のバグじゃないと思うなあ。こういう時はまず自分の書いたコードを確認したほうがいいよ。
そうだなあ、いきなりプログラムを書いちゃう前に、書きたい処理を普通の日本語で書いてみないかい?ワンパク君はどういう事をやろうとしたのかな?
おれのカンペキな処理を日本語で書けって事か?二度手間もいいとこじゃねえか!
ただの二度手間だったら必要ないけど、この二度手間にはいいところがあるのさ。ここにノートがあるから、ちょっと書いてみてよ!
よし
・はっしゃボタンがおされたら、タマのスプライトを作ってプレイヤーの場所にだす
・タマを上にすばやくうごかす
こういう事だ!
確かに普通の日本語で書いてるとやりたい事がすぐにわかるね!
ワンパク君、タマを上にすばやく動かすって書いてるけど、これはタマがないときはやっちゃダメなんじゃないかな?
う、そうか・・・タマをうっていないときは、タマはないのか。グギギ。
じゃあ、こんなかんじ?
・はっしゃボタンがおされたら、タマのスプライトを作ってプレイヤーの場所にだす
・タマがあったら、タマを上にすばやくうごかす
んん?なんかひっかかるな。そういやタマっていつ消えるんだ?
そうか、作った弾はいつか消さなきゃないんだね。
画面から飛び出たら消えるとかでいいんじゃねえか?
画面から飛び出るかあ・・・上に動かしてるって事は、Y座標がどんどん小さくなるんだよね?0より小さくなったら画面の外に行っちゃったって事になるのかな?
後はタマを発射する時も、もうタマ発射してたらうっちゃダメなんじゃねえか?とするとだ。
・タマがない時にかぎって、はっしゃボタンがおされたら、タマのスプライトを作ってプレイヤーの場所にだす
・タマがあったら、タマを上にすばやくうごかして、Yが0よりちいさくなったらタマをけす
やれやれ、たかがタマをうつだけでこれかよ。こんなに細かいこと考えるなんてめったにないぜ・・・
いいね!これをプログラムにしてみようよ。
タマがあったらって、どうやったらわかるんだ?
弾のスプライトがある時は1、ないときは0っていう変数を作ればいいんじゃないかな。
それだ!よし、プログラムにするぞ・・・
ん?んんん?なにぃ!?
どうしたのワンパク君?
タマがない時に限って、発射ボタンがおされたらって、どう書きゃあいいんだ?
ふたつの事をまとめてチェックするのは初めてだね。たくさんの事をまとめてチェックするのは実は難易度が高いんだけど、この場合に限っては簡単なんだ。IF文は何個でも連続して書けるんだよ。こんな感じ!
'まずたまがないことをチェック
IF TAMA==0 THEN
'つぎにボタンをチェック
IF BUTTON(1,#B_RRIGHT)==1 THEN
'たまはっしゃ!
ENDIF
ENDIF
こういうふうに、THENの中に違うIF文を書いてもかまわないんだよ。
たまはっしゃってところにまた違うIF文を書いても、さらにその中にまたIF文を書いても・・・何個書いてもOKだよ。そうするとどんどん条件を絞っていく事ができるのさ!
なるほど、わかったようなわからねえような・・・IFの中にIFがあって、さらにその中にIFがあって・・・
おい、なんかそういうのなかったか?
あれかな、人形の中に人形があってその中にも人形があるやつ!ロシアのマトリョーシカ人形だったっけ?
それそれ!
そこに気がつくとはすごいね!実はプログラムっていうのは、マトリョーシカ人形なんだ。
ハァ?またわけのわからねえ事を言いやがって。プログラムが、マ、マリョリョ・・・
いいかい?今まで出てきたIF、LOOP、FOR、他のループも同じなんだけど、これらは全部マトリョーシカ人形の1個だと思えば良いよ。
IFやループは、その中にまた違うIFやループを入れられるんだ。そしてその中にはまた違うIFやループ・・・って考えるとまさにマトリョーシカ人形だと思わないかい?このマトリョーシカみたいなプログラムの構造を入れ子構造って言うんだ。
実は今までも敵のプログラムでこの入れ子構造が出てきてるよ。LOOPの中にFOR、その中にIFってなってるのがわかるかな?こうやって入れ子の中にさらに違う処理を入れ子にして入れて行くのが、プログラムさ!そしてその入れ子の一番外側が、メインループになるんだよ。
・・・リョリョリョ・・・うう、やっと止まったぜ。つまりはだ!
プログラムが長くなっていくと、どんどんマリョリョ・・・人形の数が増えるって事だな!
そういうこと!入れ子構造はプログラミングで一番重要な考え方といって過言じゃないけど、重要さをひとことで説明するのは難しいんだ。ひとまずは、IFやループの中には好きなだけIFやループを入れられるって事を覚えおけばいいよ!
さあ、弾を打つコードだけど、IFの中にIFを書ける事がわかったから、もう書けるんじゃないかな?
もうひとつあるぜ、タマのスプライトってどうやったら消えるんだ?
おっとそうだった。SPCLRっていう命令を使うんだ。SPCLR スプライト番号で、スプライトを消す事ができるよ!
よし、書いてみるぜ・・・
'---てき----------------------------
'てきのかず
ECOUNT=10
'てきのざひょう
DIM EX[ECOUNT]
DIM EY[ECOUNT]
'てきのそくど
DIM EVX[ECOUNT]
DIM EVY[ECOUNT]
'てきのいどうじかん
DIM ETIME[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]
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
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 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]
NEXT
VSYNC
ENDLOOP
これでどうだ!
やった!
おめでとう!弾を撃てたね!
よーし、じゃあ敵を倒してやる!・・・あれ?倒れない?
それが次に解決しなきゃない問題だよ。敵を倒すためにはどうすればいいか。これは次回考えよう!
うおお、いったいどれだけプログラムを長くすりゃいいんだ!
ざっとこれの3倍書かないと完成せんじゃろうな!
ナニー!いきなりあらわれてサラッと恐ろしい事を言いやがったな、3倍だと!
よいかの?コンピューターというのは、バカ正直に命令された事しかせんのじゃよ
「いい感じに弾撃ってよ」とか「テキトーに敵出して」とか言ってもダメなんじゃ
それはまさに今回で経験したじゃろう?
それこそ手取り足取り、ああしたらこう、こうしたらああと、動いて欲しいと思った事はどんな細かい事でも全部やりかたをプログラムしてやらんとならんのじゃ。このゲームはまだ弾にも当たらないし、敵も攻撃してこないし自分も死なない、スコアもない、ないないづくしなんじゃ!それで3倍と言ったのじゃよ。
とはいえあせる事はないぞ。あせらずひとつひとつ機能を組み込んでいけば、必ず完成する!このワシが保証するわい。
そして今回やったように、プログラムに機能を追加する時はいきなりプログラムを書かずに一度やりたい事を文章で書いてみる事をおすすめするぞい。こういう、プログラムを書く前にプログラムに書きたい内容をまとめた物を仕様と言うんじゃ。
仕様を書かずにチャチャッとプログラムを書いてしまう達人プログラマもいるが、脳味噌がコンピューターになっているような達人の真似を初心者がしてはいかん!自動車の免許も持っていないのにいきなりレーシングカーに乗るようなもんじゃ。
仕様の書きかたというのも、プロの世界ではいろいろな書きかたがあるんじゃが、まずは今回のように紙のノートに普通の日本語でチャチャッと書いてみるとええ!
二度手間に思えるかもしれんが、間違ったプログラムを作ってバグで悩む時間の事を考えたら、先に普通の言葉で書いといてアラを探すほうが速いんじゃ!
書いた文章のなかでおかしな所やあいまいな所があったら、そこをきちんと考えてやらんといかんという事じゃよ。
紙のノートに書いた仕様が予習で、プログラムが授業みたいなもんなのかな?
さよう!さしずめデバッグは復習じゃろうな。
おいおまえら!数学の話といいなんでもかんでも勉強に結びつけやがって!
そういやワンパク君、この前数学の授業で先生にほめられて照れてたよね、勉強ができるようになるのもまんざらじゃないんじゃない?
ハハハ、ワンパク君もどんどんお利口さんになってもらわないとね!
ギギギ・・・