cocos2d-x物理引擎

今天学物理引擎的时候又遇到了数组越界的问题,报错信息

libpng warning: iCCP: known incorrect sRGB profile

Initializing cpSpace - Chipmunk v6.2.1 (Debug Enabled)

Compile with -DNDEBUG defined to disable debug mode and runtime assertion checks

libpng warning: iCCP: known incorrect sRGB profile

libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector


后来发现是把变量写错了,下面贴上正常运行的代码

#include "NewPhysicsLayer.h"

Size NewPhysicsLayer::visibleSize = Size::ZERO;

Scene * NewPhysicsLayer::createScene(){

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

    auto scene = Scene::createWithPhysics();//创建一个物理场景。

    //在物理场景中设置重力加速度。默认是-98

    scene->getPhysicsWorld()->setGravity(Vec2(0,-98));

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

    auto layer = NewPhysicsLayer::create();//设置调试

    scene->addChild(layer);

    

    auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,10,Vec2(0,0));

    layer->setPhysicsBody(body);

    body->setPositionOffset(Vec2(visibleSize.width/2.0,visibleSize.height/2.0));

    return scene;

}

bool NewPhysicsLayer::init(){

    if (!Layer::init()) {

        return false;

    }

    

    addSprites();

    return true;

}


void  NewPhysicsLayer::addSprites(){

    auto circleSp = Sprite::create("Ball.jpg");

    circleSp->setPosition(visibleSize.width/2.0, visibleSize.height/2.0);

    auto circleBody = PhysicsBody::createCircle(circleSp->getContentSize().width/2.0);

    //设置缸体

    circleSp->setPhysicsBody(circleBody);

    //设置重力

    //circleBody->setGravityEnable(true);

    //设置质量

    circleBody->setMass(100);

    //设置速度

    circleBody->setVelocity(Vec2(0,-100));

    this->addChild(circleSp);

    

    auto circleSp2= Sprite::create("Ball.jpg");

    circleSp2->setPosition(300,circleSp2->getContentSize().height/2.0);

    auto body2 = PhysicsBody::createCircle(circleSp->getContentSize().width/2.0);

    circleSp2->setPhysicsBody(body2);

    //body2->setDynamic(false);

    this->addChild(circleSp2);

    

    

    auto paoKuSp = Sprite::create("paoku 00188.png");

    paoKuSp->setPosition(400,200);

    this->addChild(paoKuSp);

    

    std::vector <std::vector<Vec2>> shapes = this->getShapesFromPlistFile("pao.plist");

    auto polygon = PhysicsBody::create();

    for (auto shape : shapes) {

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

        polygon->addShape(points);

    }

    paoKuSp->setPhysicsBody(polygon);

   // auto phygon = PhysicsBody::createPolygon(Vec2(0,0), 2);

}


std::vector<std::vector <Vec2>> NewPhysicsLayer::getShapesFromPlistFile(std::string fielename){

    std::vector<std::vector<Vec2>> vectors;

    //冲文件读取plist文件,内容存放到vector

   ValueVector vec =  FileUtils::getInstance()->getValueVectorFromFile(fielename);

    //遍历vec,得到其中所有的形状。

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

        ValueVector shape =  vec.at(i).asValueVector();

        std::vector<Vec2> points;

        //把每一个形状的点放到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;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值