2015-07-14 5 views
0

Я хочу, чтобы запустить свой первый проект в визуальной студии, но, как вы видите, что, кажется, есть две ошибки, которые я понятия не имею, что они означаютЧто это значит для «callfuncN_selector» в Cocos2dx?

void CCloud::Start(){ 

    this->stopAllActions(); 

    float currentX = this->getPositionX(); 
    float distance = currentX - -(_xOffset); 
    float time = distance/_pixelsPerSec; 
    CCPoint destination = ccp(-_xOffset, this->getPositionY()); 

    CCMoveTo *actionMove = CCMoveTo::create(time, destination); 
    CCCallFuncN *actionMoveDone = CCCallFuncN::create(this, callfuncN_selector(CCloud::ReachedDestionation)); 

    this->runAction(CCSequence::create(actionMove, actionMoveDone, NULL)); 

} 

И две ошибки являются:

Ошибка 1 ошибка C2440: «тип cast»: невозможно преобразовать из 'void (__thiscall CCloud :: *) (void)' в 'cocos2d :: SEL_CallFuncN'

C: \ Users \ sergi_000 \ Downloads \ cocos2d-x-2.2 .3 \ projects \ myfirstapp \ Classes \ CCloud.cpp 27 1 HelloCpp

Ошибка 2 ошибки C2665: 'cocos2d :: CCCallFuncN :: create': ни одна из 2 перегрузок не могла преобразовать все типы аргументов

C: \ Users \ sergi_000 \ Downloads \ cocos2d-x-2.2.3 \ projects \ myfirstapp \ Classes \ CCloud.cpp 27 1 HelloCpp

Я был бы очень рад, если бы кто-то мог мне помочь, спасибо!

ответ

1

Указатель на функцию-член не совпадает с указателем на функцию, не являющуюся членом. Указателю на функцию-член требуется экземпляр для вызова.

Обычным решением является то, что библиотека, имеющая обратные вызовы, позволяет установить какие-то «пользовательские данные», которые затем можно установить на экземпляр объекта. Затем создайте обратную связь wrapper function, обычно как функция-член static (которая может использоваться как обычный указатель на функцию нечлена), и в этом получают пользовательские данные, отбрасывают их в правильный класс и вызывают функцию, которую вы действительно хочу позвонить.

Предостережение: я не знаю, поддерживает ли cocos2d-x пользовательские данные для обратных вызовов.

0

Насколько я знаю, #define callfuncN_selector(_SELECTOR) CC_CALLFUNCN_SELECTOR(_SELECTOR) устарел. Вы не должны его использовать.

Также CCloud :: ReachedDestionation требует функции, в которой в качестве входного сигнала принимался CCNode * (который также устарел). Проверьте, действительно ли это в вашем примере или исходном исходном коде, поэтому я могу получить лучший ответ.

Последнее (но не менее важное) - в целом хорошая практика старается не использовать устаревшие методы, поскольку обычно это означает, что у этого двигателя есть лучшая возможность.

-1

Вы должны использовать следующий код:

enter image description here