物理引擎的使用

创建对象

auto border = Sprite::create("border.png");
Size borderSize = border->getContentSize();
auto body = PhysicsBody::createBox(borderSize);
body->setDynamic(false);
body->setCategoryBitmask(1);
body->setCollisionBitmask(1);
body->setContactTestBitmask(1);

border->setPhysicsBody(body);
border->setPosition(pos);
//设置标签
border->setTag(ObjectTag_Border);

//加载地图
TMXTiledMap* map = TMXTiledMap::create("tg1.tmx");
this->addChild(map);


//加载怪物对象层的所有对象
TMXObjectGroup* objGroup = map->getObjectGroup("monster");
ValueVector objects = objGroup->getObjects();


for(const auto v : objects)
{
const ValueMap dict = v.asValueMap();
int id = dict.at("id").asInt();
float fShowTime = dict.at("ShowTime").asFloat();
int iPosX = dict.at("x").asInt();
int iPosY = dict.at("y").asInt();


/* 创建怪物对象,并保存起来 */
Monster* monster = Monster::create(id);
monster->setID(id);
monster->setfShowTime(fShowTime);
monster->setiPosX(iPosX);
monster->setiPosY(iPosY);
/* 保存怪物对象 */
m_monsterVec.pushBack(monster);
}


auto playerSp = Sprite::create("CloseNormal.png");
this->addChild(playerSp);


auto body = PhysicsBody::createCircle(playerSp->getContentSize().width * 0.4f);
//getShape(0)获取刚体的皮肤
//setFriction(0)设置摩擦力
//setRestitution(1.f)设置弹力
body->getShape(0)->setFriction(0);
body->getShape(0)->setRestitution(1.f);
//设置碰撞监听
body->setCategoryBitmask(1);
body->setCollisionBitmask(1);
body->setContactTestBitmask(1);


this->setPhysicsBody(body);
//给角色添加推力
this->getPhysicsBody()->applyImpulse(Vect(0,-40000));


//设置标签
this->setTag(ObjectTag_Player);

this->getPhysicsBody()->applyImpulse(Vect(50000,0));


//创建物理场景
auto scene = Scene::createWithPhysics();
//微重力世界
Vect gravity(0,-0.5f);
//设置重力方向
scene->getPhysicsWorld()->setGravity(gravity);
//开启测试模式
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
//创建一个边界
Size visibleSize = Director::getInstance()->getVisibleSize();
/*
创建一个空心盒子刚体,作为游戏世界的边界(避免游戏内的物体跑出屏幕)
参数分别是刚体大小、材质、边线厚度
*/
auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width,visibleSize.height),PHYSICSBODY_MATERIAL_DEFAULT,3);
//创建一个节点,用于承载刚体,这样刚体就能参与到游戏的物理世界
auto node = Node::create();
node->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
node->setPhysicsBody(body);
scene->addChild(node);


auto layer = TollgateScene::create();
scene->addChild(layer,10);


auto backgroundLayer = BackgroundLayer::create();
scene->addChild(backgroundLayer,0);


auto monsterLayer = MonsterLayer::create();
scene->addChild(monsterLayer,1);


layer->monsterLayer = monsterLayer;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值