2013-10-12 78 views
0

我工作的个人的游戏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,宽度,高度,速度等的阵列。前四个是obrigatory。像“moveActor”或“moveOpposite”这样的函数可以与所有演员任意搭配。 collideWith是其中的一个功能。所以,我会解释一下:

它将第一个参与者和第二个参与者(它们至少是4的数组)作为参数,并且还将函数作为参数。这个参数函数也将一个actor作为参数并返回它。在collideWith函数内部,在测试之后,我用参数函数的结果更新第一个参数,并返回结果。我会申请这样的:

*player=*collideWith(player,blueEnemy,*moveOpposite(player)); 

当我尝试编译它,我得到一个可怕的错误:

cannot convert 'float' to 'float* (*)(float*)' for argument '3' to 'float* collideWith(float*, float*, float* (*)(float*))'| 

该碰撞功能,这需要另一个函数作为参数是我的发动机真的很重要。

+1

您可以切换到C++ 11(例如,通过更新编译器)和使用' std :: function'和匿名lambda函数? –

+0

从来没有这样做。我只在Python中使用lambda函数。我会在C++ 11中试用它:)。谢谢你的提示! –

回答

1

你调用需要传递一个函数,因此而不是

*player=*collideWith(player,blueEnemy,*moveOpposite(player)); 

,你可能只需要

*player=*collideWith(player,blueEnemy,&moveOpposite); 
+0

它工作得很漂亮!我非常感谢你!真!如果没有完全理解指针混沌,你可以走得太远,但在这样的情况下,你意识到你需要学习它哈哈。 –

相关问题