guide18

めざせ16連射(れんしゃ)

さあ、弾たまの連射れんしゃだね!今回こんかいは盛もり沢山だくさんだから、がんばってね。
フン、ロンリーエンジンのチカラもゲットしたオレサマの手てにかかればちょろいもんだぜ!
論理ろんり演算えんざんね。
今回こんかいは改造かいぞう結果けっかの仕様しようとプログラムを解説かいせつする事ことで進すすめるよ!
改造かいぞうは、2段階だんかいでやろう。まずは今いまのプログラムをもっとシンプルにするよ。ちょっと長ながくなってきたし、もともとまわりくどい書かき方かたしてるからね。
わざわざまわりくどい書かきかたしてたっていうのか。なんでそんなめんどくせえことするんだよ。
SmileBASICスマイルベーシックの便利べんりな命令めいれいを使つかうともっとカンタンに書かけたんだけど、それだと中なかでなにをやっているか良よくわからないだろう?最初さいしょに中なかでなにをやっているかを知しってもらいたかったのさ!

 '---てき----------------------------
 'てきのかず
 ECOUNT=10
 'てきのざひょう
 EX=200
 EY=60
 'てきのそくど
 DIM EVX[ECOUNT]
 DIM EVY[ECOUNT]
 'てきのいどうじかん
 DIM ETIME[ECOUNT]
 'てきスプライトIDのせんとう
 ETOP=100
 'てきのえのばんごう
 EPIC=1203
 
 'てきのスプライトをつくる
 FOR I=0 TO ECOUNT-1
  EID=ETOP+I
  SPSET EID,EPIC
  SPOFS EID,EX,EY
  SPCOL EID:'てきにあたりはんていをつける
 NEXT
 
 '---プレイヤー-------------------------
 'プレイヤーのざひょう
 PX=200
 PY=200
 'プレイヤーのスプライトID
 PID=10
 'プレイヤーのえのばんごう
 PPIC=3323
 
 'プレイヤーのスプライトをつくる
 SPSET PID,PPIC
 SPOFS PID,PX,PY
 
 '---たま--ー-------------------------
 'たまのスプライトID
 TID=20
 'たまのえのばんごう
 TPIC=3386
 
 '---メインループ-----------------------
 LOOP
  '---プレイヤーしょり----------------------
  'さゆうにうごかす
  IF BUTTON(1, #B_LLEFT) THEN PX=PX-1
  IF BUTTON(1, #B_LRIGHT) THEN PX=PX+1
  IF PX<0 THEN PX=0
  IF PX>400-16 THEN PX=400-16
  SPOFS PID,PX,PY
  'たまがないときにボタンがおされたらたまはっしゃ!
  IF !SPUSED(TID) && BUTTON(1,#B_RRIGHT) THEN
   'たまのざひょうはプレイヤーとおなじ!
   TX=PX:TY=PY
   SPSET TID,TPIC
   SPOFS TID,TX,TY
   SPCOL TID:'たまもあたるように!
   BEEP 111:'はっしゃおんもだすぜ!
  ENDIF
  'たまをうごかす
  IF SPUSED(TID) THEN
   'たまのざひょうをとりだす
   SPOFS TID OUT TX,TY
   'うえにうごかす
   TY=TY-5
   SPOFS TID,TX,TY
   'たまががめんからとびでたらたまをけす
   IF TY<0 THEN SPCLR TID
  ENDIF
 
  '---てきしょり-------------------------
  FOR I=0 TO ECOUNT-1
   EID=ETOP+I
   IF !SPUSED(EID) THEN CONTINUE:'もうきえてたらスキップ
   IF ETIME[I]==0 THEN
    'うごくほうこうをきめる
    EVX[I]=RND(3)-1
    EVY[I]=RND(3)-1
    ETIME[I]=20
   ENDIF
 
   'てきをうごかす
   ETIME[I]=ETIME[I]-1
   SPOFS EID OUT EX,EY
   EX=EX+EVX[I]
   EY=EY+EVY[I]
   SPOFS EID,EX,EY
 
   'たまにあたった?
   IF SPHITSP(TID,EID) THEN
    'あたった!
    BEEP 11:'ばくはつ!
    SPCLR EID:'てきをけす
    SPCLR TID:'たまもけす
   ENDIF
  NEXT
  VSYNC
 ENDLOOP

そんなに変かわってねえ気きがするぞ?
ぱっと見みはそうだけど、1行ぎょうずつ見みていってごらん。
変数へんすうがいくつか消きえてるぞ。EX,EY,EIDとか、TAMAとか。
見みたことのない書かき方かたもあるね。48行ぎょうでBUTTONボタン関数かんすうの後うしろの==1が消きえてたり、65行ぎょうのSPOFSエスピーオフスでOUTアウトがついてたり。
54行ぎょうのSPUSEDってのも初耳はつみみだな。なんか!がついてるしよ。ふつう!がつくのは後うしろなのに前まえについてるぞ!
76行ぎょうのCONTINUEコンティニューもはじめてだね
違ちがいはだいたいそんなもんかな、シンプル化かはもう2段階だんかいできるけど、これが第だい1弾だんになるよ。
今回こんかいのメインは、SPOFSエスピーオフスの新あたらしい使つかい方かただよ。OUTアウトってのがついてるところだね。
今いままではSPOFSエスピーオフスはスプライトの座標ざひょうを設定せっていする時ときに使つかっていたよね?OUTアウトをつけると、逆ぎゃくに今いま設定せっていされているスプライトの座標ざひょうを取得しゅとくできるんだよ。
ほほう、実じつはスプライトは自分じぶんの座標ざひょうをおぼえていて、取とり出だすこともできるってワケだな、スプライトがおぼえているモノをわざわざ変数へんすうでおぼえとく必要ひつようはないってことだ!
そういうこと!それで敵てきと弾たまの座標ざひょうを覚おぼえておく変数へんすうはいらなくなったから消きえたんだ。プレイヤーの座標ざひょうを覚おぼえているPXとPYは、消けすとかえってややこしくなっちゃうから残のこしているよ。
SPOFSエスピーオフス スプライトID OUTアウト X,Yで、XとYにスプライトの座標ざひょうが入はいるんだ。OUTアウトはこれから良よく使つかうけど、この変数へんすうに値あたいを返かえしてっていう意味いみで使つかうよ。
値あたいを返かえしてっていうと、関数かんすう?
関数かんすうに似にているけど、OUTアウトを使つかうと2個こ以上いじょうの値あたいも一度いちどに返かえせるんだ。座標ざひょうはふたつの値あたいがセットで必要ひつようだろ?
次つぎにEIDが配列はいれつじゃなくなった。これは、スプライトのIDは決きまっているから、わざわざ変数へんすうで覚おぼえておく必要ひつようはないからね。その代かわりに、敵てきスプライトIDの先頭せんとうだけ覚おぼえておいて、75行目ぎょうめ、敵処理てきしょりのFORフォーループの最初さいしょで敵てきスプライトIDを作つくっているよ。EID=EIDTOP+Iってやつだね。
次つぎにBUTTONボタン関数かんすうの後うしろの==1が消きえた理由りゆう。前回ぜんかいの論理演算ろんりえんざんの説明せつめいを覚おぼえてるかな?
正解せいかいならランプがつくってやつか?
ランプがつくってのは数字すうじだと何なんになるんだったっけ?
1だよな?
そう!そして、BUTTONボタン関数かんすうは、今いままで==1をつけて判定はんていしてたとおり、押おされたら1、押おされてなかったら0を返かえす関数かんすうなんだ。
ははあ、1を返すんだから、==1をつけてチェックするまでもないってことか!
そういうこと!これが2とか3も返かえす関数かんすうなら、==2とか==3とかで確認かくにんしなきゃいけないけど、1か0しか返かえさないからね。
押おされてたらBUTTONボタン関数かんすう自体じたいがランプをつけるってことだな。
54行目ぎょうめのSPUSEDエスピーユーズド、これは見みての通とおり関数かんすうで、指定してい番号ばんごうのスプライトが存在そんざいしているかどうかを返かえす関数かんすうだよ。スプライトがあれば1を返かえすんだ。
その前まえのついてる!はなんだよ
前回ぜんかいの論理ろんり演算えんざんでNOTノットってのを覚おぼえてるかな
正解せいかい不正解ふせいかいをひっくり返かえすってヤツだな。そうか、NOTノットは!って書くといってたな、これがそれか!
そう!普通ふつうの文章ぶんしょうにつけて、驚おどろく意味いみで使つかう時ときは文章ぶんしょうの最後さいごに!をつけるけど、プログラムで正解せいかい不正解ふせいかいをひっくり返かえす場合ばあい、!はひっくり返かえしたい式しきの最初さいしょにつけて、後うしろの式しきの正解せいかい不正解ふせいかいをひっくり返かえせというふうに使つかうんだ。!SPUSEDエスピーユーズドだとどういう意味いみになると思おもう?
スプライトがある、の反対はんたいだから、スプライトがない、っていう意味いみか!
そう!今いままではTAMA==0って書かいて、弾たまがあるかどうかをTAMA変数へんすうで見みてたよね?でも弾たまがあるかどうかは弾たまのスプライトがあるかどうかで判断はんだんできる。TAMA==0っていうのは、!SPUSEDエスピーユーズド(TID)で代用だいようできるのさ!
次つぎに76行目ぎょうめのCONTINUEコンティニュー。これはループの中なかだけで使つかえるんだ。BREAKブレークって覚おぼえてるかな?
ループを抜ぬける命令めいれいだったよね?
CONTINUEコンティニューはBREAKブレークの親戚しんせきみたいな命令めいれいで、ループを抜ぬけるんじゃなくて、CONTINUEコンティニュー以降いこうの処理しょりをスキップしてループのいちばん最後さいごにジャンプする命令めいれいだよ。
このCONTINUEコンティニューは敵てき処理しょりのループの先頭せんとうに書かいてあるね、敵てきのスプライトがなかったら次つぎの敵てきまでスキップという事ことだと言いえばわかるかな?
ここからうしろは敵てきの処理しょりがいろいろ書かいてるけど、スプライトがないならそいつらは必要ひつようないから次つぎに行いくぜってことか。
そういうこと!ここでスキップしておかないと、存在そんざいしないスプライトを動うごかそうとしてエラーになっちゃうからね。



さて、連射れんしゃ改造かいぞうの準備じゅんびは整ととのったけど、結構けっこうな改造かいぞうになるから、プログラムを書かく前まえに先さきに連射れんしゃの仕様しようを書かいておこう。




弾たまは最大さいだい10連射れんしゃできる。つまり同時どうじに10発はつまで画面がめんに出だせる
弾たまには20番ばんから29番ばんまでの10個このスプライトを使つかう
ボタンが押おされた時ときに弾用たまようスプライトを作成さくせいする事ことができれば、弾たまを撃うつ
撃うった弾たまは、敵てきと同おなじようにスプライトが存在そんざいしていたら上うえに動うごかす
敵てきとの当あたりは、弾たまスプライト全部ぜんぶと当あたったかどうかのチェックを行おこなう




こんな感かんじかな!
言いってることはわかるけどよう、どういう命令めいれいを使つかえばいいのかさっぱりわかんねえぞ!
新あたらしい命令めいれいは1個こも使つかわないんだけど、今いままで使つかってきた命令めいれいを違ちがった方法ほうほうで使つかうんだ。
さっきのSPOFSエスピーオフスにOUTアウトをつけたみたいに、SmileBASICスマイルベーシックの命令めいれいは、例たとえばスプライトを作つくる命令めいれいはSPSETエスピーセットって決きまっているんだけど、引数ひきすうの数かずや内容ないようを変かえることで、いろんな作つくり方かたができるようになっているんだよ。SPSETエスピーセットでヘルプを出だすと何なんページも出でてくるだろう?1ページが1つの使つかい方かたの説明せつめいになってて、4ページあったら4通とおりの使つかい方かたがあると思おもえばいいよ。
じゃあ、プログラムを発表はっぴょう!

 '---てき----------------------------
 'てきのかず
 ECOUNT=10
 'てきのざひょう
 EX=200
 EY=60
 'てきのそくど
 DIM EVX[ECOUNT]
 DIM EVY[ECOUNT]
 'てきのいどうじかん
 DIM ETIME[ECOUNT]
 'てきスプライトIDのせんとう
 ETOP=100
 'てきのえのばんごう
 EPIC=1203
 
 'てきのスプライトをつくる
 FOR I=0 TO ECOUNT-1
  EID=ETOP+I
  SPSET EID,EPIC
  SPOFS EID,EX,EY
  SPCOL EID:'てきにあたりはんていをつける
 NEXT
 
 '---プレイヤー-------------------------
 'プレイヤーのざひょう
 PX=200
 PY=200
 'プレイヤーのスプライトID
 PID=10
 'プレイヤーのえのばんごう
 PPIC=3323
 
 'プレイヤーのスプライトをつくる
 SPSET PID,PPIC
 SPOFS PID,PX,PY
 
 '---たま--ー-------------------------
 'たまのかず
 TCOUNT=10
 'たまのスプライトIDせんとう
 TTOP=20
 'たまのえのばんごう
 TPIC=3386
 
 '---メインループ-----------------------
 LOOP
  '---プレイヤーしょり----------------------
  'さゆうにうごかす
  IF BUTTON(1, #B_LLEFT) THEN PX=PX-1
  IF BUTTON(1, #B_LRIGHT) 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,2) THEN
   'たまスプライトをつくれたらはっしゃ
   TID=SPSET(TTOP,TTOP+TCOUNT-1,TPIC)
   IF TID>=0 THEN
    'たまスプライトつくれた
    'たまのざひょうはプレイヤーとおなじ!
    TX=PX:TY=PY
    SPOFS TID,TX,TY
    SPCOL TID:'たまもあたるように!
    BEEP 111:'はっしゃおんもだすぜ!
   ENDIF
  ENDIF
  'すべてのたまをうごかす
  FOR I=0 TO TCOUNT-1
    TID=TTOP+I
   'たまがなかったらスキップ
   IF !SPUSED(TID) THEN CONTINUE
   'たまのざひょうをとりだす
   SPOFS TID OUT TX,TY
   'うえにうごかす
   TY=TY-5
   SPOFS TID,TX,TY
   'たまががめんからとびでたらたまをけす
   IF TY<0 THEN SPCLR TID
  NEXT
 
  '---てきしょり-------------------------
  FOR I=0 TO ECOUNT-1
   EID=ETOP+I
   IF !SPUSED(EID) THEN CONTINUE:'もうきえてたらスキップ
   IF ETIME[I]==0 THEN
    'うごくほうこうをきめる
    EVX[I]=RND(3)-1
    EVY[I]=RND(3)-1
    ETIME[I]=20
   ENDIF
 
   'てきをうごかす
   ETIME[I]=ETIME[I]-1
   SPOFS EID OUT EX,EY
   EX=EX+EVX[I]
   EY=EY+EVY[I]
   SPOFS EID,EX,EY
 
   'たまにあたった?
   TID=SPHITSP(EID,TTOP,TTOP+TCOUNT-1)
   IF TID>=0 THEN
    'あたった!
    BEEP 11:'ばくはつ!
    SPCLR EID:'てきをけす
    SPCLR TID:'たまもけす
   ENDIF
  NEXT
  VSYNC
 ENDLOOP

いちだんと複雑ふくざつになったねえ・・・これはちょっと解読かいどくが難むずかしいぞ。ねえワンパク君くん?
プスプスプスプス
わ、ワンパク君くんの頭あたまから湯気ゆげが出でている!
ぜんぜんわからねえ!
あせらずに変かわった場所ばしょを1行ぎょうずつ見みていこう!
まず39行目ぎょうめからは問題もんだいないよね?敵てきの数かずと同おなじように、弾だんの数かずもTCOUNTティーカウントという変数へんすうにおぼえておくよ。弾たまのスプライトは20番ばんからのままで問題もんだいない。弾たまが10個こなら、20番ばんから29番ばんまで弾たまで使つかうことになるよ。
つぎは56行目ぎょうめから。IFイフ文ぶんの条件じょうけんがまたシンプルに戻もどったね。ここで弾たまが出だせるかどうかをカンタンに判定はんていできないから、まず発射はっしゃボタンが押おされた事ことだけ判定はんていしちゃうようにしたんだ。
おい、BUTTONボタンの引数ひきすうが1個こふえてねえか?2ってなんだよ?
ごめんごめん、今いままでにない引数ひきすうだよね。
実じつはBUTTONボタン関数かんすうは、ボタンがどういう状態じょうたいになったら1を返かえすかを3番目ばんめの引数ひきすうで指定していできるんだ。2はボタンが押おされた瞬間しゅんかんを意味いみするよ。今いままでの使つかい方かたではボタンが押おされてたらいつでも1っていう使つかい方かただったんだけど、それだとボタン押おしっぱなしで一瞬いっしゅんで弾たまを10発はつ打うち尽つくしちゃうから、押おしっぱなしで弾たまが出でないようにしてるんだ。他ほかにもボタンが離はなされた瞬間しゅんかんとかも取とれるよ。
ボタンが押おされていたらいつでも1とボタンが押おされたシュンカンだけ1のビミョーな違ちがいなんてのが関係かんけいしてくるのか!こまかすぎてメマイがするぜ・・・
普段ふだん気きにもしないような細こまかい事ことまで気きにしないと、プログラムはちゃんと動うごいてくれないのさ!じゃあ続つづけよう。
発射はっしゃボタンが押おされた後あとでSPSETエスピーセットを使つかってるけど、ここでは関数かんすうとして使つかっているよ。
引数ひきすう3個この関数かんすうとしてSPSETエスピーセットを使つかうと、第だい1引数ひきすうから第だい3引数ひきすうの間あいだのスプライト番号ばんごうで空あいてる番号ばんごうがあったら、そこに第だい3引数ひきすうの絵えでスプライトを作つくって、作つくったスプライト番号ばんごうを返かえすという関数かんすうになるんだ。空あいてる番号ばんごうがなければ-1が返かえってくるよ。
そして59行目ぎょうめのIFイフ文ぶんで、SPSETエスピーセット関数かんすうの結果けっかをチェックしているんだ。>=0ってことは、結果けっかが0以上いじょうだったらってこと。-1だとこのIFイフ文ぶんはまるまるスキップされる。
ということはスプライト作つくれた時ときだけTHENゼンを実行じっこう、作つくれなかったらスキップってことか。それで60行目ぎょうめにたまスプライトつくれたって書かいてるんだな!
そういうこと!60行目ぎょうめのコメントがなければ解読かいどくは大変たいへんなんだ。コメントが大事だいじだって事ことが良よくわかるよね。
弾たまスプライトが作つくれたら、やる事ことはいままでと同おなじだね。
もう一度いちど58行目ぎょうめのSPSETエスピーセット関数かんすうでやってる事ことをおさらいしよう。
20番ばんから29番ばんまでの間まで弾たまスプライトが作つくれるって事ことは、まだ弾たまが出だせる事ことを意味いみしているよ。スプライトを作つくれないって事ことは弾たまをもう出だせないっていう事ことさ。弾たまを出だせる出だせない、出だせるなら作つくった弾たまの番号ばんごうという2つ意味いみがTID変数へんすうに入はいっているんだ。この使つかってたらその番号ばんごう、使つかってなかったら-1という変数へんすうの使つかい方かたはとても便利べんりで良よく使つかうから覚おぼえておくといいよ!
さあ、68行目ぎょうめから、作つくった弾たまを動うごかすところ。これは敵てきとほとんど同おなじだね。FORフォーで0からTCOUNTティーカウント-1まで回まわして、調しらべるスプライトIDを作つくって、そのスプライトが存在そんざいしている時ときだけ処理しょりする。83行目ぎょうめからの敵てきの処理しょりと比くらべてみるといいよ。
ここまでは大丈夫だいじょうぶかな?
だ、だだだ、ダイジョウブだ!
・・・
よし。それじゃあラストスパートだよ!最後さいごに101行目ぎょうめからの弾たまに当あたったかどうかの判定はんてい方法ほうほうを見みてみよう。
ここではSPHITSPエスピーヒットエスピーを新あたらしい使つかい方かたで使つかっているよ。実じつはSPHITSPエスピーヒットエスピーは一度いちどに複数ふくすうのスプライトと当あたり判定はんていを調しらべる事ことができるんだ。
ここでは引数ひきすうを3つ指定していしているね。この書かき方かただと、第だい1引数ひきすうが敵てきのスプライトID、第だい2引数ひきすうが弾たまスプライトIDの先頭せんとう、第だい3引数ひきすうが弾たまスプライトIDの最後さいごさ。となると、何なにをやっていると思おもう?
今いままでは引数ひきすう2つで、敵てきのIDとタマのIDだったよな?それが3つに増ふえて、敵てき、タマ最初さいしょ、タマ最後さいごになったと。しかもさっきのSPSETエスピーセットの新あたらしい使つかい方かたとなんか似にているぜ。もしかして、タマ全部ぜんぶまとめて、敵てきと当あたってるかどうか調しらべてるのか?
正解せいかい!ここでは第だい1引数ひきすうのスプライトと、第だい2から第だい3までのスプライトとの当あたり判定はんていをまとめて調しらべて、1個こでも当あたったスプライトがあればそのIDを返かえすんだ。
つまり、敵てきと弾全部たまぜんぶを一度いちどに調しらべて、敵てきに当あたった弾たまが1個こでもあればそれを返かえすという事ことをやってくれるよ。ちなみに1個こも当あたってなければ-1を返かえすんだ。また-1が出でてきたね。
102行目ぎょうめのIFイフも見みおぼえあるぜ。ここでは-1なら弾たまに当あたってない。それ以外いがいなら、当あたった弾たまのスプライトIDが入はいっているってことだな!
そういうこと!ちなみにこのSPHITSPエスピーヒットエスピーでは、スプライトがなかった場合ばあいは勝手かってにスキップしてくれるんだ。だから弾たまがなかったらとか調しらべる必要ひつようもないのさ。便利べんりだろう?
すげえなSPHITSPエスピーヒットエスピー!これ1個こでほとんどの仕事しごとが済すんじまうじゃねえか!
SmileBASICスマイルベーシックには、こういうゲームを作つくるのに便利べんりな命令めいれいや関数かんすうがいろいろ入はいってるんだよ。まだまだこんなものじゃないけど、それはじょじょに説明せつめいしていくね。
さあ最後さいご。当あたった弾たまがあるなら、後あとは前まえと同おなじ。敵てきを消けして、弾たまを消けして、音おとを出だす!じゃあ動うごかしてみよう!








おおお!オレの求もとめていた物ものはこれだぜ!アットウテキな連射れんしゃで敵てきをなぎ倒たおす!
すごいね!弾たまだけは売うってるゲームみたいだ!
どうだい?今回こんかいはプログラムを書かいてもらわなかったけど、キミたちだけでもできそうかな?
お前まえの話はなしを聞きいてるとなんてことないように聞きこえるが、なんだかごまかされてる気きもするぜ・・・
ボクもインテリ君くんの解説かいせつ聞ききながらプログラムを見みている分ぶんにはわかった気きになってるけど、自力じりきでこのプログラム書かけるかって言いわれるとむずかしい気きがするよ。
そりゃいきなりこのプログラムを書かけたら天才てんさいじゃ!
ハカセ!
今いまおまえさんたちにやってもらいたい事ことは、いきなりこのプログラムを書かけるようになる事ことではないんじゃよ。1行ぎょうずつ何なにをしているか理解りかいして、あとで自分じぶんでプログラムを書かく時ときに「あ、これのやり方かたは見みた事ことがあるぞ!」と思おもい出だしてくれればええんじゃ。そうやって何なにかをするプログラムのかけらを覚おぼえて行いく事ことを、引ひき出だしを増ふやすとも言いうのう。引ひき出だしの多おおさイコール、プログラマーのレベルだと思おもってええ!
キミたちはもうプログラムの基本きほんは学まなび終おえてるから、ハカセの言いうとおり、ここから先さきは頭あたまの中なかにたくさん引ひき出だしを作つくっていく事ことで初心者しょしんしゃから中級者ちゅうきゅうしゃにレベルアップするんだよ。そのためにも、いろんなプログラムを読よむことが大切たいせつさ!
一流いちりゅうのミュージシャンになるには音楽おんがくをいっぱい聞きかなきゃないのと同おなじか・・・
そういうことじゃ!



それにしても、最初さいしょのプログラムと2番目ばんめのプログラムって、改あらためて見みるとあまり変かわっていないんだね。すごく変かわったように思おもったのに。
それはインテリ君くんのプログラムが良よくできてるからじゃよ。良よいプログラムは変更へんこうに強つよいんじゃ!
お前まえさんたち、良よいプログラムの条件じょうけんはなんじゃと思おもう?
そりゃあ、すごいことができるとか、メチャクチャ速はやいとか、すげーでかいとか、そんなんだろう!
それはすごいプログラムじゃのう。じゃが、すごいプログラムが良よいプログラムとは言いえんのじゃよ。
良よいプログラムの条件じょうけん、それは、シンプルにわかりやすく書かいていること、変更へんこうがカンタンにできるようになっていること。それだけじゃ!
まずシンプルでわかりやすいこと。ものすごい超絶ちょうぜつテクニックを使つかってものすごい事ことができたとしても、誰だれにも理解りかいできずデバッグすらままならないようでは何なんの意味いみもない!それにこういうプログラミングことわざもあるぞい。3ヶ月後かげつごの自分じぶんは他人たにん。今日きょう自分じぶんで書かいたプログラムも、3ヶ月後かげつごに見みたらまるで他人たにんが書かいたように何なにを書かいているのかさっぱりわからん、という意味いみじゃ。わかりやすく書かいておく事ことは、他人たにんにとっても将来しょうらいの自分じぶんにとっても役やくに立たつという事ことじゃな。
そして変更へんこうがカンタン。今回こんかいも弾たまを単発たんぱつから10連射れんしゃにしただけであまり変かわっていないじゃろ?これはインテリ君くんが最初さいしょからいじりやすいようなプログラムにしといたからじゃな。ヘタクソなプログラムだと、変更へんこうする事ことなんぞこれっぽっちも考かんがえておらんから、わかりづらくなるわ、バグはいっぱい出でるわ、大騒おおさわぎになるんじゃよ。例たとえば「弾たまなんてTIDとかいう変数へんすうじゃなくて20って書かいとけばいいや!」なんて書かいてて、そこから連射れんしゃさせようと思おもったらどうなるか考かんがえてみるとええぞい。
とはいえ、変更へんこうがカンタンにできるようなプログラムを書かくというのは、実じつは最高さいこうに難易度なんいどが高たかい!いろんな引ひき出だしを増ふやして、いろんな経験けいけんを積つんだ末まつにたどりつく達人たつじんプログラマーの境地きょうちが必要ひつようじゃ。
まあ、どっちもいきなりはムリじゃから、プログラムを書かいている時ときにこれはわかりやすい書かき方かただろうか?、ここの仕様しようが変かわったらどうなるだろう?と時々見直ときどきみなおしてみるクセをつけてみるとええぞい。そして人ひとのプログラムを見みて、わかりやすいなあとか、改造かいぞうしやすいなあとかいうのがあれば、そのやり方かたをマネしたりして引ひき出だしに追加ついかしておくんじゃ。良よいな?
なんてジミでめんどくせえんだ!プログラムはもっとバババッと派手はでに作つくるもんだと思おもってたぜ!
ミュージシャンだって派手はでなパフォーマンスの陰かげではジミな練習れんしゅうをコツコツしとるんじゃないかのう。
チッ、反論はんろんできねえ・・・
ダイタイミュージシャン志望しぼうなのに、ちゃんと楽器がっきや歌うたの練習れんしゅうしてるんですかネートサカ頭あたま!
なんだと!オレサマの神かみのリフを聞きいたことねえだろう!失神しっしんするぜ!
ヒー、ひどすぎて失神しっしんしそうデスヨ。
ムキー、やいダミー、ちょっと待まってろ!ギター取とってくるぜ!
(ボクもワンパク君くんがギター弾ひいてるところ見みたことないんだけど)



{{今回:こんかい}:こんかい}のポイント

命令・関数のバリエーション

同おなじ命令めいれい・関数かんすうでも、引数ひきすうの数かずや呼よび出だし方かたの違ちがいによって、いろいろな使つかい方かたができる場合ばあいがあります。
例たとえばSPSETエスピーセットは「スプライトを作つくる」命令めいれいですが、作つくり方かたが何種類なんしゅるいもある、という意味いみです。
またSPOFSエスピーオフスのように「座標ざひょうを設定せっていする」以外いがいに「座標ざひょうを取得しゅとくする」機能きのうを持もっているというように、何なにかを設定せっていする命令めいれいはたいていの場合ばあい設定せっていした値あたいを取得しゅとくする事ことができます。
ヘルプでは使つかい方かた別べつにページが分わかれていますので、自分じぶんの望のぞむような使つかい方かたがないかどうか探さがしてみると良よいでしょう。

OUTキーワードについて

値あたいを設定せっていする命令めいれいの多おおくは、OUTアウトキーワードをつけることで逆ぎゃくに設定せっていした値あたいを取得しゅとくする事ことができます。じょうずに使つかうと変数へんすうに値あたいを覚おぼえておく必要ひつようがなくなります。

BUTTON関数のバリエーション

BUTTONボタン関数かんすうは第だい3引数ひきすうを追加ついかすることで「ボタンが押おされていたらいつでも」、「ボタンが押おされた瞬間しゅんかん」、「ボタンが離はなされた瞬間しゅんかん」をチェックする事ことができます。ボタンが押おされた瞬間しゅんかんはさらに2種類しゅるいに分わかれていて、BREPEATビーリピートという\0命令めいれいで設定せっていする速度そくどで自動じどうでボタンを連打れんだする機能きのうを使つかう・使つかわないが選えらべます。BUTTONボタンとBREPEATビーリピートのヘルプを見みてみましょう。ちなみに今回使こんかいつかった2番ばんはボタンが押おされた瞬間しゅんかん、BREPEATビーリピートの自動連打設定じどうれんだせっていは無視むしという番号ばんごうになります。

SPSETのバリエーション

SPSETエスピーセット命令めいれいは関数かんすうとして使つかうと、空あいているスプライトIDを探さがしてそこにスプライトを作つくり、作つくったスプライトのIDを返かえすという使つかい方かたができます。この使つかい方かただと、別べつの変数へんすうや配列はいれつでスプライトが作つくられているかどうかを管理かんりする必要ひつようがなくなります。関数かんすうとして使つかう場合ばあいにも引数ひきすうによってさらにこまかく機能きのうが変かわるので、ヘルプを見みてみて下ください。
なおSPSETエスピーセット命令めいれいを関数かんすうとして使つかう場合ばあい、使つかい終おわったスプライトは必かならずSPCLRエスピークリアで消けす必要ひつようがあります。SPCLRエスピークリアを使用しようしないとそのスプライトはゴミとしてどんどんたまっていき、最終的さいしゅうてきには新あたらしいスプライトを作つくれなくなりますので注意ちゅういして下ください。

SPHITSPのバリエーション

SPHITSPエスピーヒットエスピー関数かんすうは、スプライト2個この間あいだで当あたり判定はんていをチェックする以外いがいに、あるスプライトと、指定していした範囲はんいの複数ふくすうスプライトとの間あいだでまとめて当あたり判定はんていをチェックし、当あたったスプライトのIDを返かえすという使つかい方かたもできます。この場合ばあい、SPCLRエスピークリアで消けしたスプライトは自動的じどうてきにスキップされ、1個こも当あたっていない場合ばあいは-1が返かえるので、全まったく当あたっていない事ことも同時どうじにチェックできます。

SPUSED関数

SPUSEDエスピーユーズド関数かんすうを使つかうと、指定していしたスプライトIDのスプライトが作つくられているかどうかを確認かくにんする事ことができます。

CONTINUE

ループの中なかでCONTINUEコンティニュー命令めいれいを使つかうと、以降いこうのループ内ないの処理しょりをすべてスキップして、LOOPループならENDLOOPエンドループ、FORフォーならNEXTネクストまでジャンプします。

サンプルプログラムの公開キー

4Q4AD3EY3



まだ帰かえってきませんネー。しょうがないから問題もんだい出だしちゃいマショウ。あとの方ほうのプログラムを使つかいマスよ。
その1:ムカシのゲームの名人めいじんは弾たまを1秒間びょうあいだに16連射れんしゃできたソウですよ!今いまは10個こまでしか弾たまを出だせマセンが16個出こだせるようにしてムカシの名人めいじんにチャレンジしてみまショウ!
その2:56行目ぎょうめのBUTTONボタン関数かんすうのサイゴの引数ひきすうは今いま2ですネ!これとっぱらったらおかしくなるヨってインテリさん言いってたけど、実際じっさいにやってミマショウ!なにごとも実際じっさいに試ためしてミルのが大事だいじデスヨ。とっぱらう以外いがいに3とかにしてみてもオモシロイよ。
ワシにも問題もんだい出ださせろー!
チッ、しょうがないデスネ。1問もんだけデスヨ。
あー良よかった。では・・・
その3:上級じょうきゅう問題もんだいじゃ!72行目ぎょうめで弾たまがなかったらCONTINUEコンティニューでスキップしとるのう。これはCONTINUEコンティニューを使つかわない書かき方かたにできるかの?ヒントは弾たまがなかったらスキップではなく弾たまがあったらこれこれをするというふうに書かき換かえるんじゃ。そんなのお茶ちゃの子こさいさいだぜというキミは85行目ぎょうめのCONTINUEコンティニューも使つかわない書かき方かたにチャレンジしてみてくれい。85行目ぎょうめのほうはさらに難むずかしいぞい!そして、どちらか一方いっぽうでもうまく書かき換かえられたら、CONTINUEコンティニューを使つかった場合ばあいと使つかわない場合ばあいどっちがわかりやすいか考かんがえてみるとええぞい。一般的いっぱんてきに、IFイフ文ぶんのTHENゼンの中味なかみはあまり長ながすぎるとIFイフ文ぶんの中なかなのか外そとなのかこんがらかってくるので、短みじかくしとく方ほうがいいんじゃ。それでインテリ君くんはCONTINUEコンティニューを使つかったんじゃのう。
ハァ、ハァ、戻もどってきたぞ!オレの魂たましいの叫さけびを聞きけー!ギャギャーン
ギャー
うッ
・・・
うゲゲ。Divide by zero in 0:1999。

guide18.txt · Last modified: 2019/11/08 15:00 (external edit)

Page Tools