SACT2 CG加工

Last-modified: 2008-05-04 (日) 00:32:48

関数名に含まれる AMAP の意味

アルファマップの事である。グラフィックデータがアルファ値を持つことは最近では割と一般的で、System4に限ったものではないので、アルファ値の意味自体については適宜ぐぐる等して調べられたい。
以下、AMAP にまつわる処理の一例。

一例 スプライト画像反転 その1

SP_SET_CG を読み込んで作ったスプライトを左右反転させたり上下反転させたりする場合、void CG_COPY_REVERSE_LR とかその辺を関数を使う。

このとき、左右なら

  • CG_COPY_REVERSE_LR
  • CG_COPY_REVERSE_AMAP_LR

の二つの関数の両方を使わないといけない。前者だけだとαマップはそのままで画像だけ左右反転し、後者だと画像はそのままでαマップだけ反転する。結果、何が何だかよくわからない画像ができあがってしまう。ちょっと謎仕様。

とりあえず俺はこんな感じで動いてくれた

SP_SET_CG(6,CG_NUM);
SP_SET_CG(16,CG_NUM);
CG_COPY_REVERSE_AMAP_LR(6,0,0,16,0,0,240,300);
CG_COPY_REVERSE_LR(6,0,0,16,0,0,240,300);

最終的に使うのは 6 の方のスプライト。16のCGを反転して6に入れる作業を、画像とαマップで1回ずつやってる。なんとなく、6はSET_CGでなくて普通にCREATE_CGでもいい気がするけど。

一例 スプライト画像反転 その2

俺は反転・拡大縮小を一つの関数使ってやってる。

CGsize(int nSP,int nCG,int nXsize,int nYsize,int nCGmirror)
 - nSP = SP番号
 - nCG = CG変更する場合のリンク番号
 - nXsize = CGのXサイズ
 - nYsize = CGのYサイズ
 - nCGmirror = 1,左右反転、2.上下反転

以下ソース。ちょっと大ざっぱなやり方だけど動くことは動く。

void CGsize(int nSP,int nCG = 0, int nXsize = 0,int nYsize = 0,int nCGmirror = 0)
{
  if(nCG != 0){SP_SET_CG(nSP, nCG);}
  int nSP_Xsize = SACT.SP_GetWidth(nSP);
  int nSP_Ysize = SACT.SP_GetHeight(nSP); //元画像セットと元画像サイズ習得
  if(nXsize < 0){nXsize = nXsize * -1; nCGmirror = 1;}else if(nXsize == 0){nXsize = nSP_Xsize;}
  if(nYsize < 0){nYsize = nYsize * -1; nCGmirror = 2;}else if(nYsize == 0){nYsize = nSP_Ysize;}
  int nNEW_SP = SP_GET_UNUSE_NUM;
  SP_CREATE(nNEW_SP,nXsize,nYsize,0,0,0,255); //指定サイズでCG作成
  CG_COPY_STRETCH
    (nNEW_SP, 0,0, nXsize,   nYsize,     //------------コピー先画像
     nSP,     0,0, nSP_Xsize,nSP_Ysize); //------------コピー元画像
  CG_COPY_STRETCH_AMAP
    (nNEW_SP, 0,0, nXsize,   nYsize,
     nSP,     0,0, nSP_Xsize,nSP_Ysize);
  SP_CREATE(nSP,nXsize,nYsize,0,0,0,255);
  if(nCGmirror == 0 || nCGmirror > 2){SP_COPY(nSP, nNEW_SP, true);}
  if(nCGmirror == 1){
    CG_COPY_REVERSE_LR(     nSP,0, 0, nNEW_SP,0,0, nXsize,nYsize);
    CG_COPY_REVERSE_AMAP_LR(nSP,0, 0, nNEW_SP,0,0, nXsize,nYsize);}	//1:左右反転コピー
  if(nCGmirror == 2){
    CG_COPY_REVERSE_UD(     nSP,0, 0, nNEW_SP,0,0, nXsize,nYsize);
    CG_COPY_REVERSE_AMAP_UD(nSP,0, 0, nNEW_SP,0,0, nXsize,nYsize);}	//2:上下反転コピー
  SP_DEL(nNEW_SP);
}

一例 スプライト画像反転 その3

int 反転CG取得(int nCG) {
  // 元になるスプライトを作成する
  int sp = SP_GET_UNUSE_NUM();
  SP_SET_CG(sp, nCG);
  // CG情報を取得する
  cg_metrics_t cgmet;
  CG_GET_METRICS(nCG, cgmet);
  // 反転結果を描画するスプライトを作成する
  int sp_result;
  if (cgmet.bExistPixel && cgmet.bExistAlpha) {
    sp_result = SP_GET_UNUSE_NUM();
    SP_CREATE(sp_result, cgmet.nWidth, cgmet.nHeight, 255, 255, 255, 255);
  }
  else if (cgmet.bExistPixel && !cgmet.bExistAlpha) {
    sp_result = SP_GET_UNUSE_NUM();
    SP_CREATE_PIXEL_ONLY(sp_result, cgmet.nWidth, cgmet.nHeight);
  }
  else {
    SP_DEL(sp);
    return -1;
  }
  // 元CGからサーフェスを反転コピーする
  if (cgmet.bExistPixel) {
    CG_COPY_REVERSE_LR(sp_result, 0, 0, sp, 0, 0, cgmet.nWidth, cgmet.nHeight);
  }
  if (cgmet.bExistAlpha) {
    CG_COPY_REVERSE_AMAP_LR(sp_result, 0, 0, sp, 0, 0, cgmet.nWidth, cgmet.nHeight);
  }
  // 元CGを削除する
  SP_DEL(sp);
  // 戻り値
  return sp_result;
}

CG_COPY_ROTATE_Y に渡す引数の意味

void CG_COPY_ROTATE_Y(int nWrite,   // 結果を書き込むスプライト
                      int nDest,    // 回転するポリゴンの表裏を示すスプライト 1
                      int nSrc,     // 回転するポリゴンの表裏を示すスプライト 2
                      int nSx,      //
                      int nSy,      //
                      int nWidth,   //
                      int nHeight,  //
                      float fRotate,//
                      float fMag);  //

CG_COPY_ROTATE に関する注意事項

CG_COPY_ROTATE 系の関数は Write / Dest / Src 各サーフェスのサイズが全て同じであることを前提にしている
。このルールを守らないと思い通りの結果を得られない。

CG_COPY_STRETCH回しの注意点

拡大は基本一発決めに使う。段々大きくなるようなエフェクト、たとえば

int nL = 100;
for(;;nL++){CG_COPY_STRETCH(nDast,0,0,nL,nL,  nSrc,0,0,nW,nH);

こういう感じのコードは不可能と考えて良い。
一応動くことは動くが、画像が拡大しないまま下の方へ流れていくような現象が起こる。
もしもこのようなエフェクトを制作したい場合は、あらかじめSPを取っておき、
そのSPから順次拡大コピーしていく形が良いかもしれない。
(つまり一度拡大したCGをまた拡大させるのではなく、元画像から拡大させていく)