JBox2d入门学习一
最近想在网上学习一款Android的开源游戏框架,方便游戏的开发,在学习的过程中我发现无论是Rokon,AndEngine,libgdx他们都使用了同一款非常强大的物理引擎Box2d,所以决定先从这个引擎入手学习一下,将学习的心得记录下来。
首先对这边文章当中要用到几个概念进行说明一下:
World 这是box2d当中抽象出来的存在引力,坐标范围的一个模拟的世界
Body 刚体,存在于World当中的刚体,我们可以通过BodyDef来设置他得属性。在JBOX2D当中我们基本上不需要去关心刚体碰撞所产生的效果,因为该引擎会根据你刚体的属性来帮你做这些处理。比如说你创建的物体会根据当前世界的引力自动下坠,如果两个钢铁相撞会弹开等等。
BodyDef 用来设置刚体的属性,包括密度density,摩擦力friction,弹性restitution等。
Shape 用来描述Body的形状,像PolygonDef 多边体 CircleDef 球体
通过这些概念,我们就可以创建一个最基本的示例:
首先通过去Jbox2d的官方下载源码项目或者是jar包,导入,这里就不做说明。
下面是一个基于android的jbox2d小例子
public class MainActivity extends Activity {
private final static int RATE = 10;//屏幕到现实世界的比例 10px:1m;这里要注意,当我们根据android当中的坐标去定义刚体的位置时,我们需要将坐标除以这个比例获得世界当中的长度,用这个长度来进行定义。
private AABB worldAABB; //创建一个坐标系统
private World world; //创建一个世界
private float timeStep; //模拟的的频率
private int iterations; //迭代越大,模拟约精确,但性能越低
private Body body,body1; //创建刚体
private MyView myView; //我们自己定义的view,用来绘制出这个世界
private Handler mHandler;
private float density;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE); //去title
getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);//全屏
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
density = metric.density;
//创建这个世界的坐标范围,并且设定上下限,这里应该是按世界的长度来算的,也就是说这个范围是足够大的,我们只能在这个范围内创建刚体
worldAABB = new AABB();
worldAABB.lowerBound.set(-100.0f, -100.0f);
worldAABB.upperBound.set(100.0f, 100.0f);
//end
Vec2 gravity = new Vec2(0.0f, 10.0f); //向量,用来标示当前世界的重力方向,第一个参数为水平方向,负数为做,正数为右。第二个参数表示垂直方向
boolean doSleep = true; //标示 是否睡眠
world = new World(worldAABB, gravity, doSleep);//创建世界
createBorder(0,410*density,320*density,10*density);//创建一个边界
createBall(150,50,20,1); //创建两个球
createBall(155,100,20,2);
myView = new MyView(this) ;
timeStep = 1.0f/60.0f; //定义频率
iterations = 10; //定义迭代
setContentView(myView);
mHandler = new Handler();
mHandler.post(update); //android的知识,就不做标识了
}
private Runnable update = new Runnable() {
public void run() {
world.step(timeStep, iterations); //开始模拟
/*Vec2 gravity = new Vec2(1000.0f, 0f);
Vec2 gravity1 = new Vec2(100.0f, -100f);
body.applyForce(gravity,gravity1); */ //这段代码是尝试给刚体一个力
Vec2 position = body.getPosition();
myView.x1=position.x*RATE;
myView.y1=position.y*RATE;
position = body1.getPosition();
myView.x2=position.x*RATE;
myView.y2=position.y*RATE;
myView.invalidate();
mHandler.postDelayed(update, (long)timeStep*1000);
}
};
public void createBorder(float x, float y, float half_width,
float half_height) {
PolygonDef shape = new PolygonDef(); //标识刚体的形状
shape.density = 0; //设置刚体的密度,应为这个是底边界,所以密度设为0,相当于没有质量的物体不受力
shape.friction = 11f; //摩擦力,学过物理吧….恩,就是这个意思…
shape.restitution = 0.3f; //弹力
shape.setAsBox(half_width / RATE, half_height/RATE); //设置刚体刚体的宽和高,要根据android坐标转换成世界当中的单位
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x / RATE, y / RATE); //定义刚体的位置
Body body1 = world.createBody(bodyDef); //在世界中创建这个刚体
body1.createShape(shape); //刚体形状
body1.setMassFromShapes(); //计算质量
}
public void createBall(float x,float y,float radius,int i)
{
CircleDef shape = new CircleDef();
shape.density = 7f;
shape.friction = 11f;
shape.restitution = 0.3f;
shape.radius = radius/RATE;
BodyDef bodyDef = new BodyDef();
bodyDef.position.set(x / RATE, y / RATE);
if( i == 1)
{
body = world.createBody(bodyDef);
body.createShape(shape);
body.setMassFromShapes();
}
else
{
body1 = world.createBody(bodyDef);
body1.createShape(shape);
body1.setMassFromShapes();
}
}
class MyView extends View
{
Canvas canvas;
public float x1 = 150, y1 = 50;
public float x2 = 155, y2 = 100;
public MyView(Context context) {
super(context);
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
this.canvas = canvas;
drawBall(x1,y1);
drawBall(x2, y2);
drawBorder();
}
private void drawBall(float x,float y)
{
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawCircle(x, y, 20, paint);
}
private void drawBorder()
{
Paint paint = new Paint();
paint.setColor(Color.GREEN);
paint.setAntiAlias(true);
canvas.drawRect(0,400*density,320*density,410*density,paint);
}
}
}
这样跑起来就可以实现二个小球下坠碰撞的小例子
效果图
学会了创建世界和刚体,明白了怎么给物体一个力,下一步学习一下做类似于愤怒的小鸟那种例子,敬请期待吧。
转自http://bbs.51cto.com/thread-886355-1-1.html
JBox2d入门学习 原文地址:http://labs.ywlx.net/?p=1421
JBox2d入门学习一相关推荐
- JBox2d入门学习二 -----我的小鸟
入门学习一当中我学会了如何定义并且创建一个世界,在世界当中定义并且创建一个刚体,并尝试给刚体一个力.最近比较忙..现在抽空实现了一个类似于愤怒小鸟的例子,先看看图吧. 贴代码,注解写的比较详细了, ...
- python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全
近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...
- MAYA 2022基础入门学习教程
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...
- 3dmax Vray建筑可视化入门学习教程
面向初学者的3Ds Max Vray最佳Archviz可视化课程 从安装到最终图像的一切都将从头开始教授,不需要任何经验 大小解压后:3.25G 时长4h 6m 1280X720 MP4 语言:英语+ ...
- Blender 3.0基础入门学习教程 Introduction to Blender 3.0
成为Blender通才,通过这个基于项目的循序渐进课程学习所有主题的基础知识. 你会学到什么 教程获取:Blender 3.0基础入门学习教程 Introduction to Blender 3.0- ...
- Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya
准备好开始为游戏制作自己的角色动画了吗? 你会学到什么 了解Maya的界面 优化并准备好你的模型,为游戏做准备 了解关节以及如何使用它们来构建健壮的角色骨骼,以便在任何游戏引擎中制作动画 了解IK和F ...
- 三维地形制作软件 World Machine 基础入门学习教程
<World Machine课程>涵盖了你需要的一切,让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形. 你会学到什么 为渲染或游戏开发创建高分辨率.高细节的地形. 基于Worl ...
- Blender3.0动画制作入门学习教程 Learn Animation with Blender (2021)
要求 下载并安装Blender.免费下载和免费用于任何目的. 描述 加入我的动画课程. 在本课程中,我将从头开始讲述在Blender中创建动画场景的过程. 从第一步到最终渲染.在这个课程中,我们将使用 ...
- UE5真实环境设计入门学习教程
大小解压后:4.69G 时长4h 30m 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 虚幻引擎5–面向初学者的真实环境设计 Unreal Engine 5 – Rea ...
最新文章
- JavaScript语言基础7
- Linux_《Linux命令行与shell脚本编程大全》第二章学习总结
- Scrapy保存到txt文件或者数据库里面
- is not allowed to connect to this MySql
- CSS基础(part18)--溢出的文字省略号显示
- Bootstrap-CSS:表格
- java erlang_Java开发人员的Erlang
- c语言位运算负数的实例_JavaScript基础教程(四)二进制位运算
- 2015安徽省赛 G.你来擒孟获
- 服务高可用利器——限流算法介绍与示例
- linux下mysql5.7以上my.cnf配置文件配置
- S3C2440 ADC采样光敏电阻传感器驱动
- 计算机组成原理sp接口,计算机组成原理2008年4月真题试题(02318)
- 小米电脑如何把计算机放桌面上,小米电脑怎么把此电脑放到桌面上
- Win10 【TITAN Xp】和【TITAN RTX】-【TensorFlow】环境简单总结
- VC/MFC 编程经验
- 知识付费,下半场怎么走(附大会PPT下载)
- 人脸识别考勤 Android 课程设计
- 如何安装 Ubuntu 22.04 LTS 桌面版 ?
- 麦克斯韦方程组微分形式