Я работаю над личной игрой с SDL, и у меня есть два массива:
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, шириной, высотой, скоростью и т.д. Первые четыре являются отвратительными. Такие функции, как "moveActor" или "moveOpposite", работают произвольно со всеми участниками. collideWith является одной из этих функций. Итак, я объясню это:
Он принимает первого актера и второго актера (которые представляют собой массивы с размером не менее 4) в качестве параметров, а также выполняет функцию в качестве параметра. Эта аргумент-функция также принимает актера в качестве аргумента и возвращает его. Внутри функции collideWith после теста я обновляю первый аргумент с результатом аргумент-функции и возвращаю результат. Я бы применил его так:
*player=*collideWith(player,blueEnemy,*moveOpposite(player));
Когда я пытаюсь скомпилировать его, я получаю ужасную ошибку:
cannot convert 'float' to 'float* (*)(float*)' for argument '3' to 'float* collideWith(float*, float*, float* (*)(float*))'|
Эта функция столкновения, которая принимает другую функцию в качестве аргумента, действительно важна для моего движка.
Ваш вызов должен передать функцию, следовательно, вместо
*player=*collideWith(player,blueEnemy,*moveOpposite(player));
вам просто нужно
*player=*collideWith(player,blueEnemy,&moveOpposite);