加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

物理引擎中不规则物体的碰撞检测

发布时间:2020-12-14 19:06:39 所属栏目:百科 来源:网络整理
导读:在运用物理引擎的时候,经常回出现这种情况,不规则物体的碰撞检测无法更加精确的测量,那么,小杰今天就带您一起解决这个问题!!! 首先下载一个windows下面的软件 名称是:PhysicsEditor ,这个软件可以帮助你设计不规则的图形。软件的使用方法在这里不具

在运用物理引擎的时候,经常回出现这种情况,不规则物体的碰撞检测无法更加精确的测量,那么,小杰今天就带您一起解决这个问题!!!

首先下载一个windows下面的软件 名称是:PhysicsEditor ,这个软件可以帮助你设计不规则的图形。软件的使用方法在这里不具体讲解了,说一下注意的问题,添加进精灵后 :按照这个步骤走


好了,这时候 做完了就会生成 plist文件,把它和png图片一起拷进资源目录下面:


定义一个成员方法:

std::vector<std::vector<Vec2>> getShapeFromPlistFile(std::string fileName);

实现:
std::vector<std::vector<Vec2>> Chipmunck::getShapeFromPlistFile(std::string fileName){
	std::vector<std::vector<Vec2>> vectors;
	//从文件中读取plist文件,将内容读取到 vec中
	ValueVector vec = FileUtils::getInstance()->getValueVectorFromFile(fileName);
	
	for (int i =0;i<vec.size();i++){//遍历vec,得到所有的形状
		ValueVector shape = vec.at(i).asValueVector();
		std::vector<Vec2> points;
		for (int j=0;j<shape.size();j++){//遍历形状,拿到所有的点
			Vec2 point = PointFromString(shape.at(j).asString());
			points.push_back(point);//所有的点放在集合中
		}
		vectors.push_back(points);//所有的 形状 放在集合中
	}
	return vectors;
}

调用它:
void Chipmunck::addSprites(){
    auto circleSp = Sprite::create("c.png");
    circleSp->setPosition(visSize.width/2,visSize.height/2);
    this->addChild(circleSp);
    auto body = PhysicsBody::createCircle(circleSp->getContentSize().width/2);
    body->setMass(10000);
    body->setVelocity(Vec2(0,-1000));
    circleSp->setPhysicsBody(body);
    auto circleSp2 = Sprite::create("c.png");
    circleSp2->setPosition(visSize.width/2,20);
    this->addChild(circleSp2);
    auto body2 = PhysicsBody::createCircle(circleSp->getContentSize().width/2);
    body2->setMass(10000);
    body2->setDynamic(false);
    circleSp2->setPhysicsBody(body2);
    auto paoku = Sprite::create("paoku 00188.png");
    paoku->setPosition(Vec2(300,200));
    this->addChild(paoku);
    //通过传过去文件名字 获取 返回来的 所有 图形的集合(每个图形中存放着很多组成这个图形的所有的点)
    std::vector<std::vector<Vec2>> shapes = this->getShapeFromPlistFile("test.plist");
    //定义一个刚体
    auto ployon = PhysicsBody::create();
    for (auto shape:shapes){//遍历图形集合中的每个 图形
        //这里的shape.data是一个指向 第一个元素的指针  
        auto points = PhysicsShapePolygon::create(shape.data(),(int)shape.size());//根据这个图形创建刚体
        //points是一个点的数组
        ployon->addShape(points);//把所有的 放在 刚体中
    }
    paoku->setPhysicsBody(ployon);
    
}  

好了,这样基本就解决了!!,运行如图:


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读