15:アツい弾(たま)をうて!

さあ、プレイヤーキャラをそう!
おう・・・
あれ、今回こんかいはテンションひくいね。
このまえったけどよう、12しょうのアレをくっつけるんだろう?結果けっかのソウゾウがつくからつまんねえよなあ・・・
もちろんそれだけじゃなくて、今回こんかいたますところまでつくろうかとおもうんだ。
ガタッ
いきなりかおあかるくなったね。
さっそくやろうぜインテリ先生せんせいよう!
まずは12しょう参考さんこうに、左右さゆううごくプレイヤーをくっつけるよ。イチゴが不評ふひょうだからもっとシューティングっぽいキャラにしよう。
そういやこのまえてきキャラにいきなり1203ばんとかいてたけどよ、おまえどうやってキャラをさがしてるんだよ。まさか1203かいキャラをしつづけたのか?
ハハ、まさかそんなことはしないよ。プチコン4にはちゃんと便利べんりなツールがついてるんだ。
プチコン4にはまれているおと・BGM・スプライトの確認かくにんできるツールがはいっているんだよ。
チッ、キャラをしつづけたならすげえ根性こんじょうだとおもったのによ。
せっかくコンピューターを使つかってるんだから、こういうことはスマートにやらないとね。
うぉぉなんだそのおりこうさんなセリフは!全身ぜんしんにムシズがはしるぜ!
ワンパクくんだってラクなほうがいいだろう?スマートってのはラクってこと
くっそー、反論はんろんできねえ・・・そりゃあラクなほうがいいにまってるじゃねえか・・・
じゃあツールのしかたから説明せつめいするね。ソフトキーボードZLZRボタンをしながら、スマイルツール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ばいったのじゃよ。
とはいえあせることはないぞ。あせらずひとつひとつ機能きのうんでいけば、かなら完成かんせいする!このワシが保証ほしょうするわい。
そして今回こんかいやったように、プログラムに機能きのう追加ついかするときいきなりプログラムをかずに一度いちどやりたいこと文章ぶんしょういてみることをおすすめするぞい。こういう、プログラムをまえにプログラムにきたい内容ないようをまとめたもの仕様しよううんじゃ。
仕様しようかずにチャチャッとプログラムをいてしまう達人たつじんプログラマもいるが、脳味噌のうみそがコンピューターになっているような達人たつじん真似まね初心者しょしんしゃがしてはいかん!自動車じどうしゃ免許めんきょっていないのにいきなりレーシングカーにるようなもんじゃ。
仕様しようきかたというのも、プロの世界せかいではいろいろなきかたがあるんじゃが、まずは今回こんかいのようにかみのノートに普通ふつう日本語にほんごでチャチャッといてみるとええ!
二度手間にどでまおもえるかもしれんが、間違まちがったプログラムをつくってバグでなや時間じかんことかんがえたら、さき普通ふつう言葉ことばいといてアラをさがすほうがはやいんじゃ!
いた文章ぶんしょうのなかでおかしなところやあいまいなところがあったら、そこをきちんとかんがえてやらんといかんということじゃよ。
かみのノートにいた仕様しよう予習よしゅうで、プログラムが授業じゅぎょうみたいなもんなのかな?
さよう!さしずめデバッグは復習ふくしゅうじゃろうな。
おいおまえら!数学すうがくはなしといいなんでもかんでも勉強べんきょうむすびつけやがって!
そういやワンパクくん、このまえ数学すうがく授業じゅぎょう先生せんせいにほめられてれてたよね、勉強べんきょうができるようになるのもまんざらじゃないんじゃない?
ハハハ、ワンパクくんもどんどんお利口りこうさんになってもらわないとね!
ギギギ・・・



今回のポイント

入れ子構造

IFイフぶんTHENゼンENDIFエンドイフLOOPループENDLOOPエンドループFORフォーNEXTネクストのそれぞれのなかには、通常つうじょう命令めいれいだけでなく、ちがIFイフ,LOOPループ,FORフォーぶんなどをいくつでもかさねてことができます。このような構造こうぞうこと構造こうぞうびます。ながいプログラムをとき大雑把おおざっぱ場合分ばあいわけやループのなかこまかい条件じょうけんけやループ、そのなかにさらにこまかい条件じょうけんけやループ・・・という構造こうぞう意識いしきしてくと、わかりやすいプログラムになって後々のちのちのデバッグや改造かいぞうらくになります。

仕様を書く

プログラムを場合ばあい、いきなりプログラミング言語げんごでプログラムをまえに、プログラムできたい内容ないよう普通ふつう日本語にほんごいてみましょう。普通ふつう日本語にほんごいた時点じてんであいまいな部分ぶぶんあきらかにおかしな部分ぶぶんがあれば、プログラムしたとき絶対ぜったいこま部分ぶぶんです。そういった部分ぶぶんをプログラムするまえ整理せいりしておくと、プログラムもきやすいですし、いたプログラムも綺麗きれいことができます。

SPCLR

SPSETエスピーセット命令めいれい作成さくせいしたスプライトをすにはSPCLRエスピークリア命令めいれい使つかいます。SPCLRエスピークリア スプライト番号ばんごう指定していした番号ばんごうのスプライトがえます作成さくせいしていないスプライトをそうとするとエラーになるので注意ちゅういしてください。

サンプルプログラムの{公開:こうかい}キー

4NKEK43ES



さてダミーがしゃべりださんうちに今回こんかいのオマケ問題もんだいじゃ!
その1:キミならプレイヤーやたまはなんにするかのう?SMILETOOLスマイルツールたまにしたいさがして、をそれでえてみるのじゃ!プログラムで3323といてあるところがプレイヤー、3386といてあるところがたまじゃ。さがしてえればええぞ!
その2:いまたまったらまっすぐうえんでくだけじゃが、プレイヤーがひだりうごいたらひだりみぎうごいたらみぎというふうにしてさき誘導ゆうどうできるようにするにはどうすればいいじゃろうな?ここはノーヒントでがんばってみてくれい!
その3:上級じょうきゅう問題もんだいじゃ。最後さいごのプログラムでやっていることかみのノートに日本語にほんごいてみるのじゃ!つまりプログラムからぎゃく仕様しよう調しらべるということじゃな。これは解析かいせきって、これがラクにできるようになると他人たにんのプログラムを調しらべるのにとてもやくつぞい
ワレをんダカ、ワレー?
ギャー、退散たいさん退散たいさん・・・