プログラム講座 初級編15

- レースゲームのカーブの表示方法 -

 初級編15です。今回は「レースゲームのカーブの表示方法」について説明します。カーブといっても、要するに道の表示です。最近はほぼ全てポリゴンで描画されていますが、ポリゴン全盛以前は今回説明するような方法で描画されていました。今回のプログラムについてはopenspace-mlの森山和広氏からアルゴリズムを教えてもらいました。森山氏のページはこちらです。




カーブの演算方法
 昔のレースゲームでは直線とカーブは以下のように表示されます。

直線道路
カーブ(左)

 直線は道幅を変化させるだけで実現できますが、問題はカーブをどうやって表現するか、です。あらかじめカーブの座標を用意しておいて切り替えるというものもありましたし、まじめに演算しているものもありました。しかし、よく考えてみると8ビット(z80,6809)等でちゃんとゲームになっていたのですから、今のような複雑な演算や計算に時間がかかる乗算や除算は使っていない可能性大です。
 カーブを実現するには「積算」だけで簡単に実現できます。今回は左右のカーブのみですが、これを上下にも機能するようにすればアウトランのような道の表示も出来るはずです。

 まず、一番手前の道路の座標を求めます。次に1つ遠い道(1つ上)の座標を算出します。これは単純に下の道路のX座標に道の曲がり具合を加算するだけです。加算する数は遠くになるほど曲がり具合が作用するように距離に応じて乗算を行います。遠くにいくに従ってかける数を大きくしていけばOKです。
 これでできあがりです。



視点移動の演算方法
 視点を移動させると以下のように表示されます。

直線道路
カーブ(左)
 視点の移動は遠くにいくに従って作用しなくなるようにしていきます、つまり遠くに行くに従って乗算する数を減らしていくだけで実現できます。
 あっけない解説ですが、これでちゃんと動きます。ただ視点の移動や曲がり具合などは、細かく変化させないとスムーズにはなりませんので注意してください。



終わりに
 今回はネタを変えてレースゲームのカーブ表示について説明しましたが、どうでしょうか。確か昔「走れスカイライン」というゲームがあってI/Oに、このような解説が掲載された事があります(視点の移動の仕方は手前を基準にしていましたが)。今回の方法はopenspace-mlの森山和広さんから教えてもらいました。この場を借りてお礼を申し上げます。
サンプルリストですが、4、6でカーブ(S字もできます)、1、3で視点の移動になっています。



今回のプログラムリスト
' ' "昔風のゲームのカーブの表示アルゴリズム" ' DIM X(50): ' "道路の標示X座標" DIM CURV!(50): ' "道路の曲がり具合" DIM LX(50): ' "道幅" FOR I=0 TO 50:CURV!(I)=0:NEXT: ' "最初は直線道路に設定" FOR I=0 TO 50:LX(I)=200-I*3.9 :NEXT: ' "道幅を設定" CV! = 0: ' "一番奥の曲がり具合" FX! = 0: ' "視点の左右移動" CenterX = 300: ' "画面の中央座標" WINDOW #1,"road",(0,0)-(CenterX*2,170): ' "ウィンドウをオープン" WHILE FN BUTTON = _false: ' "マウスボタンが押されるまで待つ" FOR I=1 TO 50: ' "道路の数だけ繰り返す" X(I)=X(I-1)+CURV!(I-1)*I: ' "一番下の道路からのずれ具合を加算していきます" CURV!(I-1)=CURV!(I) : ' "道を移動" NEXT ' "道路を表示する" FOR I=0 TO 50 cx = FX! * (51-I) + CenterX: ' "視点の移動の演算" COLOR _zWhite:BOX 0,150-I TO 640,150-I+1: ' "道を消す" COLOR _zBlue:BOX cx+X(I)-LX(I),150-I TO cx+X(I)+LX(I),150-I+1:' "道を書く" NEXT k$ = INKEY$: ' "キー入力" IF k$="0" THEN CV! = 0:FX! = 0 IF k$="4" AND CV! > -2 THEN CV! = CV! - 0.02 IF k$="6" AND CV! < 2 THEN CV! = CV! + 0.02 IF k$="1" AND FX! > -5 THEN FX! = FX! - 0.05 IF k$="3" AND FX! < 5 THEN FX! = FX! + 0.05 CURV!(50)=CV!: ' "一番遠くの道に曲がり具合を設定" WEND