libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感。
libgdx中,Box2d程序的大概过程:
1. 创建物理世界world,并设置重力加速度。
2. 创建正交相机,并设置其宽高。Box2d中使用物理世界中米作为单位,而不是图像中的像素,通常设一个比值,这里为了方便,直接设置为10。
3. 创建世界中的动态物体(一般是方块、圆环或其他形状物体)和静态物体(主要指地面、墙壁等)。
4. 在渲染函数中添加world时间布,并利用DebugRenderer将添加的物体绘制出来即可。
具体代码实例:
package com.fxb.newtest; import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; public class Lib018_Box2d extends ApplicationAdapter{ World world;
OrthographicCamera camera;
Box2DDebugRenderer debugRenderer;
ShapeRenderer rend; @Override
public void create() {
// TODO Auto-generated method stub
super.create(); world = new World( new Vector2( 0, -10f ), true );
debugRenderer =new Box2DDebugRenderer(); camera = new OrthographicCamera();
camera.setToOrtho( false, Gdx.graphics.getWidth()/10, Gdx.graphics.getHeight()/10 ); ////create the body of box
BodyDef boxBodyDef = new BodyDef();
boxBodyDef.type = BodyType.DynamicBody;
//boxBodyDef.position.x = -24 + (float)(Math.random() * 48);
//boxBodyDef.position.y = 10 + (float)(Math.random() * 100);
boxBodyDef.position.set( 40, 50 );
Body boxBody = world.createBody(boxBodyDef); PolygonShape boxPoly = new PolygonShape();
boxPoly.setAsBox(2, 1);
boxBody.createFixture(boxPoly, 1);
boxPoly.dispose(); /////create the body of circle
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
bodyDef.position.set( 60, 100 );
Body bodyCircle = world.createBody( bodyDef ); CircleShape circle = new CircleShape();
circle.setRadius( 2 );
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = circle;
fixtureDef.density = 1f;
fixtureDef.friction = 0.4f;
//fixtureDef.restitution = 0.6f; bodyCircle.createFixture( fixtureDef );
circle.dispose(); /////create the body of ground, static body, can't move
BodyDef groundBodyDef = new BodyDef();
groundBodyDef.type = BodyType.StaticBody;
groundBodyDef.angle = (float)Math.PI*15/180;
groundBodyDef.position.set( 0, 0 );
Body groundBody = world.createBody( groundBodyDef ); PolygonShape groundBox = new PolygonShape();
groundBox.setAsBox( camera.viewportWidth+5, 0.5f );
groundBody.createFixture( groundBox, 0.0f );
groundBox.dispose(); } @Override
public void render() {
// TODO Auto-generated method stub
super.render();
//Gdx.gl.glClearColor( 1, 1, 1, 0.2f );
Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT ); world.step( Gdx.graphics.getDeltaTime(), 6, 2 );
camera.update(); debugRenderer.render( world, camera.combined ); } @Override
public void dispose() {
// TODO Auto-generated method stub
debugRenderer.dispose();
world.dispose();
super.dispose();
} }
运行结果:
程序中,添加了方块、圆环和地面三个物体,前两个为动态,地面为静态,让地面倾斜15度。
方块和圆环从高空下落到斜坡时,就向下滑动,与我们平常生活常识相吻合。
libgdx学习记录18——Box2d物理引擎的更多相关文章
-
libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint
Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...
-
【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎
Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九, ...
-
瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍
转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...
-
实例介绍Cocos2d-x中Box2D物理引擎:使用关节
下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...
-
实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
-
实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D
我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触 ...
-
cocos2d-x中的Box2D物理引擎
在Cocos2d-x中集成了2个物理引擎,一个是Chipmunk,一个是Box2D.前者是用C语言编写的,文档和例子相对较少:Box2D是用C++写的,并且有比较完善的文档和资料.所以在需要使用物理引 ...
-
python下的Box2d物理引擎的配置
/******************************* I come back! 由于已经大四了,正在找工作 导致了至今以来第二长的时间内没有更新博客.向大家表示道歉 *********** ...
-
实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
随机推荐
-
k.APR通道特殊配置
APR/native specific configuration The following attributes are specific to the APR/native connector. ...
-
(Relax 水题1.2)POJ 1032 Parliament(将n分解成若干个互不相等的整数的和,并且是这些整数的乘积最大)
题意:给出一个数n,将其拆分为若干个互不相等的数字的和,要求这些数字的乘积最大. 分析:我们可以发现任何一个数字,只要能拆分成两个大于1的数字之和,那么这两个数字的乘积一定大于等于原数.也就是说,对于 ...
-
linux应用程序地址布局
Linux应用程序在内存中的布局,由高地址到低地址依次为:栈.堆.BSS段.数据段.代码段.代码段的起始地址固定为0x8048000,无论哪一个应用程序它的代码段起始地址一定是0x8048000,这里 ...
-
VS2008下编译boost_1_47_0
1,boost下载 如果不想自己编译,可下载http://boostpro.com/download/boost_1_47_setup.exe,安装后,程序会提供选项供下载已经编译好的库文件,基于 ...
-
sql server保留小数解决方法
在数据库中,我们有时会用到小数,怎样在数据库中转化小数呢,下面是一些常用的方法. 1.使用Round(字段名/数字,小数保留位数)方法,如下所示: select Round(3.333,2) 结果如下 ...
-
hadoop1.0 和 Hadoop 2.0 的区别
1.Hadoop概述 在Google三篇大数据论文发表之后,Cloudera公司在这几篇论文的基础上,开发出了现在的Hadoop.但Hadoop开发出来也并非一帆风顺的,Hadoop1.0版本有诸多局 ...
-
Guava-Objects使用
前言 Java中的Object提供了很多方法供所有的类使用,特别是toString.hashCode.equals.getClass等方法,在日常开发中作用很大,Guava中包含Objects类,其提 ...
-
lvm xfs 扩容
lvresize -L 300M /dev/vg1/lv1 #重新设定大小 e2fsck -f /dev/vg1/lv1 #检查磁盘错误 (针对ext4执行) resize2fs /dev/vg1/l ...
-
java的灵魂——反射
前言:当我们在类加载的时候,除了把.class文件加载到内存,会把各个类存到各个类模板(class类型)对象上,相同的类只有一个类模板对象.连接:把类的二进制数据合并到JRE中 反射运行时探究和使用编 ...
-
SSIS包部署错误之运行环境设置
在SQLServer代理处新建了一个job,步骤里面的操作是指向一个SSIS模型包 执行,报错如下 根据报错信息是64bit,于是做出修改如下图 再次执行 OK