libgdx学习记录18——Box2d物理引擎

libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感。

libgdx中,Box2d程序的大概过程:

1. 创建物理世界world,并设置重力加速度。

2. 创建正交相机,并设置其宽高。Box2d中使用物理世界中米作为单位,而不是图像中的像素,通常设一个比值,这里为了方便,直接设置为10。

3. 创建世界中的动态物体(一般是方块、圆环或其他形状物体)和静态物体(主要指地面、墙壁等)。

4. 在渲染函数中添加world时间布,并利用DebugRenderer将添加的物体绘制出来即可。

具体代码实例:


  1 package com.fxb.newtest;
2
3 import com.badlogic.gdx.ApplicationAdapter;
4 import com.badlogic.gdx.Gdx;
5 import com.badlogic.gdx.graphics.GL10;
6 import com.badlogic.gdx.graphics.OrthographicCamera;
7 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
8 import com.badlogic.gdx.math.Vector2;
9 import com.badlogic.gdx.physics.box2d.Body;
10 import com.badlogic.gdx.physics.box2d.BodyDef;
11 import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
12 import com.badlogic.gdx.physics.box2d.CircleShape;
13 import com.badlogic.gdx.physics.box2d.Fixture;
14 import com.badlogic.gdx.physics.box2d.FixtureDef;
15 import com.badlogic.gdx.physics.box2d.PolygonShape;
16 import com.badlogic.gdx.physics.box2d.World;
17 import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
18
19 public class Lib018_Box2d extends ApplicationAdapter{
20
21 World world;
22 OrthographicCamera camera;
23 Box2DDebugRenderer debugRenderer;
24 ShapeRenderer rend;
25
26 @Override
27 public void create() {
28 // TODO Auto-generated method stub
29 super.create();
30
31 world = new World( new Vector2( 0, -10f ), true );
32 debugRenderer =new Box2DDebugRenderer();
33
34 camera = new OrthographicCamera();
35 camera.setToOrtho( false, Gdx.graphics.getWidth()/10, Gdx.graphics.getHeight()/10 );
36
37
38 ////create the body of box
39 BodyDef boxBodyDef = new BodyDef();
40 boxBodyDef.type = BodyType.DynamicBody;
41 //boxBodyDef.position.x = -24 + (float)(Math.random() * 48);
42 //boxBodyDef.position.y = 10 + (float)(Math.random() * 100);
43 boxBodyDef.position.set( 40, 50 );
44 Body boxBody = world.createBody(boxBodyDef);
45
46 PolygonShape boxPoly = new PolygonShape();
47 boxPoly.setAsBox(2, 1);
48 boxBody.createFixture(boxPoly, 1);
49 boxPoly.dispose();
50
51
52 /////create the body of circle
53 BodyDef bodyDef = new BodyDef();
54 bodyDef.type = BodyType.DynamicBody;
55 bodyDef.position.set( 60, 100 );
56 Body bodyCircle = world.createBody( bodyDef );
57
58 CircleShape circle = new CircleShape();
59 circle.setRadius( 2 );
60 FixtureDef fixtureDef = new FixtureDef();
61 fixtureDef.shape = circle;
62 fixtureDef.density = 1f;
63 fixtureDef.friction = 0.4f;
64 //fixtureDef.restitution = 0.6f;
65
66 bodyCircle.createFixture( fixtureDef );
67 circle.dispose();
68
69
70
71 /////create the body of ground, static body, can‘t move
72 BodyDef groundBodyDef = new BodyDef();
73 groundBodyDef.type = BodyType.StaticBody;
74 groundBodyDef.angle = (float)Math.PI*15/180;
75 groundBodyDef.position.set( 0, 0 );
76 Body groundBody = world.createBody( groundBodyDef );
77
78 PolygonShape groundBox = new PolygonShape();
79 groundBox.setAsBox( camera.viewportWidth+5, 0.5f );
80 groundBody.createFixture( groundBox, 0.0f );
81 groundBox.dispose();
82
83 }
84
85 @Override
86 public void render() {
87 // TODO Auto-generated method stub
88 super.render();
89 //Gdx.gl.glClearColor( 1, 1, 1, 0.2f );
90 Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT );
91
92 world.step( Gdx.graphics.getDeltaTime(), 6, 2 );
93 camera.update();
94
95 debugRenderer.render( world, camera.combined );
96
97 }
98
99 @Override
100 public void dispose() {
101 // TODO Auto-generated method stub
102 debugRenderer.dispose();
103 world.dispose();
104 super.dispose();
105 }
106
107 }

