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

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

原理

  • Cocos里面的每个Node都有一个和它对应的矩形区域,通过api getBoundingBox()得到。碰撞监测就是判断两个物体的矩形区域是否有交叠,相应的API是intersectsRect。有交叠则认为是碰撞了。

Demo及源码

Demo解读

  • 每隔5s生成: 两架飞机,并从右往左飞行; 两颗子弹,从左向右飞。
  • 每一帧里面作碰撞检测,若有碰撞,则播放相应的动画。
  • 为了追踪所有的子弹和飞机,得有对应的辅助数据结构,这里采用Vector。

主要代码

  • 开启相关timer
        scheduleUpdate();
        schedule(schedule_selector(HelloWorld::updateCustom), 5.0f,
                kRepeatForever, 0);
  • 生成子弹或者飞机并放到对应的辅助数据结构来跟踪
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, %d", 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

扩展阅读

时间: 2024-07-28 23:05:27

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

Win32 GDI 非矩形区域剪裁,双缓冲技术

传统的Win32通过GDI提供图形显示的功能,包括了基本的绘图功能,如画线.方块.椭圆等等,高级功能包括了多边形和Bezier的绘制.这样app就不用关心那些图形学的细节了,有点类似于UNIX上的X-window协议.你信或者不信,那些看上去很花哨的控件,其实就是一笔一划画上去的而已.GDI提供了画笔(用于线条).画刷(用于填充).调色板(用于支持256色显示).字体(用于文字).如果简单的图形不足以表达,你可以使用位图和画布(DC,设备上下文)直接将图像绘制到屏幕上去.此外,GDI还支持一些简

在图片上画矩形并高亮显示矩形区域、统计矩形区域中像素情况并绘制直方图

<学习OpenCV>中文版第4章第3题 提纲 题目要求 程序代码 结果图片 题目要求: ①允许用户在图片上选择一个矩形区域,当鼠标放开,高亮显示矩形区域 ②在另一个独立窗口中,使用绘图函数绘制一个图表,分别用蓝.绿和红色表示选中区域中各种颜色的像素在指定数值范围内的数量. 程序代码: 1 #include "stdafx.h" 2 #include <cv.h> 3 #include <highgui.h> 4 using namespace std

玩转Android Camera开发(四):预览界面四周暗中间亮,仅仅拍摄矩形区域图片(附完整源代码)

杂家前文曾写过一篇关于仅仅拍摄特定区域图片的demo.仅仅是比較简陋.在坐标的换算上不是非常严谨,并且没有完毕预览界面四周暗中间亮的效果,深以为憾.今天把这个补齐了. 在上代码之前首先交代下,这里面存在着换算的两种模式.第一种,是以屏幕上的矩形区域为基准进行换算.举个样例.屏幕中间一个 矩形框为100dip*100dip.这里一定要使用dip为单位,否则在不同的手机上屏幕呈现的矩形框大小不一样. 先将这个dip换算成px.然后依据屏幕的宽和高的像素计算出矩形区域,传给Surfaceview上铺的

cvGetCol与cvGetCols 获取列 cvGetSubRect获取图像的矩形区域

程序: 代码: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> int GetCol(int argc,char** argv) { IplImage* src=cvLoadImage("e:\\picture\\4.jpg"); IplImage* dst1=cvCreateImage(cvSize(1,sr

【LeetCode-面试算法经典-Java实现】【223-Rectangle Area(矩形区域)】

[223-Rectangle Area(矩形区域)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun-Chao] 原题 Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined by its bottom left corner and top right corner

玩转Android Camera开发(四):预览界面四周暗中间亮,只拍摄矩形区域图片(附完整源码)

杂家前文曾写过一篇关于只拍摄特定区域图片的demo,只是比较简陋,在坐标的换算上不是很严谨,而且没有完成预览界面四周暗中间亮的效果,深以为憾,今天把这个补齐了. 在上代码之前首先交代下,这里面存在着换算的两种模式.第一种,是以屏幕上的矩形区域为基准进行换算.举个例子,屏幕中间一个 矩形框为100dip*100dip.这里一定要使用dip为单位,否则在不同的手机上屏幕呈现的矩形框大小不一样.先将这个dip换算成px,然后根据屏幕的宽和高的像素计算出矩形区域,传给Surfaceview上铺的一层Vi

根据size截取屏幕中间矩形区域

代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(50, 100, 200, 200)]; imageView.backgroundColor=[UIColor redColor]; //显示截取的图 imageVie

切角矩形区域与六边形区域

切角矩形区域 <div class="one"><div class="two"></div></div> .one{ width:300px; height: 300px; margin: 100px auto; border: 1px solid red; position: relative; transform: rotate(45deg); overflow: hidden; visibility: hidd

相机只拍摄矩形区域图片

相机只拍摄矩形区域图片 本项目拍照只获取自定义的矩形区域图片的一个小例子,这个例子拍出来的图片直接储存到sd卡了,有这方面需求的朋友可以研究一下,项目有中文注释,默认编译版本4.4.2编码GBK 下载地址:http://www.devstore.cn/code/info/535.html 运行截图: 热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章

根据size截取图片中间矩形区域的图片 这里的size是正方形

#pragma mark 根据size截取图片中间矩形区域的图片 这里的size是正方形 -(UIImage *)cutCenterImage:(UIImage *)image size:(CGSize)size{ CGSize imageSize = image.size; CGRect rect; //根据图片的大小计算出图片中间矩形区域的位置与大小 if (imageSize.width > imageSize.height) { float leftMargin = (imageSize