cocos2d-x制作类神经猫三消游戏《Rabbit Escape》的教程(五)完成游戏

一、前言
上一次(传送门:http://www.cocoachina.com/bbs/read.php?tid-286274.html),我们已经解决了游戏中的核心问题如何实现兔子的寻路移动。但是我们还没有添加游戏的成功失败判断和积分的管理,这次教程我们来完善它。

二、GameCtrl类中添加游戏的成功和失败判定,积分管理。
关于游戏的成功和失败判定,首先我们需要在头文件中添加相应的成员函数。

public:
    //判断成功
    bool judgeSuccess();
    //判断失败
    bool judgeFail();

```

关于游戏成功,玩过神经猫的童鞋都应该知道,只要将猫围住就算赢了,同比我们的游戏,只要将兔子围住就可以了。
bool GameCtrl::judgeSuccess(){
    //获取当前可遍历的方向
    vector moveDirs;
    this->getCurDirs(moveDirs,m_rabbitPos);
    for (auto it:moveDirs) {
        if (!m_gameMap->isObt){
            return false;
        }
    }
    return true;
}

```

实现起来的话,遍历当前兔子可以移动到的位置是不是都是障碍就行了,如果都是说明成功了,否则则没有成功。

关于游戏失败,只要当兔子此时的位置只要到达任意一条边界边上,则就说明兔子成功的逃脱了,游戏也失败了。
bool GameCtrl::judgeFail(){
    if (m_rabbitPos.hor==0||m_rabbitPos.ver==0||m_rabbitPos.hor==NUM_MAPROWANDCOW-1||m_rabbitPos.ver==NUM_MAPROWANDCOW-1) {
        return  true;
    }
    return  false;
}

```


ok,我们已经添加了完了成功和失败的判定,现在我们来添加积分的管理。
分析一下,在这个游戏中积分是什么,其实就是兔子移动的次数(step)。如果你能在兔子移动越少的情况下将兔子围住,当然就说明你越牛X。
在头文件中添加响应的成员变量和接口函数
 //当前移动步数
    int m_step;

public:
    //得到当前移动步数
    int  getStep(){return m_step;};

```


什么时候step增加呢?肯定是兔子移动的时候啊,我们修改下rabbitMove函数
int GameCtrl::rabbitMove() {
    Dir d = this->getRabbitMoveDir();
    if (Dir::none!=d) {
        //增加移动次数
        m_step++;
        m_rabbitPos=(*m_moveVec(int)d])+m_rabbitPos;
        return m_rabbitPos.ver*NUM_MAPROWANDCOW+m_rabbitPos.hor;
    }
    else{
        return VAL_MAX;
    }

}

```



三、HelloWorld中添加游戏成功和失败的部分
    首先修改之前,我们需要重新梳理一下游戏的逻辑流程。在添加了成功和失败判定部分后,我们游戏的逻辑流程应该是变成这样的:
    在每次触摸响应后:
        1.判断是否当前状态已经失败,如果是,则xxx
        2.添加障碍
        3.判断是否当前状态已经成功,如果是,则xxx
        4.兔子移动
       (游戏的逻辑流程是非常重要的,如果错了,那么整个游戏的运行方式将会发生很大的变化。)
       有了上面的基础我们来修改一下触摸响应函数,这里假设成功和失败后先让它们显示MessageBox然后重新加载场景。
bool HelloWorld::onTouchBeganCallBack(Touch *t, Event* event){
    for (auto it =m_pNodes_obstacle.begin();it!=m_pNodes_obstacle.end() ; it++) {
        if((*it)->getBoundingBox().containsPoint(t->getLocation())&&(!(*it)->isVisible())){
            
            //判断是否失败
            if (m_ctrl->judgeFail()) {
                MessageBox("没办法,AI就是任性", " =.=,兔子跑了!!");
                Director::getInstance()->replaceScene(HelloWorld::createScene());
            }

            //add obt
            auto pObt = (*it);
            pObt->setVisible(true);
            m_ctrl->addObtacle(pObt->getTag());
            
            //判断是否胜利
            if (m_ctrl->judgeSuccess()) {
                MessageBox("Success", "orz,兔子被围!!");
                Director::getInstance()->replaceScene(HelloWorld::createScene());
            }

            //rabbit move
            int moveTag = m_ctrl->rabbitMove();
                if(m_pNodes->getChildByTag(moveTag)){
                     m_pNode_rabbit->runAction(MoveTo::create(0.1, m_pNodes->getChildByTag(moveTag)->getPosition()));
            }
            break;
     }
   }
     return false;
}

```

