プチコン3号&BIGまとめWiki

プチコン3号&BIG 非公式初心者講座 : 第13章 サンプルプログラム7 (その1)

パンくずリスト

プログラマーからひとこと

いよいよサンプルプログラム7、この講座ではこれが最後のサンプルです。
サンプルプログラム5や6はやってませんけど……。
うーん、エピソード1〜3を飛ばしてエピソード4からストーリーが始まる的な?
いや、そういうものでもないですね。

サンプル5と6は、「グラフィック面」や「BG面」といった、これまでとはだいぶ違うものの話になるので、この講座ではいったんおいておきます。
新しくおぼえる命令がドーンと出てくるので、そういうのって思わずくじけちゃいそうじゃないですか。

それよりは先にスパッとアクションゲームを作ってしまいましょう。
そうです、そういえばサンプルプログラム7はゲームです。それもアクションゲームです。
いよいよって感じですね。
だいたいは、これまでにおぼえたことの組み合わせで、できるようになっています。

と言っても、応用そしてまた応用なのはたしかなので、何回にもわけてじっくりやっていくことにしましょう。
どんなゲームなのか、とりあえず見てみましょう。

サンプルを遊んでみよう

ハカセ

いよいよクライマックスというカンジじゃのう。これは今のショクンにピッタリのサンプルプログラムじゃろう。

  1. LOAD”SYS/EX7ALIEN”
  2. OK
  3. RUN
screenshot_sample7.jpg
インテリくん

自機を左右に動かしながら、上からせまる敵をショットで打つゲームだね。

神崎

十字ボタン左右で移動。Aボタンでショットなんだね。

ワンパクくん

いや……ちょっと待て、コレおかしいぞ! どうやっても負けにならねーじゃねェか!

ハカセ

じゃから、タイトルが「侵略者 (しんりゃくしゃ) もどき」となっとるじゃろ。カレらは、最後までシンリャクできなかったのじゃよ。カナしい話じゃな。

ワンパクくん

いやそうじゃねェだろ! ナンのための残機ヒョウジだよ! だいたい敵をゼンブ倒しても特にナニも起きねー!

ハカセ

ウム……、コレはそもそもユーザーショクンのチカラで、未完成のプログラムを完成させようというシュシなのじゃ……が……ちょっとムリがあったじゃろうか。

神崎

まあ、そういうコトなら……いいの……かな?

インテリくん

そういうことにしておこうよ。今のところ気になるポイントは、
・敵にせめ込まれてもダメージがない
・敵をゼンブ倒しても終わらない
この2つかな?

ワンパクくん

・敵のスピードが速い
ってのもモンダイだぜ。

神崎

・自機のスピードが速すぎる
のもやっぱりやりづらいよね。

ハカセ

ワシが言うのもなんじゃが、テキカクなシテキじゃな。
ホカにもプラスアルファのためにいくつか変数をしこんでおるんじゃが……

ワンパクくん

それはイイや、コレ以上ふやすとタイヘンそうだしな!

ハカセ(泣)

ワシが言うコトでないかもしれんが、テキカクじゃのう……。

再現をはじめてみよう

インテリくん

プログラムを改造するには、まずプログラムをリカイした方がいいよね。せっかく総まとめのプログラムなんだから、イチから自分で作るつもりでやってみようか!

  1. NEW
  2. OK
神崎

カンタンそうに言うなあ……。

インテリくん

ムズカシく見えても、だいたいはこれまでのおさらいでデキるプログラムだよ。
たとえば、プログラムのサイショに何をすればいいのかはもうわかるよね。

ワンパクくん

そこはイマまでのサンプルと同じパターンでイケるだろうな。

  1. ’┌────────────┐
  2. ’│ EXAMPLE7   │
  3. ’│ しんりやくしゃもどき │
  4. ’└────────────┘
  5. XSCREEN 0
  6. VISIBLE 1,1,1,1
  7. CLS
  8. COLOR 15

だいたいこんなモンか。本当はこのアトにDIM命令がくるんだろうが……。

  1. DIM ???

配列変数のヨテイが立ってないから、トクに思いつかねェぜ!

インテリくん

そのあたりは後で出てくるだろうから、今はまだいいかな。 REMのを行のはじめに入れて、メモとして残しておこうか。

  1. ’DIM ???
ハカセ

いわゆる「コメントアウト」じゃな。プログラムを組みながらなら、こういうコメントの使い方もユウコウじゃぞ。

動かしてみよう

ワンパクくん

ウーム……とりあえずプレイヤー機を出してはみたが……

  1. ’−−−
  2. LOCATE 10,21:PRINT”Г”;
  3. LOCATE 0,22
  4. PRINT”─”*50;
神崎

サンプルプログラム1のころにおぼえたコトだね。

インテリくん

このプレイヤーを動かすプログラムがいるだろうね。いまのうちにメインループを作っておこう。

  1. ’−−−
  2. @LOOP
  3.  GOSUB @MYSHIP
  4. GOTO @LOOP
