瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处:

源码下载: http://download.csdn.net/detail/notbaron/7900243

上篇回顾

本篇名言:对"战士旅行者"而言,选择其实不是去选择,而是优雅地接受"无限"的邀请。[唐望]

上篇中,蛤蟆学习了Box2d物理引擎中的持续施加力,接下去蛤蟆继续学习其他的Box2d引擎的使用。这次我们使用Box2d物理引擎来学习 Motor Joint     。

理论介绍

本次的理论知识, 咱们回顾下MotorJoint关节即可。

MotorJoint关节是通过设置位置和旋转偏移来实现物体运行的。我可以设置最大的力和扭矩来使Body达到目标位置。如果物体被停住了,那么接触力按比例达到最大力和力矩。

具体步骤

1、修改RayCastNew的构造函数如下

RayCastNew()

{

b2Vec2 gravity;

gravity.Set(0.0f,0.0f);

m_world=
new b2World(gravity);

m_mouseJoint=
nullptr;

b2BodyDef bodyDef;

m_groundBody= m_world->CreateBody(&bodyDef);

b2Body* ground = NULL;

{

b2BodyDef bd;

ground= m_world->CreateBody(&bd);

b2EdgeShape shape;

shape.Set(b2Vec2(-20.0f, 0.0f),
b2Vec2(20.0f, 0.0f));

b2FixtureDef fd;

fd.shape= &shape;

ground->CreateFixture(&fd);

}

{

b2BodyDef bd;

bd.type=
b2_dynamicBody;

bd.position.Set(0.0f,8.0f);

b2Body* body = m_world->CreateBody(&bd);

b2PolygonShape shape;

shape.SetAsBox(2.0f,0.5f);

b2FixtureDef fd;

fd.shape= &shape;

fd.friction= 0.6f;

fd.density= 2.0f;

body->CreateFixture(&fd);

b2MotorJointDef mjd;

mjd.Initialize(ground,body);

mjd.maxForce= 1000.0f;

mjd.maxTorque= 1000.0f;

m_joint= (b2MotorJoint*)m_world->CreateJoint(&mjd);

}

GLESDebugDraw * _debugDraw =new
GLESDebugDraw(1.0);

m_world->SetDebugDraw(_debugDraw);

uint32 flags = 0;

flags+=b2Draw::e_shapeBit;

flags+=
b2Draw::e_jointBit;

_debugDraw->SetFlags(flags);

m_world->DrawDebugData();

}

代码解释

1、 构造函数介绍

其他部分,蛤蟆就不一一记录了,因为和自由落体代码是一致的。

RayCastNew()

{

b2Vec2 gravity;

gravity.Set(0.0f,0.0f);

m_world=
new b2World(gravity); //通过重力向量创建物理世界

m_mouseJoint=
nullptr; //鼠标关节变量,初始化为0

b2BodyDef bodyDef;//Body定义变量

m_groundBody= m_world->CreateBody(&bodyDef); //创建一个默认Body

b2Body* ground = NULL;//地面 Body

{

b2BodyDef bd;// Body定义变量

ground= m_world->CreateBody(&bd);//创建一个默认的地面

b2EdgeShape shape;//定义一个边界shape

shape.Set(b2Vec2(-20.0f, 0.0f),
b2Vec2(20.0f, 0.0f));//设置shape为一个直线

b2FixtureDef fd;//定义一个Fixture

fd.shape= &shape;//设置fixture的shape为刚才的边界shape.

ground->CreateFixture(&fd);//通过Fixture关联底面和shape.

}

{

b2BodyDef bd; // Body定义变量

bd.type=
b2_dynamicBody;//定义Body为动态的

bd.position.Set(0.0f,8.0f);//设置Body的位置

b2Body* body = m_world->CreateBody(&bd);//创建一个动态的Body

b2PolygonShape shape;//定义一个多边形shape

shape.SetAsBox(2.0f,0.5f);//设置shape的形状

b2FixtureDef fd;//定义Fixture 变量

fd.shape= &shape;//定义Fixture变量中的shape

fd.friction= 0.6f;//定义摩擦力

fd.density= 2.0f;//定义密度

body->CreateFixture(&fd);//通过Fixture绑定body和shape

b2MotorJointDef mjd;//定义一个MotorJoint

mjd.Initialize(ground,body);//初始化这个Joint为groud和boyd

mjd.maxForce= 1000.0f;//设置最大力为1000

mjd.maxTorque= 1000.0f;//设置最大力矩为1000

m_joint= (b2MotorJoint*)m_world->CreateJoint(&mjd);//通过定义创建MotroJoint

}

GLESDebugDraw * _debugDraw =new
GLESDebugDraw(1.0);//定义GLESDebugDraw类,用于画底面

m_world->SetDebugDraw(_debugDraw);//注册GLESDebugDraw

uint32 flags = 0;

flags+=b2Draw::e_shapeBit;//设置需要画的内容

flags+=
b2Draw::e_jointBit;

_debugDraw->SetFlags(flags);//加载需要画内容的位

m_world->DrawDebugData();//画出地面Body.

}

时间: 2024-08-25 01:49:06

瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint的相关文章

