cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測

玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件。还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸,当子弹与僵尸碰撞的时候子弹自己主动消失,这就这节要说的碰撞检測。

以下详细看代码的实现:

做ios开发有触摸事件cocos2d相同也有

一、先覆写touch事件

.h文件

using namespace cocos2d;


class MainScene:public CCLayer {

private:

    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); //覆写虚函数


.m文件实现

要想让层接收触摸事件要先使能触摸:

在初始化函数要加入

    setTouchEnabled(true); //接收触屏事件

//触屏事件调用的方法

void MainScene::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)

{

    CCTouch *touch = (CCTouch *)pTouches->anyObject();

    CCPoint point = touch->getLocation(); //得到触摸的点 (位置)

    

    CCSprite *sp = CCSprite::create("Peashooter1.tiff"); //创建一个精灵

    sp->setPosition(point);  //设置精灵的位置为触摸点的位置

    this->addChild(sp);

    

}

执行:

在屏幕上任意点击:


能够看到点击的地方就出现一个豌豆。

再添加一些功能,如今的豌豆不会动,以下给豌豆做一个摇头的帧动画。

先加入13张摇头的帧图片:


//触屏事件调用的方法

void MainScene::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)

{

    CCTouch *touch = (CCTouch *)pTouches->anyObject();

    CCPoint point = touch->getLocation(); //得到触摸的点 (位置)

    

    CCSprite *sp = CCSprite::create("Peashooter1.tiff"); //创建一个精灵

    sp->setPosition(point);  //设置精灵的位置为触摸点的位置

    this->addChild(sp);

    

    //帧动画

    CCAnimation *animation = CCAnimation::create();

    for (int i=1; i<=13; i++) {

        CCString *string = CCString::createWithFormat("Peashooter%d.tiff",i);

        CCSpriteFrame *frame = CCSpriteFrame::create(string->getCString(), CCRectMake(0, 0, 71, 71));

        

        animation->addSpriteFrame(frame);

    }

    animation->setDelayPerUnit(0.1);

    animation->setLoops(-1);  //循环的次数 -1 无限次

    CCAnimate *animate = CCAnimate::create(animation); //加入到动画

    

    sp->runAction(animate);  //执行动画

}

执行:



能够看到 小豌豆在摇头。。


以下看精灵碰撞检測:

碰撞检測说得简单点事实上就是说一个精灵的移动到的位置是否在另外一个精灵位置的包括内。

详细实现:

.h文件 定义

class MainScene:public CCLayer {

private:

    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); //覆写虚函数

    CCSprite *zom;   //子弹精灵

    CCSprite *pb;    //僵尸精灵


.m文件实现

    //子弹

    pb = CCSprite::create("PB01.png");

    pb->setPosition(ccp(20, 300));

    this->addChild(pb);

    

    CCMoveBy *by = CCMoveBy::create(4, ccp(800, 0)); //4s移动到800的位置

    pb->runAction(by);

    

    //僵尸

    zom = CCSprite::create("Zombie1.tiff");

    zom->setPosition(ccp(810, 300));

    this->addChild(zom);

    

    //设置帧回掉函数

    this->schedule(schedule_selector(MainScene::update));


//回掉函数:

//回掉函数

void MainScene::update(float t)

{

    /*设置回掉函数的操作*/

    

    //让每一帧向右移动 记得把sprite设置为全局变量

   // sprite->setPosition(ccpAdd(sprite->getPosition(), ccp(1, 0))); //让精灵每一帧 x轴上加1


    if(pb!= NULL && pb->boundingBox().intersectsRect(zom->boundingBox())) //两个精灵碰撞

    {

        CCLOG("碰撞!!!");

        //碰撞了 让子弹消失

        pb->stopAllActions();

        pb->removeFromParentAndCleanup(true);

        pb = NULL;

    }

}

执行:

 精灵在运动!!


当碰撞到了子弹消失。碰撞!!被打印出来、、

这就是这节要写的内容,大家能够自己试一下。。

原文地址:https://www.cnblogs.com/lcchuguo/p/5222922.html