神崎

このラベル@MYSHIP(自機)で、プレイヤーを動かすサブルーチンを作るんだね。

ワンパクくん

サンプル3の方法で左右に動かすなら、こんなカンジだろ?

  1. ’−−− じぶん
  2. @MYSHIP
  3. B=BUTTON()
  4. IF B AND 4 THEN ???
  5. IF B AND 8 THEN ???
  6. RETURN

だが、わからねえ! このIF文をどうすりゃ、プレイヤーが動くんだ?

インテリくん

そういえば、まだキャラクターが動くタイプのプログラムはやったことがなかったね。少しじっくり作ってみようか。

  1. LOCATE 10,21:PRINT”Г”;

まずはこの行に注目かな。

ワンパクくん

イチバンはじめのトコロじゃねェか! オレのヤリ方にモンクでもあるってのかよ!

インテリくん

このLOCATEの数字を変えると、プレイヤー機のバショも変わるのはなんとなくイメージできるかな?

神崎

まあ、それくらいなら。
たとえばLOCATE 11,21:PRINT”Г”;と書けばもう1文字ぶん右に行くよね。

ワンパクくん

ソレと押されたボタンを組み合わせるのか……ツマリ、BUTTON()が押されたらLOCATEの数字を変える……? しかしLOCATEの数字を変えるには……

神崎

あ、変数を使うんだ!

ワンパクくん

! ……「数」が「変」わるから「変数」。そういうコトか……!

インテリくん

そうマチガってるワケでもないかな。数字がたびたび変わるようなトコロは、変数で作っておくとベンリだね。

神崎

ということは、この行も……?

  1. LOCATE 10,21:PRINT”Г”;
インテリくん

こんな感じがいいんじゃないかな。

  1. PX=10:PY=21
  2. LOCATE PX,PY:PRINT”Г”;

変数の名前に使ったはプレイヤーのP。はヨコ方向・タテ方向のイミだよ。

ハカセ

数学で「座標」のヨコ方向に「x」、タテ方向に「y」を使うコトがモトモトのイミかのう。コンピューターのセカイでもヨコといえば、タテといえば、というコトが多いのじゃ。

ワンパクくん

リクツはワカッてきたぜ。ボタンのあたりは、こうすりゃイイんだな?

  1. ’−−− じぶん
  2. @MYSHIP
  3. B=BUTTON()
  4. IF B AND 4 THEN PX=PX−1
  5. IF B AND 8 THEN PX=PX+1
  6. LOCATE PX,PY:PRINT”Г”;
  7. RETURN

左ボタンを押せばPXから引いて、右ボタンを押せばPX足すってワケだ。そのアトにLOCATEしてPRINTすればバッチリだぜ!

ハカセ

さて、どうかのう? ためしにRUNしてみるかの。

screenshot_failed1.jpg
ワンパクくん

ウ、ウォオー! ナンだコリャアー!

インテリくん

アイデアはまちがってなかったけど、いくつかダイジなところが抜けていたね。
まず、B=BUTTON()から戻ってくるまでのループが早すぎるってこと。ボタンをチョンと押しただけで、ものすごいスピードで何度も押したことになってるんだな。

神崎

そういえばサンプルプログラム3でも、そんなコトがあったね。

インテリくん

となると、思い出すこともあるんじゃないかな?

  1. @LOOP
  2.  GOSUB @MYSHIP
  3.  VSYNC 1
  4. GOTO @LOOP

メインループの中にVSYNC命令をふやしたよ。

神崎

60分の1秒だけプログラムの動きを止めるんだったね。早すぎるループをわざと遅らせるのはワカるけど……60分の1秒って、そんなあっと言う間でいいの?

インテリくん

そのくらいでも、アクションゲームならイガイとちょうど良かったりするんだよ。ものたりなければ、増やせばすむコトだしね。

ワンパクくん

ナルホドな。とにかくモンダイはカイケツだぜ。RUN

screenshot_failed2.jpg
ワンパクくん

カイケツしきってねェー!

ここまでのプログラムリスト

+  ここまでのプログラムリストを表示

動かし方のコツを学ぼう

ハカセ

ナニがおきておるのか、20行目をVSYNC 20ぐらいに変えて見るとハッキリするじゃろう。
こういう「重し」をかけるのは、テストにはユウコウじゃぞい。

ワンパクくん

な……ナンとなくはワカッたな。ヨコに動かすと、プレイヤー機が分身するみたいに増えていっちまうんだ。

インテリくん

いちど画面にPRINTした字は、消さなきゃずっとそこに残っちゃうのさ。

神崎

言われてみれば当たり前だけど……じゃあどうやって消せばいいの?

インテリくん

それはカンタンさ。” ”つまりスペースを同じ場所にPRINTすれば、Гはなくなるってワケだね。

ワンパクくん