现在再编译运行一下,就会发现,当兔子被我们围住或者成功逃脱后就会有了成功和失败的判定。


四、HelloWorld中添加积分管理的部分
   关于积分管理,这里我会用到一个Cocos2d-x中的用户数据管理UserDefault来管理玩家的最好成绩。
首先在头文件中添加两个string key
 
const string STR_STEP = "Step:"; //step的key
const string STR_BEST = "Best:"; //bestStep的key


```

然后在AppDelegate.cpp中初始化用户数据中最好成绩的值
//set user data
    if (0==UserDefault::getInstance()->getIntegerForKey(STR_BEST.c_str())) {
        UserDefault::getInstance()->setIntegerForKey(STR_BEST.c_str(),VAL_MAX);
    }

```

还需要修改一下触摸响应函数判定成功后的部分,使其能够修改最好成绩,并且在MessageBox上面显示出来。
            //判断是否胜利
            if (m_ctrl->judgeSuccess()) {
                if (UserDefault::getInstance()->getIntegerForKey(STR_BEST.c_str())>m_ctrl->getStep()) {
                    UserDefault::getInstance()->setIntegerForKey(STR_BEST.c_str(), m_ctrl->getStep());
                }
                
                //设置messageBox上面显示的信息
                char str_info;
                sprintf(str_info, "当前成绩为: %d,最好成绩为: %d",m_ctrl->getStep(),UserDefault::getInstance()->getIntegerForKey(STR_BEST.c_str()));
                MessageBox(str_info, "orz,兔子被围!!");
                Director::getInstance()->replaceScene(HelloWorld::createScene());
            }


```


ok,接下来我们会让两个分数显示到UI上面



![](http://cdn.cocimg.com/bbs/p_w_upload/Fid_41/41_300356_c4ba0c7af9e05fb.png?ra=0.19033564743585885)


这里再次会涉及到Cocos2d-x和CocosStudio两者之间的联系,需要使用UI::Text组件将其联系起来,添加响应的成员变量和成员函数。
//Step Text
    Text* m_pText_curStep;
    
    //BestStep Text
    Text* m_pText_bestStep;

    //设置Text
    void setText(Text* pTxt,int num);

```

讲一个实用技巧吧,这里我们可以观察下CocosStudio相对应控件属性的类型值


