cocos2d之Box2D具体解释 鼠标关节实现

DionysosLai2014-5-7

我们常常要移动物理世界中的某个物体,例如说石头、木块等。假设我们直接改变这些物体的位置,让这些物体尾随我们手指移动,即使这样是可行的,却违反了物理世界的基本规则。这个世界没有“上帝之手”。

换个思路,假设我们要移动物体,那是否说,就是我们要在物体上施加一个某个方向的无穷大的力量。恩,没错。就是这样。

在Box2D中,有一个比較特殊的关节类型:鼠标关节(Mouse Joint),之所以特殊,就是由于它并非物理世界中原生的物体,是来自于用户的操作。鼠标关节,能够试图将物体拖向当前鼠标光标的位置,同一时候在选择方向上没有限制。

使用鼠标关节一般有三个步骤:

1.      创建(在touchBegan中)

2.      改变鼠标关节位置(在touchMove中);

3.      销毁鼠标关节(在touchEnd中)

依照上面步骤:我们一步步创建鼠标关节:

在头文件里创建一个鼠标关节:

b2MouseJoint* m_mouseJoint;

然后在cpp文件里初始鼠标关节为NULL:

m_mouseJoint = NULL;

以下就是创建鼠标关节:

b2Vec2 vec(m_pTouchPoint.x/PTM_RATIO,m_pTouchPoint.y/PTM_RATIO);
// b2Vec2 vec = b2Vec2(touchPoint.x,touchPoint.y); if(m_mouseJoint != NULL)
{
return false;
} // Make a small box.
b2AABB aabb;
b2Vec2 d;
d.Set(0.001f, 0.001f);
aabb.lowerBound = vec - d;
aabb.upperBound = vec + d; b2BodyDef bodyDef;
b2Body *m_groundBody = m_world->CreateBody(&bodyDef); // Query the world for overlapping shapes.
QueryCallback callback(vec);
m_world->QueryAABB(&callback, aabb); if (callback.m_fixture)
{
b2Body* body = callback.m_fixture->GetBody();
b2MouseJointDef md;
md.bodyA = m_groundBody;//一般为世界边界
md.bodyB = body;//须要拖动的物体
md.target = vec;
md.maxForce = 1000.0f * body->GetMass();
m_mouseJoint = (b2MouseJoint*)m_world->CreateJoint(&md);
body->SetAwake(true); CCLog("touch bengin \n"); return true;
}
return false;

在这里。调用了一个回调函数。因此必须在头文件里,新建一个类:

class QueryCallback : public b2QueryCallback
{
public:
QueryCallback(const b2Vec2& point)
{
m_point = point;
m_fixture = NULL;
} bool ReportFixture(b2Fixture* fixture)
{
b2Body* body = fixture->GetBody();
if (body->GetType() == b2_dynamicBody)
{
bool inside = fixture->TestPoint(m_point);
if (inside)
{
m_fixture = fixture; // We are done, terminate the query.
return false;
}
} // Continue the query.
return true;
} b2Vec2 m_point;
b2Fixture* m_fixture;
};

这里要注意一个问题,就是设置鼠标关节边界时:

md.bodyA= m_groundBody;//一般为世界边界

md.bodyB= body;//须要拖动的物体

md.bodyA是我们的世界

以下就是在touchMove中改变鼠标关节的属性,代码例如以下:

m_iTouchType = TOUCH_MOVE;
CCPoint point = pTouch->getLocation();
m_pTouchPoint = point; if(m_mouseJoint == NULL )
return; b2Vec2 vecMouse;
vecMouse.Set((m_pTouchPoint.x)/PTM_RATIO, (m_pTouchPoint.y)/PTM_RATIO);
//改变关节位置.
m_mouseJoint->SetTarget(vecMouse);

最后一个当我们手指离开屏幕时。我们要销毁我们所创建的鼠标关节。在ccTouchEnded增加例如以下代码:

m_iTouchType = TOUCH_END;
CCPoint point = pTouch->getLocation();
m_pTouchPoint = point;
CCLOG("%f, %f", point.x, point.y); //销毁关节.
if(m_mouseJoint != NULL)
{
m_world->DestroyJoint(m_mouseJoint);
m_mouseJoint =NULL;
}

好。到现在为止一切ok该。

版权声明:本文博主原创文章。博客,未经同意不得转载。

cocos2d之Box2D详细说明 鼠标联合实现的更多相关文章

  1. cocos2d中box2d讲解一

    在游戏中我们经常要加入物理碰撞等和物理有关的内容,在游戏中加入物理引擎可以使我们的游戏更加真实,为玩家展示一个更真实的世界,cocos2d-x支持两个物理引擎Box2d和Chipmunk,本文介绍bo ...

  2. Cocos2d学习之路五(Box2d使用CCPhysicsSprite时编译不通过解决方法)

    cocos2d使用box2d引擎,在使用CCPhysicsSprite添加精灵的时候会出现编译不通过错误. 需要注意以下几点: 1.sprite.position=ccp(p.x,p.y);这行代码一 ...

  3. Opencv函数setMouseCallback鼠标事件响应

    用户通过鼠标对图像视窗最常见的操作有: 1. 左键单击按下 2. 左键单击抬起 3. 左键按下拖动 4. 鼠标指针位置移动 单次单击操作响应事件及顺序 Opencv中setMouseCallback( ...

  4. 深入理解DOM事件类型系列第一篇——鼠标事件

    × 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...

  5. js鼠标滚轮事件

    不多说,直接上代码. //非ie document.body.onmousewheel = function(event) { event = event || window.event; conso ...

  6. opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像

    前言 好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章. 鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝 ...

  7. Visual Studio 2012下Box2D开发环境设置

    Cocos2d-x 3.x默认情况下采用的物理引擎是Chipmunk,如果我们要使用Box2D引擎,需要进行一些设置和调整,而且不同的开发平台下这些设置也有所不同.由于本书在此之前介绍的都是基于微软的 ...

  8. opencv鼠标操作及GUI矩形绘画

    OpenCV的鼠标操作是通过一个中介函数配合回调函数来实现的.指定鼠标操作消息回调函数的函数为SetMouseCallback. void setMouseCallback(const string& ...

  9. opencv——感兴趣区域(ROI)的分析和选取[详细总结]

    引言 在利用OpenCV对图像进行处理时,通常会遇到一个情况,就是只需要对部分感兴趣区域进行处理.因此,如何选取感兴趣区域呢?(其实就是"抠图"). 在学习opencv的掩码运算后 ...

随机推荐

  1. TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中): 其中TWinControl对TControl有10个消息进行了覆盖(红色标记),其中有2个是WM_消息,8个是CM_消 ...

  2. 类型自动转换引起的误解——QString可以赋值数字1,也能直接与0比较,真是昏倒!

    看以下代码,能编译通过: void MainWindow::on_pushButton_clicked() { QString str = "test"; ) { QMessage ...

  3. 巧妙使用Firebug插件,快速监控网站打开缓慢的原因

    原文 巧妙使用Firebug插件,快速监控网站打开缓慢的原因 很多用户会问,我的网站首页才50KB,打开网页用了近60秒才打开?如何解释? 用户抱怨服务器运行缓慢,w3wp.exe 出现 CPU 10 ...

  4. GIT的下载、安装、与使用

    一.下载: 网址:https://code.google.com/p/msysgit/ 进入这个网站以后,你会看到以下界面: 在这个界面中找到: 这时你便可以下载GIT 二.安装 安装过程比较简单,一 ...

  5. 折扣&折让-看清实质的思考

    折扣&折让 看清实质的思考 Author:zfive5(zidong) Email:zfive5@163.com 引子 有些东西,在没有人指点的情况,一时理解不了,就放一放,等到某一个契机到来 ...

  6. 每日一小练——高速Fibonacci数算法

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: ...

  7. B. 沙漠之旅(分组背包)

    B. 沙漠之旅 Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: % ...

  8. 基于Andoird 4.2.2的Account Manager源代码分析学习:创建选定类型的系统帐号

    AccountManager.addAccount() public AccountManagerFuture<Bundle> addAccount(final String accoun ...

  9. Wix学习整理(4)——关于WiX文件格式和案例HelloWorld的分析

    原文:Wix学习整理(4)--关于WiX文件格式和案例HelloWorld的分析 关于WiX文件格式 .wxs是WiX的源文件扩展名..wxs文件以类XML文件的格式来指定了要构造Windows In ...

  10. like-minded 都有什么意思_百度知道

    like-minded 都有什么意思_百度知道 like-minded 都有什么意思