いよいよサンプルプログラム7、この講座ではこれが最後のサンプルです。
サンプルプログラム5や6はやってませんけど……。
うーん、エピソード1~3を飛ばしてエピソード4からストーリーが始まる的な?
いや、そういうものでもないですね。
サンプル5と6は、「グラフィック面」や「BG面」といった、これまでとはだいぶ違うものの話になるので、この講座ではいったんおいておきます。
新しくおぼえる命令がドーンと出てくるので、そういうのって思わずくじけちゃいそうじゃないですか。
それよりは先にスパッとアクションゲームを作ってしまいましょう。
そうです、そういえばサンプルプログラム7はゲームです。それもアクションゲームです。
いよいよって感じですね。
だいたいは、これまでにおぼえたことの組み合わせで、できるようになっています。
と言っても、応用そしてまた応用なのはたしかなので、何回にもわけてじっくりやっていくことにしましょう。
どんなゲームなのか、とりあえず見てみましょう。
いよいよクライマックスというカンジじゃのう。これは今のショクンにピッタリのサンプルプログラムじゃろう。
- LOAD”SYS/EX7ALIEN”
- OK
- RUN
自機を左右に動かしながら、上からせまる敵をショットで打つゲームだね。
十字ボタン左右で移動。Aボタンでショットなんだね。
いや……ちょっと待て、コレおかしいぞ! どうやっても負けにならねーじゃねェか!
じゃから、タイトルが「侵略者 (しんりゃくしゃ) もどき」となっとるじゃろ。カレらは、最後までシンリャクできなかったのじゃよ。カナしい話じゃな。
いやそうじゃねェだろ! ナンのための残機ヒョウジだよ! だいたい敵をゼンブ倒しても特にナニも起きねー!
ウム……、コレはそもそもユーザーショクンのチカラで、未完成のプログラムを完成させようというシュシなのじゃ……が……ちょっとムリがあったじゃろうか。
まあ、そういうコトなら……いいの……かな?
そういうことにしておこうよ。今のところ気になるポイントは、
・敵にせめ込まれてもダメージがない
・敵をゼンブ倒しても終わらない
この2つかな?
・敵のスピードが速い
ってのもモンダイだぜ。
・自機のスピードが速すぎる
のもやっぱりやりづらいよね。
ワシが言うのもなんじゃが、テキカクなシテキじゃな。
ホカにもプラスアルファのためにいくつか変数をしこんでおるんじゃが……
それはイイや、コレ以上ふやすとタイヘンそうだしな!
ワシが言うコトでないかもしれんが、テキカクじゃのう……。
プログラムを改造するには、まずプログラムをリカイした方がいいよね。せっかく総まとめのプログラムなんだから、イチから自分で作るつもりでやってみようか!
- NEW
- OK
カンタンそうに言うなあ……。
ムズカシく見えても、だいたいはこれまでのおさらいでデキるプログラムだよ。
たとえば、プログラムのサイショに何をすればいいのかはもうわかるよね。
そこはイマまでのサンプルと同じパターンでイケるだろうな。
- ’┌────────────┐
- ’│ EXAMPLE7 │
- ’│ しんりやくしゃもどき │
- ’└────────────┘
- XSCREEN 0
- VISIBLE 1,1,1,1
- CLS
- COLOR 15
だいたいこんなモンか。本当はこのアトにDIM命令がくるんだろうが……。
- DIM ???
配列変数のヨテイが立ってないから、トクに思いつかねェぜ!
そのあたりは後で出てくるだろうから、今はまだいいかな。 REMの’を行のはじめに入れて、メモとして残しておこうか。
- ’DIM ???
いわゆる「コメントアウト」じゃな。プログラムを組みながらなら、こういうコメントの使い方もユウコウじゃぞ。
ウーム……とりあえずプレイヤー機を出してはみたが……
- ’−−−
- LOCATE 10,21:PRINT”Г”;
- LOCATE 0,22
- PRINT”─”*50;
サンプルプログラム1のころにおぼえたコトだね。
このプレイヤーを動かすプログラムがいるだろうね。いまのうちにメインループを作っておこう。
- ’−−−
- @LOOP
- GOSUB @MYSHIP
- GOTO @LOOP
このラベル@MYSHIP(自機)で、プレイヤーを動かすサブルーチンを作るんだね。
サンプル3の方法で左右に動かすなら、こんなカンジだろ?
- ’−−− じぶん
- @MYSHIP
- B=BUTTON()
- IF B AND 4 THEN ???
- IF B AND 8 THEN ???
- RETURN
だが、わからねえ! このIF文をどうすりゃ、プレイヤーが動くんだ?
そういえば、まだキャラクターが動くタイプのプログラムはやったことがなかったね。少しじっくり作ってみようか。
- LOCATE 10,21:PRINT”Г”;
まずはこの行に注目かな。
イチバンはじめのトコロじゃねェか! オレのヤリ方にモンクでもあるってのかよ!
このLOCATEの数字を変えると、プレイヤー機のバショも変わるのはなんとなくイメージできるかな?
まあ、それくらいなら。
たとえばLOCATE 11,21:PRINT”Г”;と書けばもう1文字ぶん右に行くよね。
ソレと押されたボタンを組み合わせるのか……ツマリ、BUTTON()が押されたらLOCATEの数字を変える……? しかしLOCATEの数字を変えるには……
あ、変数を使うんだ!
! ……「数」が「変」わるから「変数」。そういうコトか……!
そうマチガってるワケでもないかな。数字がたびたび変わるようなトコロは、変数で作っておくとベンリだね。
ということは、この行も……?
- LOCATE 10,21:PRINT”Г”;
こんな感じがいいんじゃないかな。
- PX=10:PY=21
- LOCATE PX,PY:PRINT”Г”;
変数の名前に使ったPはプレイヤーのP。XとYはヨコ方向・タテ方向のイミだよ。
数学で「座標」のヨコ方向に「x」、タテ方向に「y」を使うコトがモトモトのイミかのう。コンピューターのセカイでもヨコといえばX、タテといえばY、というコトが多いのじゃ。
リクツはワカッてきたぜ。ボタンのあたりは、こうすりゃイイんだな?
- ’−−− じぶん
- @MYSHIP
- B=BUTTON()
- IF B AND 4 THEN PX=PX−1
- IF B AND 8 THEN PX=PX+1
- LOCATE PX,PY:PRINT”Г”;
- RETURN
左ボタンを押せばPXから1引いて、右ボタンを押せばPXに1足すってワケだ。そのアトにLOCATEしてPRINTすればバッチリだぜ!
さて、どうかのう? ためしにRUNしてみるかの。
ウ、ウォオー! ナンだコリャアー!
アイデアはまちがってなかったけど、いくつかダイジなところが抜けていたね。
まず、B=BUTTON()から戻ってくるまでのループが早すぎるってこと。ボタンをチョンと押しただけで、ものすごいスピードで何度も押したことになってるんだな。
そういえばサンプルプログラム3でも、そんなコトがあったね。
となると、思い出すこともあるんじゃないかな?
- @LOOP
- GOSUB @MYSHIP
- VSYNC 1
- GOTO @LOOP
メインループの中にVSYNC命令をふやしたよ。
60分の1秒だけプログラムの動きを止めるんだったね。早すぎるループをわざと遅らせるのはワカるけど……60分の1秒って、そんなあっと言う間でいいの?
そのくらいでも、アクションゲームならイガイとちょうど良かったりするんだよ。ものたりなければ、増やせばすむコトだしね。
ナルホドな。とにかくモンダイはカイケツだぜ。RUN!
カイケツしきってねェー!
+ | ここまでのプログラムリストを表示 |
|
ナニがおきておるのか、20行目をVSYNC 20ぐらいに変えて見るとハッキリするじゃろう。
こういう「重し」をかけるのは、テストにはユウコウじゃぞい。
な……ナンとなくはワカッたな。ヨコに動かすと、プレイヤー機が分身するみたいに増えていっちまうんだ。
いちど画面にPRINTした字は、消さなきゃずっとそこに残っちゃうのさ。
言われてみれば当たり前だけど……じゃあどうやって消せばいいの?
それはカンタンさ。” ”つまりスペースを同じ場所にPRINTすれば、Гはなくなるってワケだね。
消すっつーか、上書きするっつーか、だな。
このプログラムだと、モトの場所にスペースを書けばイイんだから……ン? ブツブツ……ボタンが押されたらもうPXを変えてるワケで……モトの場所を消さないとイケねェんだけど、ボタンを押してないのに消したらマズいワケで……
イマイチわかんねェぞ!
これは、もっとプログラムを書き足さないといけないね。
- ’−−− じぶん
- @MYSHIP
- B=BUTTON():VX=0
- IF B AND 4 THEN VX=−1
- IF B AND 8 THEN VX=1
- LOCATE PX,PY:PRINT” ”;
- PX=PX+VX
- LOCATE PX,PY:PRINT”Г”;
- RETURN
わかるかな? クッションになる変数VXを新しく作ったよ。
ええと、ふだん変数VXは0で、ボタンを押したときだけ−1か1になるんだね。
変数PXはまだ変わってねェから、まずスペースで消して……あらためてPXにVXを合わせてからLOCATEしなおしてГをPRINTするってワケか!
ワレながら、英語の多いコトバをしゃべっちまったぜ!
英語ついでに言うと、変数VXの「V」は「動く方向と量」という意味の「ベクター」のコトじゃな。プログラムではよく使われるコトバじゃが、広義のベクトルと違って……
ちょ、ちょっと待って! センモン的なハナシはいいんじゃないかな。
それより、ボタンが押されてない時にもいったんスペースで消して、同じ場所にもういちどГを書いているよね。これはいいの?
RUNしてみるとわかるけど、すごいスピードで消しては書いてるから、そう気にはならないね。 でも、それがベストかというとビミョウかな。こう書くのが正しいのかもね。
- ’−−− じぶん
- @MYSHIP
- B=BUTTON():VX=0
- IF B AND 4 THEN VX=−1
- IF B AND 8 THEN VX=1
- IF VX==0 THEN @NOTMOVE
- LOCATE PX,PY:PRINT” ”;
- PX=PX+VX
- LOCATE PX,PY:PRINT”Г”;
- ’−−−
- @NOTMOVE
- RETURN
ボタンが押されていないときは、イッキにラベル@NOTMOVE(動かない)まで飛んで、プレイヤー機をPRINTし直さないことにしたよ。
コレで動きはバッチリってコトだな。RUNしてみるゼ!
チ、チキショー!
画面のハジまで動かしたら、エラーになっちまったぜ!
このOut of range (アウト・オブ・レンジ) エラーというのは、命令にわたした数値が範囲からはずれてしまった、というエラーだね。
それは、変数PXが画面を飛びこしちゃったのがゲンインかな?
PXが0のときに−1しちゃったり、PXが49のときに+1しちゃったり、だね。
テメーら、もっとわかりやすいコトバでしゃべりヤガレー! 画面のハジまで行ったら、それよりムコウに動かさないようにすればいいだけじゃねえか!
これはワンパク君の言うとおりだね。ГをPRINTする前に、IF文を2行用意しておこうか。
- PX=PX+VX
- IF PX<0 THEN PX=0
- IF PX>49 THEN PX=49
- LOCATE PX,PY:PRINT”Г”;
これでプレイヤーの動きはモンダイなくなったね。
コレはコレで、動いてねェプレイヤー機を消しては書いちまってるが……、モトのサンプルプログラムがこうだからシカタねェのか?
し、しもうたァ━━ッ!
ま、まあそのあたりはコンゴのカダイとして……。
いったん、ココまでのプログラムをまとめておこう。
どういうイミなのか考えながらジッサイに打ち込んでみると、もっとよくワカると思うよ! モニタの前のみんなもやってみてね!
+ | プログラムリストを表示 |
|
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.382 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:04 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30