![](http://cdn.cocimg.com/bbs/p_w_upload/Fid_41/41_300356_62ddc418c6d1020.png?ra=0.21180030005052686)


可以对应到UI命名空间中同名控件,来实现两者的联系。
在init方法中获取Text
    //获取UITEXT
    m_pText_curStep = m_pNodes->getChildByName("Text_curStep");
    m_pText_bestStep =  m_pNodes->getChildByName("Text_bestStep");


```

我使用了一个setText的方法来设置他们的文本信息
void HelloWorld::setText(Text* pTxt,int num){
    std::stringstream stream;
    stream<>str;
    if(m_pText_curStep==pTxt){
        pTxt->setString(STR_STEP+str);
    }
    else{
        //如果不是第一次设置,则设置成对应值
        if(num!=VAL_MAX){
            pTxt->setString(STR_BEST+str);
        }
        else{
            pTxt->setString(STR_BEST);
        }
    }
    
}

```

C++的sstream可以实现int和string的转换(这里也可以使用Cocos2d-x中的数据结构Value实现,童鞋们可以思考一下)

我们还需要在适当的时候调用这个方法,场景进入(onEnter)以及兔子移动的时候。
void HelloWorld::onEnter(){
    Layer::onEnter();
    //生成12个障碍
    this->setRandStones(12);
    //设置UI上面Text
    this->setText(m_pText_curStep,m_ctrl->getStep());
    this->setText(m_pText_bestStep,UserDefault::getInstance()->getIntegerForKey(STR_BEST.c_str()));
}


   //rabbit move
            int moveTag = m_ctrl->rabbitMove();
                if(m_pNodes->getChildByTag(moveTag)){
                     m_pNode_rabbit->runAction(MoveTo::create(0.1, m_pNodes->getChildByTag(moveTag)->getPosition()));
                    //设置Text
                     this->setText(m_pText_curStep,m_ctrl->getStep());
            }

```

最后,是不是觉得每次障碍每次好像“假随机”一样总是生成到相同的位置,总是12个石头让人很不爽。
没事,我们来给它在app类的初始化方法中添加设置随机种子的函数,让它变成个“真随机"。
    //set rand
    srand(time(NULL));

```

然后,需改一下生成随机障碍的部分,让它每次生成不同数目的障碍。
const int NUM_INITSTONE = 8; //至少8个障碍
const int NUM_DEATALSTONE = 4; //变化的障碍数

void HelloWorld::onEnter(){
    Layer::onEnter();
    //生成随机的障碍
    this->setRandStones(NUM_INITSTONE+CCRANDOM_0_1()*NUM_DEATALSTONE);
    //设置UI上面Text
    this->setText(m_pText_curStep,m_ctrl->getStep());
    this->setText(m_pText_bestStep,UserDefault::getInstance()->getIntegerForKey(STR_BEST.c_str()));
 
}

```


Duang~~~,我们的《Rabbit Escape》就算完成了,赶快去抓兔子吧。

试玩展示视频:

http://player.youku.com/player.php/sid/XODkxMjkzNTcy/v.swf




五、最后说几句
    1.本教程算是完结了,虽然做的Demo比较简陋,但是希望童鞋们不要仅限于我带你们做出来的Demo,应该想一下给它添加你们自己的元素,比如背景音乐的添加,兔子的动画,游戏平衡的调整,寻路算法的优化等等.....希望每个看过这个教程的童鞋都能做出一个属于自己的神经兔。
    2.以后我还会把在学习cocos2d-x过程中一些有价值的Demo做出教程分享出来,如果大家有对教程什么不懂的地方以及我讲的什么不对的地方可以给我的论坛留言,或者新浪微博@Tezika给我私信,我会在第一时间内回复。
    3.本次教程资源:http://pan.baidu.com/s/1hqvhpU8,密码: gqn8 (资源文件包括项目文件夹中的Classes以及Resources文件夹,CocosStudio资源文件夹Rabbit).

为什么叫三消游戏呢?

消遣时间,消耗精力,消耗XXX…我想应该是介个意思。。

d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
2> HelloWorldScene.cpp
2>d:\cocosproject\cocos\cocosprojects\test\classes\helloworldscene.cpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 (…\Classes\GameCtrl.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\helloworldscene.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(70): error C2065: “hEstimate”: 未声明的标识符 (…\Classes\GameCtrl.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(71): error C2065: “fVal”: 未声明的标识符 (…\Classes\GameCtrl.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(71): error C2065: “VAL_MAX”: 未声明的标识符 (…\Classes\GameCtrl.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(78): error C2065: “hEstimate”: 未声明的标识符 (…\Classes\GameCtrl.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(79): error C2065: “fVal”: 未声明的标识符 (…\Classes\GameCtrl.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(79): error C2065: “VAL_MAX”: 未声明的标识符 (…\Classes\GameCtrl.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\helloworldscene.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(70): error C2065: “hEstimate”: 未声明的标识符 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(71): error C2065: “fVal”: 未声明的标识符 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(71): error C2065: “VAL_MAX”: 未声明的标识符 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(78): error C2065: “hEstimate”: 未声明的标识符 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(79): error C2065: “fVal”: 未声明的标识符 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(79): error C2065: “VAL_MAX”: 未声明的标识符 (…\Classes\AppDelegate.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(70): error C2065: “hEstimate”: 未声明的标识符 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(71): error C2065: “fVal”: 未声明的标识符 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(71): error C2065: “VAL_MAX”: 未声明的标识符 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(78): error C2065: “hEstimate”: 未声明的标识符 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(79): error C2065: “fVal”: 未声明的标识符 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(79): error C2065: “VAL_MAX”: 未声明的标识符 (…\Classes\HelloWorldScene.cpp)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(13): error C2039: “initMoveVec”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(14): error C2039: “initMapInfo”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(17): error C2039: “initMoveVec”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(19): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(20): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(21): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(22): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(23): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(24): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(25): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(26): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(29): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(29): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(30): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(30): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(31): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(31): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(32): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(32): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(33): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(33): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(34): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(34): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(35): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(35): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(36): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(36): error C2065: “m_moveVec”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(38): error C2039: “initMapInfo”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(43): error C2065: “i”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(44): error C3536: “pNewPos”: 初始化之前无法使用
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(44): error C2664: “void std::vector<_Ty>::push_back(Pos *&&)”: 不能将参数 1 从“int”转换为“Pos *&&”
2> with
2>
2> _Ty=Pos *
2> ]
2> 原因如下: 无法从“int”转换为“Pos *”
2> 从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(47): error C2065: “m_gameMap”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(47): error C2228: “.push_back”的左边必须有类/结构/联合
2> 类型是“‘unknown-type’”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(51): error C2059: 语法错误:“}”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(51): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(53): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(53): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(59): error C2039: “getRabbitMoveDir”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(67): error C2065: “VAL_MAX”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(72): error C2039: “getRabbitMoveDir”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(74): error C2065: “VAL_MAX”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(77): error C2355: “this”: 只能在非静态成员函数的内部引用
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(77): error C2227: “->getCurDirs”的左边必须指向类/结构/联合/泛型类型
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(77): error C2065: “m_rabbitPos”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(79): error C2065: “m_gameMap”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(79): error C2065: “m_rabbitPos”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(79): error C2228: “.ver”的左边必须有类/结构/联合
2> 类型是“‘unknown-type’”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(79): error C2228: “.hor”的左边必须有类/结构/联合
2> 类型是“‘unknown-type’”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(79): error C2227: “->isObt”的左边必须指向类/结构/联合/泛型类型
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(80): error C2355: “this”: 只能在非静态成员函数的内部引用
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(80): error C2227: “->setTargetPos”的左边必须指向类/结构/联合/泛型类型
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(80): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(81): error C3861: “AStart”: 找不到标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(83): error C2065: “m_targetPos”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(83): error C2227: “->fVal”的左边必须指向类/结构/联合/泛型类型
2> 类型是“‘unknown-type’”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(84): error C2065: “m_moveDirs”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(86): error C2355: “this”: 只能在非静态成员函数的内部引用
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(86): error C2227: “->resetMapFVal”的左边必须指向类/结构/联合/泛型类型
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(91): error C2059: 语法错误:“if”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(91): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(91): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(94): error C2059: 语法错误:“return”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(95): error C2059: 语法错误:“}”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(95): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(96): error C2039: “setTargetPos”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(96): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(96): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(140): error C2065: “VAL_MAX”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(142): warning C4018: “<”: 有符号/无符号不匹配
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(143): error C2039: “fVal”: 不是“Pos”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(55) : 参见“Pos”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(144): error C2039: “fVal”: 不是“Pos”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(55) : 参见“Pos”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(160): error C2039: “getCurDirs”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(166): error C2059: 语法错误:“}”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(166): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(168): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(168): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(190): error C2059: 语法错误:“}”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(190): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(191): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(191): error C2059: 语法错误:“}”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(193): error C2039: “getCurDirs”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(193): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(193): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(212): error C2143: 语法错误 : 缺少“;”(在“.”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(212): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(213): error C2059: 语法错误:“if”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(213): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(213): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(222): error C2059: 语法错误:“}”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(222): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(224): error C2143: 语法错误 : 缺少“;”(在“}”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(224): error C2059: 语法错误:“}”
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(225): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(225): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(229): error C2039: “resetMapFVal”: 不是“GameCtrl”的成员
2> d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.h(84) : 参见“GameCtrl”的声明
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(232): error C2065: “m_gameMap”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(232): error C2227: “->fVal”的左边必须指向类/结构/联合/泛型类型
2>d:\cocosproject\cocos\cocosprojects\test\classes\gamectrl.cpp(232): fatal error C1003: 错误计数超过 100;正在停止编译
2>d:\cocosproject\cocos\cocosprojects\test\classes\appdelegate.cpp(57): error C2065: “VAL_MAX”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\helloworldscene.cpp(38): error C2065: “pNode_scene”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\helloworldscene.cpp(42): error C2065: “pNode_scene”: 未声明的标识符
2>d:\cocosproject\cocos\cocosprojects\test\classes\helloworldscene.cpp(42): error C2227: “->getChildByName”的左边必须指向

注:没有改程序。大家有没有遇到这种情况的,怎么解决

我的能编译运行,但是点击生成障碍,它就识别我点击的障碍的上面一行的障碍,怎么办!!!!!!