English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る進む
8.スクロール

8-7. スクロールの描画

 ここでは、スクロール機能設定とスクロール登録を終えたスクロール画面の、実際の描画までの流れを、使用するライブラリ関数の順を追って説明していきます。

バック画面の設定

 ●バック画面の設定
バック画面のカラーを選択します。
バック画面とは、モニター中、何も描画されていない箇所(ドット単位)に表示する、最背面に描画される単色の表示面を指します。
バック画面の設定にはライブラリ関数“slBack1ColSet ”を用います。

【void slBack1ColSet ( void *back_col_adr , Uint16 RGB_col ) ;】
 単色バック画面のカラーを指定します。
パラメータには、バック画面のカラーデータを格納するVRAM中の先頭アドレス、バック画面のカラーを示す1ワード型のRGB値(#define値)をそれぞれ代入します。
RGBカラー指定に使用する値は、ヘッダーファイル“sl_def.h”中で定義されているので、参考にしてください。

図8-15 RGBカラーモードサンプル(RGB_Flag)

● RGBモードカラーサンプル ●
#define	CD_Blank	(0<<10)  | (0<<5)  | (0)  | RGB_Flag
#define	CD_DarkRed	(0<<10)  | (0<<5)  | (8)  | RGB_Flag
#define	CD_DarkGreen	(0<<10)  | (8<<5)  | (0)  | RGB_Flag
		:
		:
#define	CD_Purple	(31<<10) | (0<<5)  | (31) | RGB_Flag
#define	CD_Magenta	(31<<10) | (31<<5) | (0)  | RGB_Flag
#define	CD_White	(31<<10) | (31<<5) | (31) | RGB_Flag

注)上記値は、“sl_def.h”で定義されています。

表示位置設定

 ●ノーマルスクロール画面
 機能設定されたノーマルスクロール面の表示位置を決定します。
ノーマルスクロール画面の表示位置決定には、ライブラリ関数“slScrPosNbg0〜3”を用います。

【void slScrPosNbg0〜3 ( FIXED posx , FIXED posy ) ;】
 ノーマルスクロール画面の表示座標を設定します。
パラメータには、スクロールマップ上のどの位置にモニターを配置するかを決定するためのXY座標値(スクロール座標系)を代入します。
ノーマルスクロール画面の配置基準点は、モニターの左上角になります。

 ●回転スクロール画面
 機能設定された回転スクロール面の配置座標と回転中心座標を決定します。
回転スクロール画面の表示位置決定には関数“slLookR”を、回転中心座標決定には関数“slDispCenterR”を用います。

【void slLookR ( FIXED posx, FIXED posy) ;】
 回転スクロール画面の配置座標を設定し、カレント回転パラメータに情報を保存します
。 パラメータには、スクロールマップ左上を原点とするスクロールXY座標値を代入します。
回転スクロールは、配置座標と回転中心座標により表示位置が決定されます。

【void slDispCenterR ( FIXED posx , FIXED posy ) ;】
 回転スクロール画面の回転中心座標(消失点)を設定し、カレント回転パラメータに情報を保存します。
パラメータには、回転スクロール画面を配置する画面XY座標値を代入します。
回転スクロールは、配置座標と回転中心座標により表示位置が決定されます。

図8-16 表示位置と回転中心位置の関係

注)スクロール面のZ軸は画面手前が正方向

 また、関数“slLookR”、“slDispCenterR”は、回転パラメータA・Bそれぞれに対して設定可能で、設定する回転パラメータ(現在使用している回転パラメータ)の切り替えは、関数“slCurRpara”で行います。回転スクロールに使用される関数の内、 関数名末尾が“R”で終わっているものに関しては全て、回転パラメータA・Bに対してそれぞれ別に、関数の担う機能を設定することができます。

スクロール登録

 スクロールデータの格納およびスクロール機能設定を終えたスクロール画面は、SGLライブラリ関数“slScrAutoDisp”を用いてスクロール登録を行う必要があります。
スクロール登録というのは、機能設定を終えた各スクロール画面に対して、サイクルパターンの設定と描画設定を行うことをいいます。

 また、登録するスクロールの機能設定、スクロール面数、スクロールデータの格納されるVRAMバンクによっては、スクロール登録が失敗する場合があります。
これは、前述したノーマルスクロール画面の色数によるスクロール制限を含む、幾つかのスクロール制限によるものです(制限については次項で述べます)。

【Bool slScrAutoDisp ( Uint32 disp_bit ) ;】
 機能設定されたスクロール画面を登録します。
パラメータには、登録するスクロール画面に対応した下表の値を代入します。
関数は、スクロール登録が成功した際には0、失敗した場合には−1の戻り値を、それぞれ返します。

表8-18 スクロール登録パラメータ代入値(disp_bit)

登録するスクロール画
NBG0NBG1NBG2NBG3RBG0
代 入 値NBG0ONNBG1ONNBG2ONNBG3ONRBG0ON

注)上表の値はシステム付属の“sl_def.h”で定義されています。

 複数のスクロール画面を登録する場合、ライブラリ関数“slScrAutoDisp”のパラメータ代入値は、それぞれのスクロールに対応した#define値をor演算子“|”で結合していくのが便利です(例を下図に示します)。

図8-17 複数のスクロール面の登録

● 複数のスクロール面登録●

