1章.星空の表現(1)
1999.8.2

SF映画やシューティングゲームで、宇宙空間を突き進むシーンが見られますが、同シーンを表現するのにもっともポピュラーだと思われるものに、手前方向に無数の星が流れる効果があります。宇宙船を画面中央に配置させているだけでも、回りの星が手前方向に流れれば宇宙船は画面奥方向に飛んでいるように見えるし、星が右から左に流れていれば宇宙船は右方向に飛んでいるように見えます。同様の効果は従来からゲームに利用されてきており非常に利用価値の高いものであります。
今回は、この星が流れる効果をプログラムしてみたいと思います。プログラムは段階を追って作り上げます。
まず、はじめに10個の星を上から下方向に流れるプログラムを作ってみます。星の各配列で確保し、画面の位置情報(X、Y座標)を持たせます。


//領域確保
DIM HOSI(10,2)

/****************************************
  画面準備
****************************************/
CH1 = G@SETUP( 640 , 480 , 8 , 0 )	//画面の初期化
CH2 = G@CHRLOAD( "HOSI.BMP" )		//キャラクタ読み込み
G@PALLOAD( "HOSI.BMP" )                 //パレット読み込み

/****************************************
  星の初期配置
****************************************/
FOR I=0 TO 9
  HOSI( I , 0 ) = RAND( ) * 640 / 32768         //X軸位置
  HOSI( I , 1 ) = RAND( ) * 480 / 32768         //Y軸位置
NEXT
/****************************************
  星の表示
****************************************/
LOOP
  G@CHRCLEAR(CH1)				//画面のクリア
  FOR I=0 TO 9
    //座標取得
    X=HOSI(I,0)
    Y=HOSI(I,1)
    //座標に移動量を加算
    Y=Y+1
    IF Y > 480 THEN                             //星が目の前を超えて後ろに行ったら奥に戻す
      Y = 0
    ENDIF
    //座標を保存
    HOSI(I,0)=X
    HOSI(I,1)=Y
    G@CHRRECT(CH2,4,0,6,2)
    G@CHRRECT(CH1,X,Y)
    G@CHRCOPYF(CH2,CH1,1)
  NEXT
  //フリップ
  G@FLIP()
ENDLOOP

星の画像 HOSI.BMP


まず、画面の準備をした後、星をランダムに配置します。後は星を下方向に流すために、星を描画するたびに各星のY座標に移動量となる値を加算し、画面下に飛び出たらY座標を画面上に設定しなおしています。
10個の星は画面の上から下にループしながら流れているだけです。
ここまでのプログラムを改良して、カーソルキーを押す事で上下左右360度好きな方向に星を流すプログラムを以下に載せますので参考にしてみてください。なお、同じ方向を押しつづければ加速します。


//領域確保
DIM HOSI(10,2)

/****************************************
  画面準備
****************************************/
CH1 = G@SETUP( 640 , 480 , 8 , 0 )	//画面の初期化
CH2 = G@CHRLOAD( "HOSI.BMP" )		//キャラクタ読み込み
G@PALLOAD( "HOSI.BMP" )                 //パレット読み込み

/****************************************
  星の初期配置
****************************************/
FOR I=0 TO 9
  HOSI( I , 0 ) = RAND( ) * 640 / 32768         //X軸位置
  HOSI( I , 1 ) = RAND( ) * 480 / 32768         //Y軸位置
NEXT
/****************************************
  星の表示
****************************************/
LOOP
  I@KEYGET( )                                   //キーボード情報取得
  IF I@KEYBTN( 0x4B ) == 1 THEN                     //「4」が押されたら左へ移動
    XX = XX - 1                                 //
  ENDIF
  IF I@KEYBTN( 0x4D ) == 1 THEN                     //「6」が押されたら右へ移動
    XX = XX + 1                                 //
  ENDIF
  IF I@KEYBTN( 0x48 ) == 1 THEN                     //「8」が押されたら上へ移動
    YY = YY - 1                                 //
  ENDIF
  IF I@KEYBTN( 0x50 ) == 1 THEN                     //「2」が押されたら下へ移動
    YY = YY + 1                                 //
  ENDIF
  G@CHRCLEAR(CH1)				//画面のクリア
  FOR I=0 TO 9
    //座標取得
    X=HOSI(I,0)
    Y=HOSI(I,1)
    //座標に移動量を加算
    X=X+XX
    Y=Y+YY
    IF X < 0 THEN                               //星が左端に消えたら右に戻す
      X = X + 640
    ENDIF
    IF X > 640 THEN                             //星が右端に消えたら左に戻す
      X = X - 640
    ENDIF
    IF Y < 0 THEN                               //星が上端に消えたら下に戻す
      Y = Y + 480
    ENDIF
    IF Y > 480 THEN                             //星が下端に消えたら上に戻す
      Y = Y - 480
    ENDIF
    //座標を保存
    HOSI(I,0)=X
    HOSI(I,1)=Y
    G@CHRRECT(CH2,4,0,6,2)
    G@CHRRECT(CH1,X,Y)
    G@CHRCOPYF(CH2,CH1,1)
  NEXT
  //フリップ
  G@FLIP()
ENDLOOP

星の画像 HOSI.BMP