1. 程式人生 > >物理引擎中不規則物體的碰撞檢測

物理引擎中不規則物體的碰撞檢測

在運用物理引擎的時候,經常回出現這種情況,不規則物體的碰撞檢測無法更加精確的測量,那麼,小杰今天就帶您一起解決這個問題!!!

首先下載一個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);
    
}  

好了,這樣基本就解決了!!,執行如圖: