プログラミング超初心者のための講座
 第15回 BASIC編「ナイトライダー」(キャラクタアニメーション)


さて第15回が始まりましたよ。 忘れ物はないですか?

なんと今回からは上級です。(何が上級かよくわかりませんけど(^^;))

パソコンとゲーム

前回まではいわばシミュレーションゲーム系でした。(強引かな?)
今回からはアクションゲームを作ります。といっても最近のプレステ2とかのようなものじゃないですよ
仕組みは基本的に同じですがあれを期待されたらちょっと困ってしまいます。

もともとパソコンというのは「電子計算機」ですからもっとも計算を得意とする機械です。
ですから初期のパソコンの頃は画面の中を駆け回るようなゲームは苦手でした。
ですからもっぱら計算をよく使いあまり画面に変化のないゲームが多かったのです。
シミュレーションやRPGが多かったのもそのためです。
そのむかしゼビウスのパソコン版が出たときは、驚異的でしたけどね。スクロールするなんてとんでもないことでしたから。

ファミコンはコンピュータですけどゲームに特化して作ってある専用機です。ですから初代ファミコンでも信じられないような
ゲームができたんです。

その後時代はすすみパソコンで家庭用ゲーム機に匹敵する動きをもつパソコンゲームが登場したのは
つい最近の話です。Windows98が出て3Dアクセラレータなどが安価に手にはいるようになったからです。

動かそう!

話がそれましたけど。今回からは動くゲームを作ります。
当然BASIC言語では派手なものは作れませんが
前回までの文字だけの世界とはうって変わることでしょう。

ではものが動く。パソコンの画面でキャラクタが移動すると言うことはどういうことでしょうか?
理屈は簡単です。今ここにあったキャラクタが次には隣にいるということです。
 
過去 現在 未来
   A        A
移動した

まずは

このプログラムを実行してみてください

10 FOR X=10 TO 30
20 LOCATE X,10:PRINT"#"
30 NEXT X

いかがですか?

画面に####################と表示されましたね。

プログラムを解析すると、おそらく左から#が順番に右へ向かって表示されていく

と、思いませんでしたか?
その通りなんです。その通り表示されたのですが、あまりにも早すぎてその様がみれなかっただけなのです。

では目にとまるように遅くしてみましょう。遅くするには遅くしろという命令はありません。
そこで無駄な処理をさせて時間を稼ぐことにしましょう。

10 FOR X=10 TO 30
20 LOCATE X,10:PRINT"#"
25 FOR I=0 TO 100:NEXT I
30 NEXT I

増えたのは25行です。ここではせっかくFOR文があるのにすぐにNEXTがきてきます。
無駄ですね。そうなんです無駄をさせているんです。ここで100回意味もなくループさせることによって
時間を稼いでいるのです。

いかがですか?目にとまるようになりましたか?
これは環境によって様々ですから自分の使っている環境に合わせて調整してください。
そしてだいたいいくつくらいが心地よいか体得しておいてください。

遅いマシンやWindows上で使っている人はたぶんもっと少なくしなくては遅すぎますね
また高速なDOS環境にある方はまだまだ早すぎますね。

この段階では帯が左から右へのびるだけです。

移動させる

では左から右へ移動させるにはどうしたらよいでしょうか?

今の例だと
 
過去 現在 未来
A AA AAA
となっています。

先ほどのと何が違うのでしょうか?
 
現在 未来
A  A   A

比べればわかりますが、今の場合どんどん増えていっています
さっきのは増えていません。でも増えたわけではないんです。

今、座標XにAがあったら次はX+1にAが現れます。その次はX+1+1・・・・・・・・・・・
つまり先ほどと同じです。違いはここからです。
新しいキャラクタが現れるのは同じですが、今まであったキャラクタが残っているか消えているかのちがいです。

つまり、「前回表示されていたキャラクタを消せばよい」ということです。わかりますか?
特定のキャラクタを「消す」という命令はないので、「上から何もないものを書く」ということをします。
LOCATEをしっていますから、同じ座標に表示することは簡単です。

作り直すとこうなります。

10 FOR X=10 TO 30
20 LOCATE X,10:PRINT"#"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 NEXT I

ここでは26行におくことがポイントです。25行より前に置くと
せっかく表示した#がすぐ消えてしまいます。26行におくことによって
時間稼ぎをしている間表示することになります。

RUNすると左から右へ向かって#が動きましたね。

ナイトライダー

ナイトライダーって知ってます?
知ってる人は説明不要ですが、知らない人のために少しだけ、、
 アメリカのドラマで黒い車(トランザム)が知能を持っていてしゃべるんです。
 主人公のマイケル・ナイトはナイト財団に所属しドリームカー「ナイト2000」に乗り込み
 悪事を次々解決していくというお話
 その主人公メカナイト2000は正面から見るとヘッドライトとヘッドライトの間のスリットに
 赤いランプが左右にふらふら動いているんです。

それを再現しようと言うことです。

要するに左右に動き続けるものを作ればよいのです。
この段階で左から右へは動いているので右から左は簡単ですね。
往復させてみましょう。

10 FOR X=10 TO 30
20 LOCATE X,10:PRINT"#"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 NEXT I
40 FOR X=30 TO 10
50 LOCATE X,10:PRINT"#"
60 FOR I=0 TO 100:NEXT I
70 LOCATE X,10:PRINT" "
80 NEXT I

同じことの繰り返しです。
ではRUN・・・・・・・・・・・・・・・・
あれ?
左から右へ行きましたが戻ってきませんね。

なぜでしょう?
これは実はFOR文に問題があるんです。

実は今まで使っていた FOR文はあるものが省略してあったんです。

10 FOR X=10 TO 30 STEP 1

STEP1とは1づつ増やせという意味です。
この場合FOR文は繰り返すたびにXが1づつ増えます。

では40行の場合はどうでしょうか?

40 FOR X=30 TO 10 STEP 1

Xが30なので1づつ増やそうとしてもTOが10なので、1回もループすることなく終わってしまうんです。

そこでこう変えます

40 FOR X=30 TO 10 STEP -1

マイナス1づつ増やすんですから結果的に1づつ減らすことになります。
したがってXの値は30から10へ変わります。

これで#が往復するようになりました。

最後にGOTO文を付け加えて完成です

10 FOR X=10 TO 30
20 LOCATE X,10:PRINT"#"
25 FOR I=0 TO 100:NEXT I
26 LOCATE X,10:PRINT" "
30 NEXT I
40 FOR X=30 TO 10 STEP -1
50 LOCATE X,10:PRINT"#"
60 FOR I=0 TO 100:NEXT I
70 LOCATE X,10:PRINT" "
80 NEXT I
90 GOTO 10

ちゃんとナイトライダーしてるでしょ。
(わからない人ごめんなさい)

今回は、キャラクタの動く理屈をやりました。

では
次回の講義をお楽しみに
さいなら

もどる



このページはNetscapeNavigator or Netscape Communicator 4.7で
きれいに見えるように作られています。そちらをお使いください。