简单的物理世界

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);
}

时间: 2024-10-10 21:51:18

简单的物理世界的相关文章

coco2d-x 3.0游戏实例学习笔记 《跑酷》 二 游戏界面--全新的3.0物理世界

从这里开始,就和之前前辈的有很多不同啦. 在MainScene中,开始按钮中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,而且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是很简单的,因为它都帮我们封装好了. 那么这一步,我们在PlayScene 中主要完成以下功能: 1.物理世界创建 2.创建一个地面的物理刚体 相关知识个人见解: 所谓的创建物理世界,个人觉得是一个抽象的东东,作为新手,开始并不能理解,开始你可以就

Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用担心,这太简单了~! 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/804 文章来源:笨木头与游戏开发 3.0新亮点,史上最简单的物理引擎 在Cocos2d-x3.0里使用物理引擎,会很有快感,因为很多繁琐的东西它都帮我们封装好了. 那么,我要开始创建游戏的关卡场景了,大家跟紧了. 我们给关卡场景命名为Toll

从技法到兵法:今天为何必须关注物理世界的企业智能?

军事史上有个世纪疑问:火炮这东西最早是中国发明的,但我们的祖先却没有把它发扬光大.欧洲的火炮却很快超越了中国,明朝时期已经需要向西方商人购买"红夷大炮". 这个奇怪的现象当然有很多原因,而原因之一在于中国的火炮很少考虑实际应用中的若干问题.比如瞄准.散热.膛线.搬运,这些问题或许在技术层面上是细节,但在实战应用中却是要命的关口.通过改良各种细节,让火炮适应实战,才能发挥最大的作用. 由此可见,一个技术再好,不与现实世界结合也是没什么用的. 大炮的逻辑,今天似乎也可以套用到AI上.将AI

Cocos2d-x之物理世界(创建静态的物体)

在HelloWorldScene.h中添加如下内容 //创建一个地板 void addGround(); HelloWorldScene.cpp 1 #include "HelloWorldScene.h" 2 #include "cocostudio/CocoStudio.h" 3 #include "ui/CocosGUI.h" 4 5 USING_NS_CC; 6 7 using namespace cocostudio::timeline

Cocos2d-x之物理世界(创建悬浮的物体)

在HelloWorldScene.h中添加如下内容 //创建一个运动的物体,运动的矩形 void addRect(float x, float y, b2BodyType type); HelloWorldScene.cpp 1 #include "HelloWorldScene.h" 2 #include "cocostudio/CocoStudio.h" 3 #include "ui/CocosGUI.h" 4 5 USING_NS_CC;

Cocos2d-x之物理世界(创建运动的物体)

在AppDelegate.cpp中配置glview的属性 //配置glview的属性,屏幕的最高处是600,最右边是800 glview->setDesignResolutionSize(800, 600, ResolutionPolicy::SHOW_ALL); AppDelegate.cpp中的内容如下 #include "AppDelegate.h" #include "HelloWorldScene.h" USING_NS_CC; AppDelegat

Quick-cocos2d-x3.3 Study (八)--------- 物理世界

创建一个物理世界 1 // 在创建scene的时候把他改为物理世界的scene 2 display.newPhysicsScene("GameScene") 之后,你可在 ctor 方法中加入如下的一段代码: 1 self.world = self:getPhysicsWorld() 2 self.world:setGravity(cc.p(0, -98.0)) 3 self.world:setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL) 

Cocos2d-x之物理世界(物体之间的碰撞)

在HelloWorldScene.h中添加如下内容,并让其继承public b2ContactListener private: b2Body *groundBody;//创建一个地板 public: //继承的b2ContactListener实现 virtual void BeginContact(b2Contact* contact); HelloWorldScene.cpp 1 #include "HelloWorldScene.h" 2 #include "coco

Quick-cocos2d-x3.3 Study (十三)--------- 创建物理世界的边界 ( 创建一个带物理效果的线条 )

创建物理效果的线条 1 -- 创建物理世界的边界 2 -- 创建物理世界的上边界 3 -- 通过设置两个点来创建一条带物理效果的线条 4 local top = display.newNode() 5 local topBody = cc.PhysicsBody:createEdgeSegment( 6 -- 第一个点的位置 7 cc.p( 100, display.top - 100 ), 8 -- 第二个点的位置 9 cc.p( display.right - 100, display.to