消すっつーか、上書きするっつーか、だな。
このプログラムだと、モトの場所にスペースを書けばイイんだから……ン? ブツブツ……ボタンが押されたらもうPXを変えてるワケで……モトの場所を消さないとイケねェんだけど、ボタンを押してないのに消したらマズいワケで……
イマイチわかんねェぞ!

インテリくん

これは、もっとプログラムを書き足さないといけないね。

  1. ’−−− じぶん
  2. @MYSHIP
  3. B=BUTTON():VX=0
  4. IF B AND 4 THEN VX=−1
  5. IF B AND 8 THEN VX=1
  6. LOCATE PX,PY:PRINT” ”;
  7. PX=PX+VX
  8. LOCATE PX,PY:PRINT”Г”;
  9. RETURN

わかるかな? クッションになる変数VXを新しく作ったよ。

神崎

ええと、ふだん変数VXで、ボタンを押したときだけ−1になるんだね。

ワンパクくん

変数PXはまだ変わってねェから、まずスペースで消して……あらためてPXVXを合わせてからLOCATEしなおしてГPRINTするってワケか!
ワレながら、英語の多いコトバをしゃべっちまったぜ!

ハカセ

英語ついでに言うと、変数VXの「」は「動く方向と量」という意味の「ベクター」のコトじゃな。プログラムではよく使われるコトバじゃが、広義のベクトルと違って……

神崎

ちょ、ちょっと待って! センモン的なハナシはいいんじゃないかな。
それより、ボタンが押されてない時にもいったんスペースで消して、同じ場所にもういちどГを書いているよね。これはいいの?

インテリくん

RUNしてみるとわかるけど、すごいスピードで消しては書いてるから、そう気にはならないね。 でも、それがベストかというとビミョウかな。こう書くのが正しいのかもね。

  1. ’−−− じぶん
  2. @MYSHIP
  3. B=BUTTON():VX=0
  4. IF B AND 4 THEN VX=−1
  5. IF B AND 8 THEN VX=1
  6. IF VX==0 THEN @NOTMOVE
  7. LOCATE PX,PY:PRINT” ”;
  8. PX=PX+VX
  9. LOCATE PX,PY:PRINT”Г”;
  10. ’−−−
  11. @NOTMOVE
  12. RETURN

ボタンが押されていないときは、イッキにラベル@NOTMOVE(動かない)まで飛んで、プレイヤー機をPRINTし直さないことにしたよ。

ワンパクくん

コレで動きはバッチリってコトだな。RUNしてみるゼ!

img-screen-sample7btn3.png
ワンパクくん

チ、チキショー!
画面のハジまで動かしたら、エラーになっちまったぜ!

インテリくん

このOut of range (アウト・オブ・レンジ) エラーというのは、命令にわたした数値が範囲からはずれてしまった、というエラーだね。

神崎

それは、変数PXが画面を飛びこしちゃったのがゲンインかな?

インテリくん

PXのときに−1しちゃったり、PX49のときに+1しちゃったり、だね。

ワンパクくん

テメーら、もっとわかりやすいコトバでしゃべりヤガレー! 画面のハジまで行ったら、それよりムコウに動かさないようにすればいいだけじゃねえか!

インテリくん

これはワンパク君の言うとおりだね。ГPRINTする前に、IF文を2行用意しておこうか。

  1. PX=PX+VX
  2. IF PX<0 THEN PX=0
  3. IF PX>49 THEN PX=49
  4. LOCATE PX,PY:PRINT”Г”;
神崎

これでプレイヤーの動きはモンダイなくなったね。

ワンパクくん

コレはコレで、動いてねェプレイヤー機を消しては書いちまってるが……、モトのサンプルプログラムがこうだからシカタねェのか?

ハカセ(泣)

し、しもうたァ━━ッ!

インテリくん

ま、まあそのあたりはコンゴのカダイとして……。
いったん、ココまでのプログラムをまとめておこう。
どういうイミなのか考えながらジッサイに打ち込んでみると、もっとよくワカると思うよ! モニタの前のみんなもやってみてね!

サンプルプログラム7 (その1) でできたリスト

+  プログラムリストを表示

今回のまとめ

キャラクターを動かすには
たとえばLOCATEの位置を変数にして、BUTTON()の入力に合わせてIF文で変数を足したり引いたりすると、動いて見えます。
動く前にいた場所に、空白スペースを上書きして消してやると自然に見えそうですね。
LOCATEする場所が画面をはみださないように注意!
VSYNC命令とアクションゲームの関係
プログラムを一時停止するVSYNC命令で、スピードを落とせます。早すぎて操作が追いつかない時にはとてもよく使いますね。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 7 人がこのサイトを見ています
  • このページはこれまでに 2781 回、本日は 5 回、昨日は 2 回閲覧されました

ページの先頭に戻る

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.064 秒 | このページの最終更新 : 2019/08/04 (日) 14:28:09 (205d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30