文档章节

Box2D关节-鼠标关节(鼠标联合)

童年伊梦
 童年伊梦
发布于 2012/09/25 12:56
字数 532
阅读 395
收藏 0

我们可以通过鼠标联合点击、操作世界里面的刚体。鼠标联合的原理是当鼠标点击刚体时,给隐藏的一个鼠标Sprite(位置和当前鼠标相同)和点击的刚体创建一根联合线(Joint Line),该联合线的特点是刚体会沿着联合线运动,而鼠标的移动就是改变联合线。

鼠标点击刚体获取所选刚体的步骤:

  • 1.获取鼠标在物理世界中的坐标
  • var mouseXWorldPhys:Number = mouseX / worldScale;
    var mouseYWolrdPhys:Number = mouseY / worldScale;

  • 2.将鼠标的坐标存放到一个鼠标向量
  • var mousePVec2:b2Vec2 = new b2Vec2();
    mousePVec2.Set(mouseXWorldPhys,mouseYWorldPhys);

         或者

var mousePVec2:b2Vec2 = new b2Vec2(mouseXWorldPhys,mouseYWorldPhys);

  • 3.创建一个包围盒,很小很小,小到可以认为可以是一个点。通过这个包围盒去获取世界中的刚体。
  • var aabb:b2AABB = new b2AABB();
    aabb.lowerBound.Set(mouseXWorldPhys-0.001,mouseYWorldPhys-0.001);
    aabb.upperBound.Set(mouseXWorldPhys+0.001,mouseYWorldPhys+0.001);

  • 4.使用世界的QueryAABB方法。该方法有两个参数:(1)回调函数;(2)包围盒AABB的实例,如第三步的包围盒aabb。该方法用于查询世界中处于包围盒内部的所有b2Fixture,回调函数的参数必须是b2Fixture,返回值类型会Boolean,如function callBack(fixture:b2Fixture):Boolean。当返回值为true时,重新调用该回调函数,直到返回值为false,即当点击处于动态刚体内部时候。
  • /**Query the world for all fixtures that potentially overlap the provided AABB.
    */
                                                    
    //Parameters
    //callback:Function — a user implemented callback class. It should match signature function //Callback(fixture:b2Fixture):Boolean Return true to continue to the next fixture.
                                                     
    //aabb:b2AABB — the query box.

  • 5.在回调函数中进行判断点碰撞检测。如果fixture.GetBody( ).GetTransform( )与鼠标向量碰撞,则认为鼠标点击了该刚体。(从另一个角度理解:鼠标向量点处于刚体内部中)

核心代码如下:

private function GetBodyAtMouse(includeStatic:Boolean = false):b2Body
        {
            mousePVec2.Set(mouseXWorldPhys, mouseYWorldPhys);
            var aabb:b2AABB = new b2AABB();
            aabb.lowerBound.Set(mouseXWorldPhys - 0.001, mouseYWorldPhys - 0.001);
            aabb.upperBound.Set(mouseXWorldPhys + 0.001, mouseYWorldPhys + 0.001);
            var body:b2Body;
            function getBodyCallback(fixture:b2Fixture):Boolean
            {
                var shape:b2Shape = fixture.GetShape();
                if (fixture.GetBody().GetType() != b2Body.b2_staticBody||includeStatic)
                {
                    var inside:Boolean = shape.TestPoint(fixture.GetBody().GetTransform(), mousePVec2);
                    if (inside)
                    {
                        body = fixture.GetBody();
                        return false;
                    }
                }
                return true;
            }
            world.QueryAABB(getBodyCallback, aabb);
            return body;
        }


© 著作权归作者所有

童年伊梦
粉丝 1
博文 29
码字总数 21736
作品 0
浦东
私信 提问
实例介绍Cocos2d-x中Box2D物理引擎:使用关节

下面我们将使用Box2D物理引擎技术进行重构。使得关节能够掌握如何在Box2D使用关节约束。 HelloWorldScene.cpp中与使用关节的相关代码如下: [html] view plaincopy void HelloWorld::addNewS...

智捷课堂
2014/10/09
0
0
box2d-jquery的b2RevoluteJointDef

学了一天jquery的box2d,demo里的例子基本都还看得懂,可是自己搞了一天都没弄好b2RevoluteJointDef这个关节 网上关于jquery版的又很少,求大神写个小demo参考参考...

L3ve
2013/07/28
599
1
android游戏开发框架libgdx的使用(二十四)—physics-body-editor配合Box2D加快开发

Box2d是一个很出名的2d物理引擎,有C++、Java等等版本。libgdx对Box2D进行了很高效的封装,极大的降低了学习和使用成本。 但是我觉得和Libgdx的UI库比起来,Box2D的使用始终比较复杂,单纯的...

长平狐
2013/11/25
498
0
开源的物理引擎

物理引擎 是一种仿真程序,可用来创建一种虚拟环境,在其中集成来自物理世界的规律。在这个虚拟的环境中包括的物体,除了物体之间的相互作用(比如碰撞)外,还包括施加到它们身上的力(比如...

小卒过河
2011/09/07
2.1K
0
Visual Studio 2012下Box2D开发环境设置

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

智捷课堂
2014/10/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL如何实现跨平台代码

我们知道,PostgreSQL可以支持几乎(这个词似乎可以不要)所有主流平台,平台间尤其Windows与*nix之间的API差异巨大,PG是怎么做到的呢,用一个简单的例子解释。 前边我写怎么在Windows下编译...

有理想的猪
26分钟前
5
0
隐私政策声明

服务协议及隐私政策 为使用应用【随手记账本】(安卓包名:com.th.bk 以下简称“本软件”)服务,“厦门量子堆栈科技有限公司”以下简称“本公司”,除非你已阅读并接受本协议所有条款,否则...

Gemini-Lin
37分钟前
17
0
IT兄弟连 Java语法教程 流程控制语句 循环结构语句2

双重for循环 如果把一个循环放在另一个循环体中,那么就可以形成嵌套循环,也就是双重for循环,当然嵌套循环也可以是for循环嵌套while循环,也可以是while循环嵌套while循环……,即各种类型...

老码农的一亩三分地
43分钟前
15
0
访问LNMP虚拟主机出现报错:No input file specified.

之前一直是使用lnmp一键包,但是访问创建的虚拟主机,并没有出现过的错误:No input file specified. 网上的文章很多,但是都是转载,而且原因也很多,根本不适用 后面在lnmp一键包官网找到解...

wenzhizhong
今天
12
0
OSChina 周三乱弹 —— 你还能管得住观众愿意看谁吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享李宗盛的单曲《凡人歌 (电视剧《碧海情天》主题曲)》:你我皆凡人,生在人世间#今日歌曲推荐# 《凡人歌 (电视剧《碧海情天》主...

小小编辑
今天
1K
19

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部