今回はGWorldというものに ついてです。
Home>プログラミング講座>Mac C 講座中級> 第二回 GWorld>

Mac C 講座中級 第二回 GWorld

 
 一旦GWorldに描画して(実際の画面にはあらわれない)、それを実際の画面に転送する事によって、書き込んでいる途中を画面に表示しなくて済むため、ちらつきがほとんどなくなります。



	GWorldPtr	world, oldWorld;
	GDHandle	oldGDHandle;
	
	GetGWorld( &oldWorld, &oldGDHandle );

	NewGWorld( &world, 0, &FrontWindow() -> portRect,
				NULL, NULL, NULL );

	SetGWorld( world, NULL );

	LockPixels( world -> portPixMap );

		//ここに描画処理を書く。
		
	UnlockPixels( world -> portPixMap );

	CopyBits( *(BitMapHandle)world->portPixMap,
			&FrontWindow() -> portBits,
			&FrontWindow() -> portRect,
			&FrontWindow() -> portRect,
			srcCopy,
			FrontWindow()->visRgn
		);
	
	SetGWorld( oldWorld, oldGDHandle );
	
	DisposeGWorld( world ); //GWorldのメモリの開放



 このサンプルでは、一番前のウインドウの大きさのGWorldを作り、GWorldに描画し(画面には表示されない)、ウインドウにGWorldを内容を転送します(ここで画面に見えるようになる)。GetGWorldとSetGWorldをしないとうまくいかない言う話を小耳に挟んだので取りあえずそれもしてあります。また、CopyBitsの最後の引数をFrontWindow()->visRgnにすることによって、見える部分にのみ転送するようにしてあります。

 このGWorldというものは結構難しいので、全ての内容を理解する必要はありません。ただ、こうすればこう動くということだけ分かっていれば使いこなせるし、それでほとんど問題はありません。(使い方が限定されるけど。)

 関数の説明

 新しくGWorldを用意する
  pascal QDErr NewGWorld( GWorldPtr *offscreenGWorld,
       short PixelDepth, const Rect boundsRect,
       CTabHandle cTable, QDHandle aGDevice,
       GWorldFlags flags );

   返り値 エラー値
   引数    offscreenGWorld 作成したGWorldへのポインタ
   PixelDepth 1ドットあたりのビット数。
         0を指定すると一番色数の多い画面の色深度
   boundsRect GWorldの大きさ。(PixelDepthが0だと無視される)
   cTable   カラーテーブル(通常使用では0を指定し、規定値を使う)
   aGDevice  描画環境で使用するデバイス(通常使用では0を指定)
   flags    フラグ(通常使用では0を指定)

 指定したGWorldやデバイスをカレントにする
  pascal void SetGWorld( CGrafPort port, GDHandle *gdh );

   引数 port 設定するGWorldへのポインタ
      gdh  設定するデバイスへのハンドル。(portがGWorldではない時のみ)

 描画前後の処理
  LockPixels( PixMapHandle pm );
  UnlockPixels( PixMapHandle pm );

   引数 pm 処理対象となるPixMapへのハンドル

 ビットマップの転送(転送モードを指定)
  pascal void CopyBits( const BitMap *srcBits,
      const BitMap *dstBits, const Rect *srcRect,
      const Rect *dstRect,short mode,
      RgnHandle maskRgn );

   引数 srcBits  転送元のビットマップ(BitMapないしPixMap)
      dstBits  転送先のビットマップ(BitMapないしPixMap)
      srcRect  転送元の領域をRectで指定。
      dstRect  転送先の領域をRectで指定。
      mode   転送モード
      maskRgn マスク用のRegionで、Region内だけが転送される。
           マスクをしない時は0を指定。

 実は、CopyBitsのmaskRgnはシューティングゲームなどで多用されていますが、その説明はまたの機会に。

[<前の回へ] [次の回へ>]


[Mac C講座中級]
[プログラミング講座]
[Home]