`
kongweile
  • 浏览: 517315 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用libgdx及其中的box2d 2.1的注意事项

 
阅读更多

关于libgdx和box2d的图形

在libgdx的stage或者spriteBatch里画图.图的对称点是左下角.

在libgdx的TextureRegion从Texture里取需要的区域时,图的对称点是左上角.

在box2d里body,图的对称点是中心(可能符合物理的重心吧).

还有在libgdx里面.导入的Texture图片.一定要是2的幂数.即2,4,8....1024.

如果想导入不是2的幂数的图片.只能把它放在一个符合2的幂数的Texture里面.再使用TextureRegion从该Texture里提取所需要的区域.

 

创造一个世界:

Vector2 gravity = new Vector2(0.0f, -1f);//设置世界的引力,如果游戏是顶级图的,则都设为0则可.
boolean doSleep = true;//是否允许刚体睡眠.最好true
World world = new World(gravity, doSleep);//创建世界

 

刚体共有三种类型,分别是staticBody,dynamicBody以及kinematicBody
其含意分别是指,静态刚体(即不受力影响的物体,比如边界墙),动态刚体(完全模拟真实物理情况的物体),运动刚体(这是2.1版新增的一个类型,和静态刚体相比,就是它可以移动.它也同样不会被环境力所影响)

 

创建一个刚体:

BodyDef bd = new BodyDef();
bd.type = BodyDef.BodyType.DynamicBody;//指定刚体的类型,默认为静态.
bd.position.set(x, y);//x和y指出刚体初始的位置.

Body b = world.createBody(bd);//刚体一定要通过world的createBody来创建,不能new.

b.setUserData(data);//设定刚体的用户数据.

PolygonShape p = new PolygonShape();
p.setAsBox(8.0f, 8.0f);//指定形状为长方形.

p.set(new Vector2[]{new Vector2(0,1),new Vector2(-1,0),new Vector2(1,0)});指定三角形,也可以指定更多Vector2,为多边形.多边形最多有8个边,并且多边形必须是凸边形.当然,你也可以使用组合来形成更为伪凹边形或者更复杂的形状.但最好请使用逆时针顺序.

FixtureDef f = new FixtureDef();
f.shape = p;//夹具的形状
f.density = 1.0f;//夹具的密度
f.friction = 0.3f;//夹具的摩擦力
b.createFixture(f);//刚体创建夹具.

 

刚体的createFixture有两种形式:

createFixture(Shape shape, float density)//传入形状Shape和它的密度.
createFixture(FixtureDef def)//传入夹具的定义,在传入前,已经定义好它的形状和密度等属性.

 

密度是用于计算刚体的质量属性的.就是说密度越大,该刚体越重.

摩擦力被用于使物体们在彼此间逼真的滑动.如一个刚体的摩擦力越大,撞在墙上反弹得越远.如果摩擦力小,撞在墙上可能会沾着墙一直滑动.

 

一个刚体可以创建多个夹具.如为一个世界创建四个边:

游戏在手机分辨率854*480且打横时运行.

BodyDef groundBodyDef = new BodyDef();
groundBodyDef.position.set(0, 0);
Body groundBody = world.createBody(groundBodyDef);
groundPolygonShape = new PolygonShape();


groundPolygonShape.setAsEdge(new Vector2(0, 480), new Vector2(0, 0));//使形状为边,左边.
groundBody.createFixture(groundPolygonShape, 0);


groundPolygonShape.setAsEdge(new Vector2(854, 480), new Vector2(854, 0));//右边
groundBody.createFixture(groundPolygonShape, 0);


groundPolygonShape.setAsEdge(new Vector2(0, 480), new Vector2(854, 480));//上边
groundBody.createFixture(groundPolygonShape, 0);


groundPolygonShape.setAsEdge(new Vector2(0, 0), new Vector2(854, 0));//下边
groundBody.createFixture(groundPolygonShape, 0);

 

开始模拟:

float timeStep = 1.0f / 60.0f;//刷新时间粒度
int velocityIterations = 6;//速度计算层级
int positionIterations = 2;//位置计算层级

world.step(timeStep, velocityIterations, positionIterations);//在这个Step方法中进行了碰撞的检测,速度的更新等操作,模拟要在一个循环里,才能持续

 

碰撞检测:

如果没有自定义设定world.setContactFilter.则box2d的碰撞是自动的.那么在碰撞后需要执行行为,要怎么做呢.我们可以通过world.setContactListener来检测碰撞,该接口有两个函数,endContact和beginContact,任何刚体开始碰撞都会执行beginContact,结束碰撞都会执行endContact.,参数Contact则是当前的碰撞,通过Contact.getFixtureA获得创建时间比较早的对象,Contact.getFixtureB获得创建时间晚的对象.然后大家可以在这两个函数里加上自定义的东西了.

 

碰撞过滤:

碰撞过滤的意思是我们可以指定哪些刚体会碰撞,哪些不会.如果没有设定world.setContactFilter.则使用默认的过滤,即全部刚体都会发生碰撞,ContactFilter这个接口里只有一个函数shouldCollide,字面意思就是"应该碰撞",是返回boolean类型的,我们就知道如果需要碰撞则返回true,不需要碰撞则返回false.函数有两个Fixture夹具.当两个刚体碰撞时,创建时间较早的是fixtureA,晚的是fixtureB.Fixtrue内置的filter也有相同的功能,但是有了ContactFilter后,也就不需要用了.

 

关于world的create和destroy要注意:

在游戏中create和destroy刚体或者关节的时候,记得要检测world锁的状态,否则有时候会出现错误isLocked()==false.因为当在world模拟step的时候,world.isLocked()是为true的,world无法create或者destroy.而此时我们又执行create或者destroy,所以就会出现错误了.

还有create和destroy不能在callbacks里面.否则也会出现上面的错误.在destroyBody函数的说明里有:This function is locked during callbacks. 此函数在callbacks里是上锁的,也就是不能使用的.callbacks就是如ContactListener里的beginContact函数,也就是被动执行的函数,被称为callbacks.

所以我们一定要在world.isLocked()==false的时候才能执行create和destroy.

在执行create和destroy前应该检测锁的状态:

if(world.isLocked())

    return;//or do something else

 

Gdx中处理输入:

在Gdx中如果我们需要对输入有相应的操作,则应该Gdx.input.setInputProcessor.InputProcessor是输入处理器接口.里面包括了我们需要的各种回调函数callbacks.

touch类的:touchUp,touchMoved,touchDragged,touchDown;

key类的:keyUp,keyTyped,keyDown;

还有一个scrolled;//Called when the mouse wheel was scrolled. Will not be called on Android.

分享到:
评论
9 楼 lin_kk 2014-05-06  
最近正在学,请问LZ有源码事例吗,如果有能发一下我邮箱吗,万分感谢!453611148@qq.com
8 楼 dickycat 2012-08-09  

学习了,最近正在学这一块,年纪大了,学起来有点吃亏!
7 楼 kongweile 2011-11-25  
javalover00000 写道
kongweile 写道
javalover00000 写道
好文章,正准备学习一下Libgdx的 box2d呢。请问下“夹具”是个什么概念?

夹具就是刚体的物理性质,如形状,密度,摩擦力等.

哦~ 明白了,Shape定义形状,Fixture定义物理性质,然后生成一个Body 就是一个物体了!

right~so smart~
6 楼 javalover00000 2011-11-25  
kongweile 写道
javalover00000 写道
好文章,正准备学习一下Libgdx的 box2d呢。请问下“夹具”是个什么概念?

夹具就是刚体的物理性质,如形状,密度,摩擦力等.

哦~ 明白了,Shape定义形状,Fixture定义物理性质,然后生成一个Body 就是一个物体了!
5 楼 kongweile 2011-11-24  
javalover00000 写道
好文章,正准备学习一下Libgdx的 box2d呢。请问下“夹具”是个什么概念?

夹具就是刚体的物理性质,如形状,密度,摩擦力等.
4 楼 javalover00000 2011-11-24  
好文章,正准备学习一下Libgdx的 box2d呢。请问下“夹具”是个什么概念?
3 楼 qxinghui 2011-09-22  
很好的文章
有很多不是很明白
Sprite和你这里说的刚体有什么不同呢?
怎么给刚体指定个图片呢???
2 楼 kongweile 2011-07-31  
tonyzzp 写道
最近在看libgdx
也没啥文档  不好学啊

嗯.超级悲剧的...
1 楼 tonyzzp 2011-07-29  
最近在看libgdx
也没啥文档  不好学啊

相关推荐

    使用libgdx中box2d编写的一个简单游戏测试场景1

    《使用libgdx和Box2D构建简单游戏测试场景1》 在游戏开发领域,libgdx和Box2D是两个强大的工具,它们为开发者提供了丰富的功能和灵活性。libgdx是一个开源的游戏开发框架,支持多平台发布,包括Android、iOS、桌面...

    一个libgdx下box2d的使用实例

    一个libgdx下box2d的使用实例 包括box2d刚体创建,碰撞已经刚体和texture的绑定

    Libgdx专题系列 box2d

    这个专题系列聚焦于Box2D,一个广泛使用的物理模拟库,它被集成到Libgdx中,为游戏开发者提供了一个实现真实感物理效果的强大工具。Box2D使得开发者能够轻松地创建动态物体、碰撞检测、刚体动力学等,从而创造出更...

    Node.js-一个GLES2自上而下的赛车游戏构建在libgdx和Box2D之上

    《Node.js与libgdx和Box2D构建的GLES2赛车游戏详解》 在现代游戏开发领域,Node.js可能并非第一选择,但它在构建服务器端逻辑或工具链时却有着广泛的应用。本项目名为"Node.js-一个GLES2自上而下的赛车游戏构建在...

    Libgdx(包含box2d)开发的PC版、Android版Flappy Bird

    在本项目"Libgdx(包含box2d)开发的PC版、Android版Flappy Bird"中,开发者使用了Libgdx来重制经典游戏Flappy Bird,以展示Libgdx的功能和Box2D物理引擎的应用。 首先,我们来了解一下Libgdx。Libgdx是一个用Java...

    Libgdx box2d demo

    在这个名为"Libgdx box2d demo"的项目中,我们看到开发者使用Eclipse作为集成开发环境(IDE),加载并运用了Libgdx引擎,同时整合了Box2D物理引擎,创建了一个学习Box2D的实例。这个实例可能是一个基于小球的游戏,...

    libgdx使用box2d的demo,很不错

    总之,"libgdx使用box2d的demo"是一个很好的学习资源,它帮助开发者了解如何在LibGDX环境中实现复杂的2D物理效果,这对于开发出更真实、更有趣的游戏至关重要。通过深入研究这个Demo,你将能够掌握一系列实用的技能...

    Libgdx-Box2D:方块2D

    四、使用Libgdx-Box2D开发游戏 在实际开发中,开发者首先需要创建一个World对象,然后定义Body及其Fixture。可以通过加载精灵图(Sprite)并创建对应的Body来实现游戏对象的物理行为。例如,创建一个角色Body时,...

    android游戏开发框架libgdx的使用9.pdf

    其中,LibGDX 使用 JNI 封装了 Box2D,速度和易用性都不错。 下面,我们将详细介绍如何在 LibGDX 中使用 Box2D。 首先,我们需要创建一个游戏项目,并添加 LibGDX 依赖项。然后,我们可以开始编写游戏逻辑。 首先...

    使用 Artemis Entity Framework、Libgdx 和 Box2D 编写的 简单游戏_java_代码_下载

    在本项目中,开发者利用了三个关键的开源库——Artemis Entity Framework、LibGDX 和 Box2D,创建了一个简单的直升机游戏。这些技术在Java编程中被广泛应用于游戏开发,各自都有其独特的功能和优势。 首先,让我们...

    Box2D:libgdx的Box2D系列博客源码-源码客

    Box2D是一个流行的开源2D物理引擎,广泛用于游戏开发,特别是使用libGDX框架的项目。libGDX是Java的跨平台游戏开发库,它为Android、iOS、桌面(Windows、Mac、Linux)以及HTML5提供了统一的API。Box2D与libGDX结合...

    一个基于libgdx和Box2D的GLES2自上而下的赛车手。-Android开发

    uRacer:漂移之王GLES2自上而下的赛车手,构建在libgdx和Box2D之上。 免责声明该项目在我的硬盘上放置了太久了,因此我将其作为开源项目发布到hoRacer中:The Drift of Drift一个Glib2自上而下的赛车手,它建立在...

    libgdx UI编辑器 overlap2d

    Overlap2D是一款免费且开源的2D场景和UI布局编辑器,专为Libgdx设计。这个工具由社区中的热心开发者贡献,旨在简化UI创建过程,提高开发效率。它允许开发者在可视化环境中设计界面,然后导出到Libgdx项目中直接使用...

    SkrGx2DModelEditor:用于创建基于 libGDX 演员和 box2d 主体的模型的编辑器

    《SkrGx2DModelEditor:libGDX与box2D融合的2D模型编辑神器》 在游戏开发的世界中,高效的工具是提升生产力的关键。SkrGx2DModelEditor,正如其名,是一个专门针对libGDX游戏框架和box2D物理引擎的2D模型编辑器。这...

    极品飞车:LibGDX,BOX2D和平铺地图的极品飞车

    极品飞车热Java(赛车模拟)带有LibGDX , BOX2D和平铺地图的NFS产品特点使用LibGDX游戏引擎, Box2D物理引擎和TiledMap开发所有车辆运动变量均根据物理定律进行计算 制动器加速度由下式计算uk * g ,并且g = 10 M/s...

    使用LibGDX开发一个完整游戏 教程全集

    LibGDX集成了Box2D库,用于处理刚体动力学。你可以创建Body、Fixture和Joint来模拟现实世界的物理行为,如重力、碰撞检测和摩擦力。 除此之外,LibGDX还提供了Scene2D库,用于构建2D用户界面(UI)。它包含各种...

    flixel-gdx-box2d:flixel-gdx 的 Box2D 包装器

    Libgdx 团队为 Box2D C++ 编写了一个 JNI 包装器,flixel-gdx 团队编写了一个名为 FlxBox2D 的插件,以使在 flixel 中使用 Box2D 编写代码更容易一些。 ####License FlxBox2D 在新 BSD 许可下分发,这意味着您可以...

    jumpdontdie:在我的YouTube教程中开发的Android游戏的源代码。 使用libGDX,Scene2D,Box2D制作-Android game source code

    这是一个libGDX + Scene2D + Box2D原型游戏。 此处的代码将向您展示如何同时使用Scene2D和Box2D进行Android游戏。 这是YouTube教程系列“ 。 现在测试一下 只是想快速尝试一下已编译的应用程序? 在Google Play商店...

    libgdx 2D横板过关游戏

    《使用libgdx开发2D横版过关游戏详解》 libgdx是一个强大的开源Java游戏开发框架,它允许开发者创建跨平台的游戏,包括Android、iOS、桌面系统以及WebGL。在开发2D横版过关游戏时,libgdx提供了一系列工具和库,...

    libgdx引擎开发的游戏

    5. **Box2D Integration**: 虽然Cuboc可能没有直接使用Box2D(libgdx的物理引擎),但libgdx完全支持Box2D,开发者可以创建复杂的物理世界,实现真实感的碰撞检测和物理模拟。 6. **Game States and Screens**: ...

Global site tag (gtag.js) - Google Analytics