デフォルト値として、
視点位置(X=画面横サイズ/2、Y=画面縦サイズ/2、Z=400)
中心点 (X=画面横サイズ/2、Y=画面縦サイズ/2、Z=0)
に設定しています。
このZ方向の差を256にすれば、中心としては合うと思います。
詳しく教えてください。例えばスプライト関数で視点と参照点間の距離が2.0の場合 の設定値はどのようになるのでしょうか?
X軸回転で後方に倒し込むと画面と垂直になるかならないかのところで一瞬 画面上から消えてさらに倒し込むと裏面がみえるようになる。ことでしょうか?
視点と回転面の中心点と平行になった場合にこの現象が起こります。 この対応策としては、視点と回転面の角度を常にチェックして 平行になる場合に、ソフト側で処理するようにすることをお進めします。
関数SCL_SetSpriteModeでもしタイプ0,3,4,8〜Fを設定しているか,何も 設定していない場合(0)の3ビット目が無視されるため起こりえます。
SPR_2SetCharにチェックルーチンを入れて調べて見ましたら、allocBlockで
まだ確保出来るメモリがあるのにNULLポインタが返って来ているようです。
また、毎回ライブラリィを変更するのも何なので、次回のバージョンアップより
SPR_2SetCharでスプライトを確保出来ないようならエラーを返す様に返すよう
にして頂けないでしょうか。
static Vaddr allocBlock( Uint16 size ){ NullBlock *memblk = nullBlockTop; NullBlock *prev = NULL; NullBlock *second_best = NULL; NullBlock *prev_second_best = NULL; Vaddr p = ( Vaddr )NULL; while( memblk != NULL ){ if( memblk->size == size ) break; if( memblk->size > size ){ if(( second_best == NULL ) ||(( second_best != NULL ) &&( memblk->size < second_best->size ))){ second_best = memblk; prev_second_best = prev; } } prev = memblk; memblk = memblk->next; } if( memblk == NULL ){ memblk = second_best; prev = prev_second_best; } if( memblk != NULL ){ Uint32 blocksize; memblk->size -= size; blocksize = ( Uint32 )memblk->size*32; p = ( Vaddr )(( Uint32 )memblk + blocksize - ( Uint32 )VRAM ); if(( memblk->size == 0 )&&( prev != NULL )) prev->next = memblk->next; } return p; }
なお、 Uint16 colorは、実際のハードウェア的なVDP1の動作では、コマンド
テーブル中のCMDCOLR(カラー制御ワード)に相当します。
CMDCOLR(カラー制御ワード)は、スクロール面とのプライオリティの指定
を行う際にも使用いたします。
詳しくは、
詳細→VDP2マニュアル 第9章「スプライトデータ」 例としてスプライトタイプ5の場合、VDP2マニュアルの図9.1 から解るよう にプライオリティ用ビットが3ビットありますので(図中のPR0〜PR2)、 '8通りのプライオリティレジスタ'を指定することが可能です。
*直接プライオリティの値を指定するわけではないのでご注意ください。
に、プライオリティビットを設定することで処理が行われます。
ビット位置は、使用するスプライトタイプによって変化します。
VDP2マニュアルの図9.1 を参照し、どのビットがプライオリティビットかを
ご確認ください。
0100000100000000 = 0x4100 ||| ||| ||| +++----------パレット1番を指定 +++--------------プライオリティレジスタ4を指定
一番最初は、512色以上取得することができますが、一度登録すると256色以上 確保できません。
対処方法としては、256色を越えたデータ領域の確保する場合は、
確保の最後に256色として関数をコールして、独自に管理するようにしてください。
通常は256色以上のカラーデータを使用するのはスプライトだと思いますので、
スプライトのカラーの確保を最後に行うようにしてください。