私はSDLを使用して個人的なゲームに取り組んでおり、2つの配列があります:
float player[]={...};
float blueEnemy[]={...};
私も関数を持っています:
float *moveOpposite(float *actor) {
// Skipped content.
return actor;
}
そして、私は問題のあるものを持っています:
float *collideWith(float *x, float *y, float *(f)(float *a)) {
if ((((x[0]+x[2])>y[0])&&(x[0]<(y[0]+y[2])))&&(((x[1]+x[3])>y[1])&&(x[1]<(y[1]+y[3])))) {
*x = *f(x);
}
return x;
}
衝突の混乱を無視します。私のゲームでは、アクターは xPos、yPos、幅、高さ、速度などの配列です。最初の 4 つは必須です。「moveActor」や「moveOpposite」などの関数は、すべてのアクターで任意に機能します。CollideWith はこれらの関数の 1 つです。だから、私はそれを説明します:
最初のアクターと 2 番目のアクター (少なくともサイズ 4 の配列) をパラメーターとして取り、関数もパラメーターとして取ります。この引数関数もアクターを引数として取り、それを返します。テストの後、collideWith 関数内で、最初の引数を引数関数の結果で更新し、結果を返します。私は次のように適用します:
*player=*collideWith(player,blueEnemy,*moveOpposite(player));
コンパイルしようとすると、恐ろしいエラーが発生します。
cannot convert 'float' to 'float* (*)(float*)' for argument '3' to 'float* collideWith(float*, float*, float* (*)(float*))'|
別の関数を引数として取るこの衝突関数は、私のエンジンにとって非常に重要です。