7

我正在使用 CCTouchTargetedDelegate 和一个由 CCSprite 子类化的类。在定义委托方法时,我无法在函数中使用“this”。

正如在先前提出的问题中所回答的那样,我无法使用范围解析将类的名称与函数一起使用,因为它随后给了我错误“'ccTouchBegan' 的外线定义与 'mygames::DragSprite 中的任何声明不匹配” '"

我还尝试在 .h 文件中声明该函数,但似乎没有任何效果。

我的代码如下:-

.h 文件

#pragma once
#include "cocos2d.h"




namespace mygames
{

    class DragSprite: public cocos2d::CCSprite, public cocos2d::CCTargetedTouchDelegate
    {
        public:
            DragSprite* createWithFile(const char *pszFileName);
            bool isTouchingOnSprite(cocos2d::CCPoint  touch);
            virtual bool init();
        bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
        static inline cocos2d::CCPoint ccpSub(const cocos2d::CCPoint v1, const cocos2d::CCPoint v2);
        private:
            bool isDrag;
            cocos2d::CCPoint whereTouch;
    };
}

.cpp 文件

#include "DragSprite.h"


using namespace mygames;


bool DragSprite::init()
{
    if (!CCSprite::init()) {
        return false;
    }

    whereTouch = cocos2d::CCPointZero;
    isDrag = false;

    return true;
}
DragSprite* DragSprite::createWithFile(const char *pszFileName)
{
    DragSprite *pSprite = new DragSprite();
    if (pSprite&&pSprite->initWithFile(pszFileName))
    {
        cocos2d::CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(pSprite, 0, true);
        pSprite->autorelease();
        return pSprite;
    }
    CC_SAFE_DELETE(pSprite);
    return NULL;
}

bool DragSprite::isTouchingOnSprite(cocos2d::CCPoint  touch)
{

    if (this->boundingBox().containsPoint(touch)) {
        return true;
    }else
    {
        return false;
    }    

}
static inline cocos2d::CCPoint ccpSub(const cocos2d::CCPoint v1, const cocos2d::CCPoint v2)
{
    return ccp(v1.x-v2.x, v1.y-v2.y);

}
//CCTargetedTouchDelegate
bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{

    cocos2d::CCPoint touchPoint = pTouch->getLocation();

    if (this->isTouchingOnSprite(touchPoint)) {
        this->whereTouch = ccpSub(this->position, touchPoint);
        return true;
    }
    return false;
}

错误屏幕截图:-

我在这里想念什么?

只是出于好奇

如答案中所建议,如果我使用

bool DragSprite::ccTouchBegan

那么,它还会调用deletete函数吗?或者只是我的 DragSprite 类中的函数。我的意思是,该功能是否仍会被覆盖?嗯...它是在 CCTargetedTouchDelegete 中声明的方法。我猜它是一个抽象函数。

4

3 回答 3

17
bool ccTouchBegan(

需要是

bool DragSprite::ccTouchBegan(

你不应该this首先需要。

于 2014-05-05T06:24:21.257 回答
0

为什么不将您的功能定义为

bool DragSprite::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)

这就是您在 .h 文件的 DragSprite 类中定义它的方式。

于 2014-05-05T06:24:16.600 回答
0

bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)

定义了一个独立的函数。this 只能在类成员函数中使用。要使其成为您定义的类成员,您需要限定名称:

bool DragSprite::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)

-=-=-=-=

我看到每个人都立刻跳了进去。目标 C 的语法不同。它用

@implementation DragSprite
 . . . . 

@end 

指定类并需要 - 来表示非静态成员函数。

另一个区别是Objective C需要自引用来调用成员函数

[self DragSprite] ;

C++ 没有

DragSprite () ;
于 2014-05-05T06:26:44.973 回答