您的位置:首页 > 其它

如何使用PhysicsEditor 创建多边形碰撞形状 并实行读取

2014-09-26 21:16 337 查看
关于如何使用PhysicsEditor创建多边形形状请参考http://www.2cto.com/kf/201408/327977.html,在此就不多说了,关键是在读取的时候感觉作者那样有点麻烦,在此做了一些改动,希望能帮到需要的朋友,如有不对请留言。谢谢。

直接上代码。

physical.h

#ifndef __PHYSICAL_

#define __PHYSICAL_

#include "cocos2d.h"

using namespace cocos2d;

#define NUM_OF_ENEMY 2

class Physical :public Layer{

protected:

virtual bool init();

PhysicsWorld* m_world;

void setPhysicalWord(PhysicsWorld * word){m_world = word;};

char* vertexesFlies[NUM_OF_ENEMY];

public:

CREATE_FUNC(Physical);

static Scene * createScene();

Physical();

std::vector<std::vector<Vec2>> getPhysicsShapeByName(const char * name);

std::map<std::string, std::vector<std::vector<Vec2>>> vertexesMap;

std::vector<std::vector<Vec2>> getPhysicsShapeVertexesFromFile(const std::string plistFile);

void loadShapes();

void initPhysicsBody(int index,Sprite * sp);

void onEnter();

};

#endif

Physical.cpp

#include "Physical.h"

int ball1Mask = 1 << 0;//球1

int ball2Mask = 1 << 1;//球2

int wallMask = 1 << 2;//地面

Physical::Physical(){

vertexesFlies[0] = "paoku1.plist";

vertexesFlies[1] = "paoku2.plist";

}

Scene * Physical::createScene(){

auto scene = Scene::createWithPhysics();

scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);

auto layer = Physical::create();

layer->setPhysicalWord(scene->getPhysicsWorld());

scene->addChild(layer);

return scene;

}

bool Physical::init(){

if (!Layer::init())

{

return false;

}

this->loadShapes();

auto sp1 = Sprite::create("paoku 00195.png");

initPhysicsBody(0,sp1);

sp1->setPosition(480,320);

this->addChild(sp1);

auto sp2 = Sprite::create("paoku 00194.png");

initPhysicsBody(1,sp2);

sp2->setPosition(200,200);

this->addChild(sp2);

return true;

}

//读取所有的形状数组

std::vector<std::vector<Vec2>> Physical::getPhysicsShapeVertexesFromFile(const std::string plistFile) {

std::vector<std::vector<Vec2>> vertexes;

ValueVector v = FileUtils::getInstance()->getValueVectorFromFile(plistFile);

for (int i=0; i<v.size(); i++) {

ValueVector ver = v.at(i).asValueVector();

std::vector<Vec2> stdVer;

for (int j = 0; j < ver.size(); j++){

Vec2 xy = PointFromString(ver.at(j).asString());

stdVer.push_back(xy);

}

vertexes.push_back(stdVer);

}

return vertexes;

}

std::vector<std::vector<Vec2>> Physical::getPhysicsShapeByName(const char * name) {

return vertexesMap.at(name);

}

//加载文件

void Physical::loadShapes() {

for (int i = 0; i < NUM_OF_ENEMY; i++) {

vertexesMap[vertexesFlies[i]] = getPhysicsShapeVertexesFromFile(vertexesFlies[i]);

}

}

//读取形状并付给精灵

void Physical::initPhysicsBody(int index,Sprite * sp) {

auto vertexes = this->getPhysicsShapeByName(StringUtils::format("paoku%d.plist",index+1).c_str());

auto body = PhysicsBody::create();

for (auto shapeVex : vertexes) {

auto shape = PhysicsShapePolygon::create(shapeVex.data(), shapeVex.size());

body->addShape(shape);

}

// auto shape = PhysicsShapeCircle::create(10);

// body->addShape(shape);

body->setCategoryBitmask(1);

//是否设置物体为静态

body->setDynamic(true);

//设置物体的恢复力

body->getShape(0)->setRestitution(1.0f);

//设置物体的摩擦力

body->getShape(0)->setFriction(9.0f);

//设置物体密度

body->getShape(0)->setDensity(5.0f);

//设置质量

body->getShape(0)->setMass(5000);

//设置物体是否受重力系数影响

body->setGravityEnable(true);

//设置物体的冲力

Vect force=Vect(50000.0f, 50000.0f);

body->applyImpulse(force);

sp->setPhysicsBody(body);

//创建一个盒子,用来碰撞

Sprite* edgeSpace=Sprite::create();

Size visibleSize = Director::getInstance()->getVisibleSize();

PhysicsBody* boundBody=PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,3);

boundBody->getShape(0)->setFriction(0.0f);

boundBody->getShape(0)->setRestitution(1.0f);

edgeSpace->setPhysicsBody(boundBody);

edgeSpace->setPosition(Point(visibleSize.width/2,visibleSize.height/2));

this->addChild(edgeSpace);

edgeSpace->setTag(0);

body->setCategoryBitmask(ball1Mask);

body->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);

body->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);

body->setCategoryBitmask(ball2Mask);

body->setCollisionBitmask(wallMask|ball1Mask|ball2Mask);

body->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);

boundBody->setCategoryBitmask(wallMask);

boundBody->setCollisionBitmask(wallMask | ball1Mask|ball2Mask);

boundBody->setContactTestBitmask(wallMask|ball1Mask|ball2Mask);

}

void Physical::onEnter(){

Layer::onEnter();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: