box2d——2.加入鼠标关节MouseJoint和box2d基础概念

上一节加入了tiles积木,但不能进行鼠标操作。

以下加入鼠标相关的控制。

【加入鼠标关节】

b2MouseJoint *mMouseJoint

【处理按键响应】

设置开启触屏之类的就不说了。在触屏開始的时候要查询相交的形状,依据其夹具fixture获得物体。然后创建它与地面间的鼠标关节。

bool CBaseLayer::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
	CCPoint nodePos = convertToNodeSpace(touch->getLocation());
	mMouseWorldPos = b2Vec2(nodePos.x, nodePos.y);

	if (mMouseJoint)
		return false;

	// 构造一个小点击盒子
	b2AABB aabb;
	b2Vec2 d;
	d.Set(0.001f, 0.001f);
	aabb.lowerBound = mMouseWorldPos - d;
	aabb.upperBound = mMouseWorldPos + d;

	// 向物理世界查询覆盖的形状
	CQueryCallback callback(mMouseWorldPos);
	mWorld->QueryAABB(&callback, aabb);

	if (callback.mFixture)
	{
		// 创建鼠标关节
		b2Body *body = callback.mFixture->GetBody();
		b2MouseJointDef md;
		md.bodyA = mGroundBody;		// 世界边界
		md.bodyB = body;
		md.target = mMouseWorldPos;// 拖动的坐标
		md.maxForce = 1000.0f * body->GetMass();	// 拖动的力
		mMouseJoint = (b2MouseJoint *)mWorld->CreateJoint(&md);
		// 设置睡眠(这里awake为true表示sleep...)
		body->SetAwake(true);

		return true;
	}

	return false;
}

然后在鼠标移动的时候更新鼠标关节的目标位置,并在触屏结束的时候删除鼠标关节。

void CBaseLayer::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
	CCPoint nodePos = convertToNodeSpace(touch->getLocation());
	mMouseWorldPos = b2Vec2(nodePos.x, nodePos.y);

	if (mMouseJoint)
		mMouseJoint->SetTarget(mMouseWorldPos);
}

void CBaseLayer::ccTouchEnded(CCTouch* touch, CCEvent* event)
{
	if (mMouseJoint)
	{
		mWorld->DestroyJoint(mMouseJoint);
		mMouseJoint = NULL;
	}
}

【物理查询回调】

从b2QueryCallback派生一个查询回调的类来存储要处理的查询结果:

// 查询的回调
class CQueryCallback : public b2QueryCallback
{
public:
	CQueryCallback(const b2Vec2& point)
	{
		mPoint = point;
		mFixture = NULL;
	}

	bool ReportFixture(b2Fixture* fixture)
	{
		b2Body* body = fixture->GetBody();
		if (body->GetType() == b2_dynamicBody)
		{
			// 该点是否在形状内
			bool inside = fixture->TestPoint(mPoint);
			if (inside)
			{
				mFixture = fixture;

				// We are done, terminate the query.
				return false;
			}
		}

		// Continue the query.
		return true;
	}

	b2Vec2		mPoint;
	b2Fixture	*mFixture;
};

【效果图和代码下载】

代码下载地址

【box2的基本组件的概念】

b2World世界:物理世界就是物体、形状和约束相互作用的集合

b2Body物体

b2Fixture夹具:用于把形状附加到物体上的关系

b2Shape形状:物体的形状。依附于五条的2d碰撞几何结构。有摩擦力friction和恢复力restitution等材质性质

约束:消除物体自由度的物理连接。2d世界中,一个物体有x、y方向和旋转角度3个自由度。

b2Joint关节:用于把两个或多个物体固定到一起的约束。

包含旋转、棱柱和距离等。可限制一个关节的活动范围,可通过关节驱动所连接物体的转动。

box2d针对大小0.1~10单位长度的物体作了优化,所以定义一个转换PTM_RATIO=32,表示像素/米,以便把物体尺寸在cocos2dx与box2d间转换。

一个物体可附加多个夹具。每一个夹具代表一个特定密度、形状的部件,而物体的主要特征则表现为整个物体在空间的位置和速度信息。

b2body的userData属性同意存放一个随意类型的指针指向我们自己定义的数据。

时间: 2024-12-18 01:17:13

box2d——2.加入鼠标关节MouseJoint和box2d基础概念的相关文章

box2d——2.添加鼠标关节MouseJoint和box2d基础概念

上一节添加了tiles积木,但不能进行鼠标操作.下面添加鼠标相关的控制. [添加鼠标关节] b2MouseJoint *mMouseJoint [处理按键响应] 设置开启触屏之类的就不说了.在触屏开始的时候要查询相交的形状,根据其夹具fixture获得物体,然后创建它与地面间的鼠标关节. bool CBaseLayer::ccTouchBegan(CCTouch* touch, CCEvent* event) { CCPoint nodePos = convertToNodeSpace(touc

(转)妙味课堂—JavaScrip中级课程笔记

DOM基础概念.操作 DOM的概念及节点类型 childNodes children nodeType attributes 子节点和兄弟节点的操作 firstChild firstElementChild lastChild.lastElementChild nextSibling.previousSibling 父节点 parentNode offsetParent 元素位置宽高 offsetLeft.offsetTop offsetWidth.offsetHeight getPos() 操

实例介绍Cocos2d-x中Box2D物理引擎:使用关节

下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: [html] view plaincopy void HelloWorld::addNewSpriteAtPosition(Vec2 p) { log("Add sprite %0.2f x %02.f",p.x,p.y); //创建物理引擎精灵对象A auto spriteA = Sprite::create("Bo

使用 Box2D 做一个 JansenWalker 机器人

在 Box2DFlash 的官网的首页有一个小 Demo,这个 Demo 中有11个例子,可以通过左右方向键查看不同的例子,里面的每个例子都非常有趣,但最让我感兴趣的,是其中一个叫 JansenWalker 的,里面是一个往右移动的机器人,有6只脚,交替着地往右边行走,如下图: 前段时间在看 Box2D,把官网下载下来的 Demo 源码都看完并写一遍,其他的例子花的时间都不多,这个花的时间有点长,主要是分析结构,然后就是各个关节的比例,身体的大小,不断的微调,找到合适的数值,以下是我最终完成的效

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

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 源码下载: http://download.csdn.net/detail/notbaron/7900243 上篇回顾 本篇名言:对"战士旅行者"而言,选择其实不是去选择,而是优雅地接受"无限"的邀请.[唐望] 上篇中,蛤蟆学习了Box2d物理引擎中的持续施加力,接下去蛤蟆继续学习其他的Box2d引擎的使用.这次我们使用Box2d物理引擎来学习 Motor Joint     . 理论介绍 本次的理论知识, 咱们回顾下M

box2d.js

https://github.com/kripken/box2d.js/ Demo: http://kripken.github.io/box2d.js/webgl_demo/box2d.html 演示: http://kripken.github.io/box2d.js/webgl_demo/box2d.html Example code to give you an idea of the API: https://github.com/kripken/box2d.js/blob/maste

box2d包结构

BOX2D.Collision>>>碰撞,冲击包: b2AABB AABB坐标 b2OBB OBB坐标 b2ContactID 接触ID b2ContactPoint 接触点 b2ManifoldPoint 繁殖点 BOX2D.Collision.Shapes>>>碰撞形状形变包: b2CircleShape 圆外形. b2EdgeChainDef边缘图形. b2MassData 质量运算器. b2PolygonShape 凸多边形. b2Shape 图形基类. BOX

cocos2dx-3.x物理引擎Box2D介绍

物理引擎 Cocos2d-x引擎内置了两种物理引擎,它们分别是Box2D和Chipmunk,都是非常优秀的2D物理引擎,而且x引擎将它们都内置在SDK中.Box2D使用较为广泛,在这里选择Box2D来进行学习.  物理引擎模拟的内容: 重力:在游戏中模拟重力加速度,当游戏中人物跳跃起来后会受到重力影响而向下移动,在没有地面的场景,人物和物体会由于重力而做自由落体运动.牵引力(动力):在游戏中比如汽车的引擎,人物本身能够提供向前进行的动力,这种牵引力是持续不断地作用在物体上的,物体因此可以向作用力

Box2D例子——Demo3自行车

package com.cvte.game; import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Orthog