简单的物理世界

HelloWorld.h

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event);
void addNewSpriteAtPosition(Point p);

};

#endif

 

HelloWorld.cpp

#include "HelloWorldScene.h"
USING_NS_CC;

Scene* HelloWorld::createScene()
{
auto scene = Scene::createWithPhysics();                                                                 //创建物理场景
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);     //调试模式
auto layer = HelloWorld::create();
scene->addChild(layer);
return scene;
}

 

bool HelloWorld::init()
{
  if ( !Layer::init() )
  {
    return false;
  }

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

  auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT, 5.0f);                             //PhysicsBody::createEdgeBox是创建物体对象,静态函数createEdgeBox指定世界边界是矩形盒子,createEdgeBox函数的第一个参数指定矩形的大小。第二个参数是设置材质,PHYSICSBODY_MATERIAL_DEFAULT常量是默认材质,材质是由结构体PhysicsMaterial定义的,结构体PhysicsMaterial成员有:density(密度)、friction(磨擦系数)和restitution(弹性系数)。密度可以用来计算物体的质量,密度可以为零或者为正数。摩擦系数经常会设置在0.0~1.0之间,0.0表示没有摩擦力,1.0会产生强摩擦。弹性系数的值通常设置到0.0~1.0之间,0.0表示物体不会弹起,1.0表示物体会完全反弹,即称为弹性碰撞。createEdgeBox函数的第三个参数是设置边的宽度。

 

  auto edgeNode = Node::create();               //是创建边界节点对象,这个节点对象作为世界边界对象
  edgeNode->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));             
  edgeNode->setPhysicsBody(body);                  //edgeNode->setPhysicsBody(body)是设置与节点相关的物体对象。通过这条语句使得游戏场景中的节点对象(精灵等)与物体关联起来
  this->addChild(edgeNode);


  setTouchEnabled(true);
  //设置为单点触摸
  setTouchMode(Touch::DispatchMode::ONE_BY_ONE);

  return true;

}

 

bool HelloWorld::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event)
{
  Point location = touch->getLocation();
  addNewSpriteAtPosition(location);
  return false;
}

void HelloWorld::addNewSpriteAtPosition(Point p)
{
  auto sp = Sprite::create("CloseNormal.png");
  sp->setTag(1);

  auto body = PhysicsBody::createCircle(sp->getContentSize().width / 2);               //是通过PhysicsBody的静态createCircle函数创建圆圈形状物体。PhysicsBody还有很多类似的create函数,如createBox、createCircle、createPolygon和   createEdgePolygon等函数,这些函数与物理形状对应的。这里只详细解释createCircle函数, createCircle函数API如下:  

  static PhysicsBody* createCircle(float radius,const PhysicsMaterial & material = PHYSICSBODY_MATERIAL_DEFAULT,const Vec2 & offset = Vec2::ZERO )

其中第一个参数radius是设置圆圈的半径,第二参数material是材质,这可以省略,默认值是PHYSICSBODY_MATERIAL_DEFAULT,所以在HelloWorld::init()函数中定义世界的边界时候,PhysicsBody::createEdgeBox语句中的material参数也是可以省略的。第三个参数offset是偏移量,可以省略,默认值是Vec2::ZERO。


  //auto body = PhysicsBody::createBox(sp->getContentSize());
  sp->setPhysicsBody(body);                       //sp->setPhysicsBody(body)是设置与精灵相关的物体对象
  sp->setPosition(p);
  this->addChild(sp);
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值