运行结果:

程序中,添加了方块、圆环和地面三个物体,前两个为动态,地面为静态,让地面倾斜15度。

方块和圆环从高空下落到斜坡时,就向下滑动,与我们平常生活常识相吻合。

时间: 2024-11-23 05:59:46

libgdx学习记录18——Box2d物理引擎的相关文章

libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint

Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Box2d内置的积分器实现运动变化. 冲量是一个瞬时效果,能立马改变其效果. 主要函数: body.applyLinearImpulse( Vector2 impulse, Vector2 position, boolean wakeup ) 第一个参数表示冲量,包含x和y方向的大小. 第二个参数表示施

COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建

1.创建一个物理世界 首先要引入一个头文件#include "Box2D\Box2D.h" 之后利用b2word创建一个对象,并且指定这个物理世界中的加速度方向. word = new b2World(b2Vec2(0,-10));                        //指定物理世界的加速度 最后还要重写一下update函数,这个函数在之前的计时器学习的时候已经说过,每一帧的变动都将自动执行这个函数.所以我们要通过这个函数来进行创建的物理世界的刷新. 2.创建一个运动的物体

COCOS2DX学习之box2d物理引擎在VS2012中的配置

因为vs中并没有继承box2dz游戏物理引擎,所以在开发有关box2d的游戏的时候,要自己将这个引擎添加进去.首先在解决方案中添加一个已经存在的项目,这个项目的路径就是你创建的cocos2dx项目的目录里面cocos2d\external\Box2D\proj.win32这个文件夹下面的一个vs工程,把它添加进去编译好,就会看到proj.win32\Debug.win32中有了Box2d的库. 之后,将生成的box2d的库添加到项目属性的连接器中即可 tool是我创建的coocs2dx项目 CO

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

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

瘸腿蛤蟆笔记28-cocos2d-x-3.2 Box2d物理引擎collision模块介绍

上篇回顾 本篇名言:绝不测量山的高度─除非你已到达顶峰,那时你就会知道山有多低. [哈马绍] 上篇中,我们学习了Box2d物理引擎的三大模块之一的common模块,该模块主要包含设置,内存管理和向量数学. 这次蛤蟆接着学习collison模块. 理论介绍 这个collision模块包括了shapes和函数.同时包括一个动态树和broad-phase(蛤蟆不知道怎么解释这个)用于加速碰撞系统.这个模块设计的时候是在动态系统之外使用的.        Shape 这里的shapes描述了碰撞几何,可

libgdx学习记录19——图片动态打包PixmapPacker

libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题,这里针对的是0.9.9版本) 2. 使用TexturePacker将图片打包好然后作成一张大图添加进来. 第二种方法是常用方法,但是不太灵活,添加.删除某些图片不太方便,改动较大.这里可以考虑使用PixmapPacker将图片进行动态打包. 主要方法: pack(String name, Pixm

【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎

Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九,学习BOX2D物理引擎! 学习路径图: 课程适合小白系统学习,仅需6个课时,在极客学院首席讲师风趣幽默的课程里轻松掌握BOX2D物理引擎.恭喜你也从此将走上为牛X程序员的不归路. 今年上午9点正式上线,请别再期待娱乐圈的新闻了,马上開始学习吧>>> 我们还有很多其它更新更实战的课程,登录极客

libgdx学习记录23——图片移动选择

模拟移动选择图片,采用相机实现. 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.Color; 6 import com.badlogic.gdx.graphics.GL10; 7 import com.badlogic.gdx.graphics.Texture;

瘸腿蛤蟆笔记34-cocos2d-x-3.2 Box2d物理引擎World类介绍

上篇回顾 本篇名言:将爱的能量传送给别人,我们自己就会变成一条管道,吸纳来自上天的神圣能源.而那种玄秘体验是我们每个人都得以品尝的! [詹姆士·雷德非] 上篇中,我们学习了Box2d物理引擎dynamics模块中的Contact类,该类包含所有的接触类型.物体碰撞的具体都在该类中. 蛤蟆接着学习dynamics模块中的类,这次咱们学习World这个类. 理论介绍 World类(其实是b2World类,蛤蟆之前说过,Box2d中的类都是b2开头的)包含Body和Joint. 它管理所有的仿真允许异