瘸腿蛤蟆笔记36-cocos2d-x-3.2 Box2d物理引擎Ray-cast使用

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 上篇回顾 本篇名言:人类心灵深处,有许多沉睡的力量:唤醒这些人们从未梦想过的力量,巧妙运用,便能彻底改变一生.[澳瑞森·梅伦] 上几篇中,蛤蟆学习了Box2d物理引擎中如何将我们创建的物理体给描绘在程序里面.让我们能够看到一个非常直观的物体,便于后续进一步学习和理解. 具体步骤 我们还是使用helloworld工程. 1.  首先将\cocos2d-x-3.2\tests\cpp-tests\Classes\Box2DTestBed目录中的6个文件G

瘸腿蛤蟆笔记34-cocos2d-x-3.2 Box2d物理引擎World类介绍

上篇回顾 本篇名言:将爱的能量传送给别人,我们自己就会变成一条管道,吸纳来自上天的神圣能源.而那种玄秘体验是我们每个人都得以品尝的! [詹姆士·雷德非] 上篇中,我们学习了Box2d物理引擎dynamics模块中的Contact类,该类包含所有的接触类型.物体碰撞的具体都在该类中. 蛤蟆接着学习dynamics模块中的类,这次咱们学习World这个类. 理论介绍 World类(其实是b2World类,蛤蟆之前说过,Box2d中的类都是b2开头的)包含Body和Joint. 它管理所有的仿真允许异

瘸腿蛤蟆笔记28-cocos2d-x-3.2 Box2d物理引擎collision模块介绍

上篇回顾 本篇名言:绝不测量山的高度─除非你已到达顶峰,那时你就会知道山有多低. [哈马绍] 上篇中,我们学习了Box2d物理引擎的三大模块之一的common模块,该模块主要包含设置,内存管理和向量数学. 这次蛤蟆接着学习collison模块. 理论介绍 这个collision模块包括了shapes和函数.同时包括一个动态树和broad-phase(蛤蟆不知道怎么解释这个)用于加速碰撞系统.这个模块设计的时候是在动态系统之外使用的.        Shape 这里的shapes描述了碰撞几何,可

瘸腿蛤蟆笔记31-cocos2d-x-3.2 Box2d物理引擎Fixture类介绍

上篇回顾 本篇名言:好的木材并不在顺境中生长:风越强,树越壮. [马里欧特] 上篇中,我们学习了dynamics模块中的Body类,从定义到创建再到使用基本上都覆盖了,就差实战了(这个蛤蟆后在后面中补上的). 接下去蛤蟆继续学习dynamics模块中的类,这次咱们学习Fixture这个类. 理论介绍 我们知道Shape可以不知道Body,独立于物理仿真使用.所以Box2d需要Fixture类来将shape附加到Body.一个Body可以有1个或者多个Fixture.一个拥有多个fixture的B

瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍

上篇回顾 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们学习了Box2d物理引擎的三大模块之一的collision模块,该模块主要包含形状shape,碰撞函数和动态树等概念. 这次蛤蟆接着学习dynamics模块. 理论介绍 Dynamics模块是Box2d引擎中最复杂的,也是基本上我们打交道最多的模块了.该模块建立在common和collision模块之上,所以需要我们先了解common和collision模块. Dynamics模块包含几大类:  fixture cla

瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体实现

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 上篇回顾 本篇名言:烦恼使我受着极大的影响--我一年多没有收到月俸,我和穷困挣扎:我在我的忧患中十分孤独,而且我的忧患是多么多,比艺术使我操心得更厉害! [米开朗基罗] 前段时间蛤蟆出差北京去了,好在中秋节前回来了哈哈. 上篇中,蛤蟆学习了Box2d物理引擎中的Ray-cast代码解释,接下去蛤蟆继续学习其他的Box2d引擎的使用.这次我们使用Box2d物理引擎来学习物理掉落的情况. 理论介绍 本次的理论知识基本和上次RayCast一致,需要补充如下

瘸腿蛤蟆笔记19-cocos2d-x-3.2 屏幕锁定精灵运动

上篇回顾 上篇中,蛤蟆学习了OrbitCamera的使用,并了解了其大概.虽然那个OrbitCamera::create函数中参数比较难理解,但是我们还是抽象的尝试说明了一下.呵呵,这次蛤蟆学习如何用屏幕锁定精灵的运行. 理论介绍 首先我们来看下 继承关系如下. Follow直接继承于Action类的,看上去还挺老资格的,其实也是老资格的.谁让人家辈分靠前呢. 类的创建函数是: static Follow* create ( Node *  followedNode, const Rect & 

瘸腿蛤蟆笔记37-cocos2d-x-3.2 Box2dTestBed架构详解

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 上篇回顾 本篇名言:凡是内心能够想到.相信的,都是可以达到的. [Napoleon Hill] 在最早的时候,蛤蟆学习过cocos2d-x示例架构.这次在这个基础上,蛤蟆要学习Box2dTestBed这个物理引擎的DEMO架构.这样大家可以自己深入研究之了. 架构详解 第一步基本类介绍 首先从我们点到controller.cpp文件中.找到第43行如下: { "Box2d - TestBed", []() { return new Box2

[cocos2dx笔记008]cocos2d 用luabridge手动绑定类

基于cocos2dx 2.2.2版本.这几天使用了cocostudio实现了,动画,骨骼动画,UI编辑,粒子效果,虽然有些不足,但已经算是非常好了.今天尝试用lua,这个非常简单,创建的时候,设置语言为lua,那就可以创建lua工程. 在cocos2d-x-2.2.2\tools\project-creator下运行: python create_project.py -project test_lua -package com.android.zdhsoft -language lua xco