cocos2d-x-3.3-019-碰撞检测1-矩形区域是否相交

cocos2d-x-3.3-019-碰撞检测1-矩形区域是否相交,第1张

概述原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接 原理 Cocos里面的每个Node都有一个和它对应的矩形区域,通过api getBoundingBox()得到。碰撞监测就是判断两个物体的矩形区域是否有交叠,相应的API是intersectsRect。有交叠则认为是碰撞了。 Demo及源码 基于cocos 3.4final https://github.com/cheyiliu/C

原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接


原理 Cocos里面的每个Node都有一个和它对应的矩形区域,通过API getBoundingBox()得到。碰撞监测就是判断两个物体的矩形区域是否有交叠,相应的API是intersectsRect。有交叠则认为是碰撞了。 Demo及源码 基于cocos 3.4final https://github.com/cheyiliu/CollisionDetection Demo解读 每隔5s生成: 两架飞机,并从右往左飞行; 两颗子d,从左向右飞。 每一帧里面作碰撞检测,若有碰撞,则播放相应的动画。 为了追踪所有的子d和飞机,得有对应的辅助数据结构,这里采用Vector。 主要代码 开启相关timer
scheduleUpdate();        schedule(schedule_selector(HelloWorld::updateCustom),5.0f,kRepeatForever,0);
生成子d或者飞机并放到对应的辅助数据结构来跟踪
voID HelloWorld::buildBullet(int startX,int endX,int actualY) {    log("buildBullet");    std::string name = "bullet1.png";    auto sp = Sprite::createWithSpriteFramename(name);    Point startPos = Point(startX,actualY);    Point endPos = Point(endX,actualY);    sp->setposition(startPos);    sp->runAction(            Sequence::create(Moveto::create(3.0,endPos),CallFuncN::create(this,callfuncN_selector(HelloWorld::spriteDone)),NulL));    sp->setRotation(-90);    sp->setTag(TAG_BulLET);    mBullets.pushBack(sp);//放入数组    this->addChild(sp);}
每一帧里作碰撞监测,这里简单demo了下。 更复杂的逻辑处理见扩展阅读
voID HelloWorld::update(float dt) {//    log("update,%d",mPlanes.size());//    log("update,mBullets.size());    //碰撞检测    Vector<Sprite*> bulletsToBeRemoved;    Vector<Sprite*> planetoBeRemoved;    for (auto bullet : mBullets) {        for (auto plane : mPlanes) {            if (bullet->boundingBox().intersectsRect(plane->getBoundingBox())) {                log("碰撞了。。。。。。。。");                bulletsToBeRemoved.pushBack(bullet);                planetoBeRemoved.pushBack(plane);            }        }    }    // do remove    for (auto bullet : bulletsToBeRemoved) {        mBullets.eraSEObject(bullet);        log("removeChild(bullet)");        this->removeChild(bullet);    }    bulletsToBeRemoved.clear();    for (auto plane : planetoBeRemoved) {        mPlanes.eraSEObject(plane);        planeBlowup(plane);    }    planetoBeRemoved.clear();}
优缺点 优点: 对于简单需求,使用起来简单 缺点: 要费力的维护几个数组,当需求复杂时不易扩充和复用 效果图

https://github.com/cheyiliu/All-in-One/raw/master/res/cocos2d/CollisionDetection-way1-use-intersectsRect.gif

扩展阅读 AABB碰撞原理:http://www.jb51.cc/article/p-okjneale-bcr.html 飞机大战碰撞:http://www.jb51.cc/article/p-wfbmoohn-ep.html 总结

以上是内存溢出为你收集整理的cocos2d-x-3.3-019-碰撞检测1-矩形区域是否相交全部内容,希望文章能够帮你解决cocos2d-x-3.3-019-碰撞检测1-矩形区域是否相交所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1038726.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存