2章.フルスクリーン画面にBMP画像を単純に表示する2(&画面の説明)
1999.5.4

LGPの画面構造を更に深く見てみましょう。1章のプログラムを以下のように変更してみてください。


  CH=G@SETUP( 640 , 480 , 16 , 0 )        //画面初期化
  BM=G@CHRLOAD("TEST.BMP")                //画像読み込み
  G@CHRCOPY( BM , CH )                    //画像を画面にコピー
  LOOP
    G@FLIP( )                               //フリップ
  ENDLOOP

テスト用画像
TEST.BMP



変更点は、S@WAIT関数のあった所にG@FLIP関数を移行しS@WAIT関数を削除しただけです。
どうでしょうか?画面がチカチカとちらついて表示されていると思いますが、これはLGPの動作を体験してもらう為にわざとこの状態にしています。

勘の良い方なら、「1章でS@WAITを使用しESCキーの受付処理をしている書いたのにS@WAIT関数をとってしまっても大丈夫なのか?」という疑問が湧くかもしれません。これは単純な理由でして、G@FLIP関数がS@WAIT関数の機能を兼ね備えているからS@WAIT関数は無くても良いのです。

画面がチカチカとちらついて表示される原因について説明します。まず、それにはワーク画面の詳細に付いて知る必要があります。
1章で「一旦ワーク画面に描いた後、モニターに表示する」と書きましたが、同ワーク画面は実は2つあるのです。なぜ2つあるのか?これは1つしかワーク画面が無い場合を考えれば簡単に理解できます。1つしかワーク画面が無ければ、描いている間はモニターに表示するものが無いので真っ暗になると言う事になります。そこで2つのワーク画面を使い、描き終わったワーク画面を表示中に、もう1つのワーク画面に描画を行う事で、真っ暗になる事を防ぎます。

これを踏まえて画面のチカチカを考えます。G@CHRCOPY関数でBMP画像を画面にコピーしているのは1回のみと言う事は、2つあるワーク画面の1つにしかコピーを行っていません。1章ではG@FLIP関数を1回のみ実行しているので、BMP画像をコピーしたワーク画面がモニターに表示されました。しかし、2章ではG@FLIP関数を繰り返し実行している為、何もコピーされていない(つまり初期化されていない)ワーク画面と、BMP画像をコピーしたワーク画面が交互にモニターに表示され、モニターがチカチカするのです。

で、チカチカを起さない方法ですが、下のように、2つのワーク画面をG@FLIP関数で切り替えながら両方にBMP画像をコピーすればよいでしょう。


  CH=G@SETUP( 640 , 480 , 16 , 0 )        //画面初期化
  BM=G@CHRLOAD("TEST.BMP")                //画像読み込み
  G@CHRCOPY( BM , CH )                    //画像を画面にコピー
  G@FLIP( )                               //フリップ
  G@CHRCOPY( BM , CH )                    //画像を画面にコピー
  LOOP
    G@FLIP( )                               //フリップ
  ENDLOOP

テスト用画像
TEST.BMP