意外とできた歪みエフェクト。
地霊殿以降のボス周囲に使われている歪みエフェクトなんかもこれで再現できるはず……
教科書とか読んでないからあれだけどコードを置いておきます(DxLibのインクルードと初期化が必要)
//画像を歪めて表示
//r(半径)は2の累乗で。img_handleの画像はr*rのものを用意すること。
//angle_amp, r_ampはそれぞれ角度・半径の振幅。
void DistortionGraph(int img_handle, double x, double y, double r, double angle_amp, double r_amp, double phase)
{
static const double PI2 = 6.28318531;
static const int num = 16; //分割列数
static const int VERTEX_MAX = num * (num * 2 + 1) + 1;
static VERTEX v[VERTEX_MAX]; //頂点
static int flag = 0;
//vの初期化
if(flag == 0)
{
memset(v, 0, sizeof(VERTEX) * VERTEX_MAX);
int s = num * 2 + 1; //一列あたりの頂点数
for(int i = 0; i < VERTEX_MAX; i++) {
v[i].u = ((s - abs(i % (s * 2) - s)) / 2) / (float)num;
v[i].v = ((i + i / s) % 2 + i / s) / (float)num;
v[i].a = v[i].r = v[i].g = v[i].b = 255;
}
flag = 1;
}
double s, t, d, angle_dist, r_dist, cost, sint;
for(int i = 0; i < VERTEX_MAX; ++i) {
s = v[i].u - 0.5;
t = v[i].v - 0.5;
d = 1 - 2 * sqrt(s * s + t * t);
//このへんを適当に弄って調整
angle_dist = angle_amp * max(0, d) * sin(d * PI2 * 2 + phase);
r_dist = r_amp * max(0, min(1 - d, d)) * (1 + sin(d * PI2 + phase));
cost = cos(angle_dist);
sint = sin(angle_dist);
v[i].x = x + ( cost * s + sint * t) * (r + r_dist) * 2;
v[i].y = y + (-sint * s + cost * t) * (r + r_dist) * 2;
}
DrawPolygonBase(v, VERTEX_MAX, DX_PRIMTYPE_TRIANGLESTRIP, img_handle, 0);
}
最終更新:2010年01月22日 02:16