如何使用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();
}
直接上代码。
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();
}
相关文章推荐
- 解决:Android使用自带sqlite开发时,apk中创建的数据库外部的进程是没有权限去读/写的,而且无法如何读取指定目录下的db文件
- 如何创建和读取excel文件-poi的简单使用(一)
- 如何创建和读取excel文件-poi的简单使用
- 使用PhysicsEditor为物理引擎创建刚体形状
- asp.net如何使用cookie(创建、保存、读取)
- MattPowell介绍了如何在服务器端使用异步Web方法,来创建高性能的 Microsoft ASP.NET Web 服务
- 如何使用.net读取PKCS12格式数字证书
- 求助!如何使用编程读取24位bmp格式的图片?
- 如何使用JSP+MySQL创建留言本
- 如何有效的使用C#读取文件
- 如何创建和使用哈希表
- 如何创建和使用 C# DLL(受托管)
- 如何使用SetWindowRgn函数创建异形窗口
- 使用c#如何读取xml文件
- 如何创建和使用Web Service代理类
- 新手来看:什么叫“使用Data Link 文件”?什么是UDL文件?如何创建?
- 创建智能网络蜘蛛——如何使用Java网络对象和HTML对象(翻译)
- 如何使用AdminScripts脚本创建虚拟目录
- 如何在VB6.0中创建和使用文本资源文件
- 如何创建和使用Web服务 [转帖]