zoukankan      html  css  js  c++  java
  • 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;

        }

    }

    执行:

     精灵在运动!!


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

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

  • 相关阅读:
    小程序前端直传阿里云oss的一些记录
    小程序的两种分页做法(后端返回分页及总页数字段与否)
    小程序模糊搜索(词汇联想)
    小程序自定义组件的两种方式
    js对数据的一些处理方法(待完善)
    小程序关于登录授权回跳页面的两个问题记录
    小程序登录的一些简单步骤
    关于js的方括号[]属性赋值的一些记录
    js状态转化的简单写法
    微信企业号开发node版
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5222922.html
Copyright © 2011-2022 走看看