エフェクト講座
エフェクト関連の質問が多い気がするので、作成することにしました。
エフェクトオブジェクトの作成はできるけどそっから先が分からん!って人向けです。
エフェクトオブジェクト(ph3)
ph3のエフェクトオブジェクトでは、
OBJ_PRIMITIVE_2D :2D空間自由変形オブジェクト(v0.12m時代のものとほぼ同じもの)
OBJ_SPRITE_2D :2D空間矩形オブジェクト(ObjSprite2D_を使用可能なオブジェクト)
OBJ_SPRITE_LIST_2D:2D空間矩形リストオブジェクト(ObjSpriteList2D_を使用可能なオブジェクト)
OBJ_PRIMITIVE_3D :3D空間自由変形オブジェクト
OBJ_SPRITE_3D :3D空間矩形オブジェクト(ObjSprite3D_を使用可能なオブジェクト)
があります。この講座では、最も使われる事が多いであろう、
「OBJ_SPRITE_2D」を解説することにします。
まずは使用する関数を紹介しましょう。
使用関数
ObjPrim_Create:エフェクトオブジェクトを作成します。
ObjRender_SetPosition:エフェクトオブジェクトを表示する座標を設定します。
Z座標については、「〜3D」系統のエフェクトを作成した時以外は0を設定しておけばいいでしょう。
この関数は、エフェクトオブジェクト共通の関数です。
なお、ObjMove系統の関数は使えません。注意しましょう。
ObjPrim_SetTexture:指定したオブジェクトにテクスチャを設定します。この関数を実行しないとエフェクトは表示されません。
この関数は、2Dエフェクトオブジェクト共通の関数です。
ObjSprite2D_SetSourceRect:指定したオブジェクトの描画元テクスチャ座標を設定します。
ObjPrim_SetTextureで設定した画像の、「どの部分の画像を使うか」を設定する関数です。
ObjSprite2D_SetDestRect:指定したオブジェクトの描画先の矩形座標を設定します。
ObjSprite2D_SetSourceRectで指定した画像の左端、上端、右端、下端を、
ObjRender_SetPositionで設定した座標から見た相対座標で設定する関数です。
ObjSprite2D_SetSourceRectを先に実行する必要があります。
→ObjSprite2D_SetDestCenter:ObjSprite2D_SetSourceRectで切り出した画像の中心が、
ObjRender_SetPositionで設定した座標となるように設定する関数です。
次の関数は、エフェクトオブジェクト共通の関数です。
ObjRender_SetAngleXYZ:エフェクトオブジェクトのX,Y,Z角度を設定します。
それぞれ、X軸,Y軸,Z軸を軸として回転します。X角度は鉄棒、Y角度は回転ドア、Z角度は通常使っている角度と同じ、
と覚えるといいでしょう。
ObjRender_SetScaleXYZ:エフェクトオブジェクトのX,Y,Z拡大率を設定します。
ObjRender_SetBlendType:描画先への画像合成方法を設定します。
BLEND_ALPHA:通常の描画方法です。α値(画像の透明度)が適用されます。
BLEND_ADD_RGB:加算合成を行います。あまり推奨できません。
BLEND_ADD_ARGB:α値が適応される加算合成を行います。通常はこれを使います。重ねるほど明るくなっていきます。
BLEND_MULTIPLY:乗算合成です。色付きセロハンのような効果です。
BLEND_SUBTRACT:減算合成です。重ねるほど色が黒くなっていきます。
BLEND_INV_DESTRGB:描画先の色を反転して合成します。画像の(RGB=255,255,255、真っ白)の部分に重なった色が反転されます。
ObjRender_SetAlpha:画像のα値を設定します。255に近づくほど不透明になり、0に近づくほど透明になります。
ObjRender_SetColor:画像の色合いを変更します。255,255,255を設定すると、元のテクスチャと同じ色合いになります。
これが基本で使用する関数です。
実際に使用する際はこんな風になります。example.pngは、256x256の真っ白な画像とします。
task EffectTest
{
let obj = ObjPrim_Create(OBJ_SPRITE_2D);
ObjPrim_SetTexture(obj, GetCurrentScriptDirectory~"example.png");//エフェクトオブジェクトに画像を割り当てる
ObjSprite2D_SetSourceRect(obj, 0, 0, 256, 256);//画像の切り出し範囲を設定する
ObjSprite2D_SetDestCenter(obj);//画像の端の相対座標を設定する
//(ObjSprite2D_SetDestRect(obj, -128, -128, 128, 128)と書いても良い)
ObjRender_SetPosition(obj, 192, 224, 0);//画像の表示位置を設定する
ObjRender_SetAngleXYZ(obj, 0, 0, 0);//画像の表示角度を設定する
while(!Obj_IsDeleted(obj))
{
ObjRender_SetAngleZ(obj, ObjRender_GetAngleZ(obj)+1);
yield;
}
}
このタスクを実行すると、真っ白な画像がSTG画面中央に表示され、時計回りに回転していくと思います。
このタスクで何がどうなっているのかわかれば、いずれエフェクトオブジェクトを自由に扱えるようになるでしょう。