Uint16 slScrAutoDisp(NBG0ON|NBG1ON|RBG0ON);            ↑   ↑   ↑            |   |   RBG0登録            |   NBG1登録            NBG0登録

 (| = or演算子)

注)パラメータ代入値は“sl_def.h”中で定義されています。

スクロール登録に関する注意事項

 SGLライブラリ関数“slScrAutoDisp”を用いてスクロール登録を行う際、場合によっては関数が戻り値−1を返す場合があります。これは、関数“slScrAutoDisp”が、スクロールの登録に失敗したことを意味します。
スクロール登録に失敗した場合、その原因は次の4つに要約されます。

 ●スクロール登録失敗の原因

1)ノーマルスクロール画面の色数によるスクロール制限
 
NBG0,NBG1の色数設定により使用できないはずのスクロール面を登録しようとした。

2)回転スクロールデータによるバンク占有
 回転スクロール画面とノーマルスクロール画面のスクロールデータが同一のVRAMバンクに格納されている。

3)パターンネームデータ格納バンク制限
 末尾番号が等しいVRAMバンク双方にパターンネームデータが格納されている。

4)許容されるスクロール機能の逸脱
 登録しようとしたスクロール面が、同時に選択できるスクロール機能および面数を超えてしまっている。

 これを解決するには、それぞれ次のように対処してください。

 ●スクロール登録失敗時の対処法

1)の場合の対処法
 NBG0またはNBG1の色数を落とすか、NBG2またはNBG3の登録を諦める。

2)の場合の対処法
 回転スクロール画面とノーマルスクロール画面のスクロールデータを、それぞれ別のVRAMバンクに格納する。

3)の場合の対処法
 パターンネームデータのVRAMバンク格納制限を守る。

4)の場合の対処法
 登録するスクロール面数を減らす、機能設定中のキャラクタパターンの色数を落とす、縮小設定の値を大きくする、1つのVRAMバンクにあまり多くのスクロール画面のスクロールデータを詰め込まないようにするなどしてみてください。

VRAMのアクセス制限について

4)が引き起こされる原因は、VRAMバンクに対するアクセス制限が根拠となっています。しかしながら、VRAMアクセス制限の解説、それに伴う内容の読解は非常に困難です。そこでここでは、 単純にスクロールの機能と面数を抑えることで解決法・対処法とします。
VRAMアクセスに関する詳細は、“HARDWARE MANUAL vol.2:VDP2ユーザーズマニュアル”を参照してください。

描画開始

 ●描画宣言
 SGLでは、ライブラリ関数“slTVOn”が実行された時点で、始めてスクロール画面のモニターへの描画処理が開始されます。
以後、スクロール面は、格納されたスクロール情報(位置・スケール・回転角・グラフィックデータなど)に従い、走査線に同期してスクロール画面を描画し続けます。
また、この関数“slTVOn”と対になる関数として、関数“slTVOff”があります。これは、スクロールの描画処理中止を行うためのものです。

【void slTVOn ( void ) ;】
 描画設定されたスクロール画面の描画処理を開始します。

【void slTVOff ( void ) ;】
 描画設定されたスクロール画面の描画処理を中止します。

 ●描画設定
 機能設定されたスクロール面を実際にモニターに描画するかどうかの設定を行います。
関数“slScrAutoDisp”を利用してスクロール登録を済んだスクロール面は、登録の段階で描画設定がオンになっているのでそのままで描画が実行されますが、描画設定をオフにすることで描画しないようにすることも可能です。 また、いったん描画設定をオフにしたスクロール面も、描画設定をオンにすることで描画させることができます。

【void slScrDisp ( Uint32 mode ) ;】
 機能設定されたスクロール画面の描画設定を行います。
パラメータには、各スクロール面の描画設定に対応した下表の値が代入されます。

表8-19 “slScrDisp”のパラメータ代入値一覧(mode)
NBG0NBG1NBG2NBG3RBG0
ONOFFONOFFONOFFONOFFONOFF
代 入 値
NBG0ONNBG0OFFNBG1ONNBG1OFFNBG2ONNBG2OFFNBG3ONNBG3OFFRBG0ONRBG0OFF
ON:スクロール面を描画する
OFF:スクロール面を描画しない

注)上表の値はシステム付属の“sl_def.h”で定義されています。

 ●画面同期(スクロールの書き換え)
 走査線状態に応じて、スクロールの描画用データの書き換えを行います。

【void slSynch ( void ) ;】
 モニターが画面の書き換えを行っていない間に、描画用データを書き換えます。

スクロール描画までの流れ

 ここでは、スクロールデータの初期化から実際の描画までの流れをフローチャートで示すことで、スクロール機能設定から描画までのまとめとします。

フロー8-2 スクロール描画までの流れ

VRAM及びカラーRAMへのアクセスについて

 モニターの表示期間中にVRAMまたはカラーRAMへのアクセスが行われると、モニターにノイズが発生します。
このため、これら2つのRAM領域へのアクセスは、関数“slSynch”を使用してモニターの非表示期間中(ブランキング中)に行うか、関数“slTVOff”を使用してスクロールの描画処理を中断してから行うか、 または関数“slScrDisp”で描画設定をOFFにしてアクセスされないVRAMバンクに対してアクセスを行うかのいずれかの方法を実行してください。


戻る進む
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997