4章.BMP画像を上下左右に自動で動かす
1999.6.17

ここまでで画像を表示する事が出来るようになったと思います。表示が出来るようになったら、次は画像を動かしたいと思うのが人情というものでしょう。というわけで、3章で使用した画像を表示するプログラムを改良して、画像を動かしてみます。
3章で、画面を表示するには、G@CHRRECT関数の指定でコピー元、又はコピー先の矩形を指定してから、G@CHRCOPY関数でコピーすると説明しましたが理解されたでしょうか?
理解されていたら移動は簡単です。3章では、コピー先を左上の角に合わせてコピーしていたのですが、その左上の座標を表示をしたい座標にしてあげればよいのです。3章のプログラムを次のように直してみました。


  CH=G@SETUP( 640 , 480 , 16 , 0 )        //画面初期化
  BM=G@CHRLOAD("TEST.BMP")                //画像読み込み
  G@CHRRECT( CH , 320 , 240 , 367+320 , 191+240 )
                                          //コピー先の矩形を指定
  G@CHRCOPY( BM , CH )                    //画像を画面にコピー
  LOOP
    G@FLIP( )                             //フリップ
  ENDLOOP

テスト用画像
TEST.BMP



画像の左端が画面の中心に来るように表示されていると思います。プログラムを見るとG@CHRRECT関数のパラメタが変更されている(赤い行)のが分かります。
修正前と修正後をならべてみます。
<修正前>
  G@CHRRECT( CH , 0 , 0 , 367 , 191 )     //コピー先の矩形を指定
<修正後>
  G@CHRRECT( CH , 320 , 240 , 367+320 , 191+240 )
                                          //コピー先の矩形を指定
画面のサイズは640×480なので中心は横320、縦240の座標になります。ですから、G@CHRRECT関数の各座標値に中心の座標値を加えているだけです。同プログラムを見るとすぐに気が付くと思いますが、コピー先の左上の座標に中心の座標値を加えたら、コピー先の右下の座標にも同じ値を加える事を忘れないでください。
感の良い方ならお気付きかもしれませんが、コピー先の左上と右下の座標に同じ座標値を加えない場合、これは拡大縮小の考え方となります。詳しいことは次章に書きますので、この話はここまでにします。

画像を右方向に動かす単純なプログラムを載せますので参考にしてみてください。


  CH=G@SETUP( 640 , 480 , 16 , 0 )        //画面初期化
  G@CHRCLEAR(CH)                          //画面クリア
  G@FLIP( )                               //フリップ
  G@CHRCLEAR(CH)                          //画面クリア
  BM=G@CHRLOAD("TEST.BMP")                //画像読み込み
  LOOP
    FOR DX = 0 TO 640
      G@CHRRECT( CH , 0+DX , 0 , 367+DX , 191 )  //コピー先の矩形を指定
      G@CHRCOPY( BM , CH )                    //画像を画面にコピー
      G@FLIP( )                             //フリップ
    NEXT
  ENDLOOP

テスト用画像
TEST.BMP



更に上下左右にバウンドさせてみます。


  CH=G@SETUP( 640 , 480 , 16 , 0 )        //画面初期化
  G@CHRCLEAR(CH)                          //画面クリア
  G@FLIP( )                               //フリップ
  G@CHRCLEAR(CH)                          //画面クリア
  BM=G@CHRLOAD("TEST.BMP")                //画像読み込み
  X = 0                                   //X軸の初期値
  Y = 0                                   //Y軸の初期値
  DX = 1                                  //X軸の移動量
  DY = 1                                  //Y軸の移動量
  LOOP
    G@CHRCLEAR(CH)                      //画面クリア
    G@CHRRECT( CH , X , Y , 367+X , 191+Y )
                                        //コピー先の矩形を指定
    G@CHRCOPY( BM , CH )                //画像を画面にコピー
    G@FLIP( )                           //フリップ
    X = X + DX                          //X方向に移動
    IF X < 0 THEN                       //左隅を超えた
      DX = 1                            //右方向に移動
    ENDIF
    IF X > 272 THEN                     //右隅を超えた
      DX = -1                           //左方向に移動
    ENDIF
    Y = Y + DY
    IF Y < 0 THEN                       //上隅を超えた
      DY = 1                            //下方向に移動
    ENDIF
    IF Y > 288 THEN                     //下隅を超えた
      DY = -1                           //上方向に移動
    ENDIF
  ENDLOOP

テスト用画像
TEST.BMP