前言

相比Ios UiKit原生支持物理引擎,Android确实麻烦的不要不要。

为什么用 libgdx

  • Android上最方便的方案是jbox2D,缺点是在java层实现,物理多了之后性能很卡。笔者近期没有测试,11年左右在里程碑1上使用的时候那是巨卡无比。
  • libgdx的物理引擎其实是封装的native版本box2D,在满足性能需求的同时,避免了开发JNI的烦恼,对于java程序员来说目前是最便捷的方案。

使用libgdx-box2d

STEP1: build.gradle中添加依赖

dependencies {configurations { natives }implementation "com.badlogicgames.gdx:gdx-box2d:$box2dVersion"natives "com.badlogicgames.gdx:gdx-box2d-platform:$box2dVersion:natives-armeabi"natives "com.badlogicgames.gdx:gdx-box2d-platform:$box2dVersion:natives-armeabi-v7a"natives "com.badlogicgames.gdx:gdx-box2d-platform:$box2dVersion:natives-arm64-v8a"
}task copyAndroidNatives() {file("libs/armeabi/").mkdirs();file("libs/armeabi-v7a/").mkdirs();file("libs/arm64-v8a/").mkdirs();configurations.natives.files.each { jar ->def outputDir = nullif(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")if(outputDir != null) {copy {from zipTree(jar)into outputDirinclude "*.so"}}}
}

STEP2: 渲染层实现

  • libgdx本身是个游戏引擎,提供基于openGLES的渲染引擎,但是对于大多数APPer来说使用成本略高。这里我们通过实现一个自定义view,并通过Canvas#draw()的方式进行渲染。

  • 2.1 初始化box2D

    private void setupBox2D() {Box2D.init();//第一个参数为x、y两个方向的重力值,(0,0)点在左上y轴重力用10mWorld = new World(new Vector2(0, 10), true);}
  • 2.2 在组件四周添加静态刚体
    private void createTopAndBottomBounds() {BodyDef bodyDef = new BodyDef();bodyDef.type = BodyDef.BodyType.StaticBody;PolygonShape box = new PolygonShape();float boxWidth = pixelsToMeters(mWidth);float boxHeight = pixelsToMeters(mRatio);box.setAsBox(boxWidth, boxHeight);FixtureDef fixtureDef = new FixtureDef();fixtureDef.shape = box;fixtureDef.density = 0.5f;fixtureDef.friction = 0.3f;fixtureDef.restitution = 0.5f;bodyDef.position.set(0, -boxHeight * .5f);Body topBody = mWorld.createBody(bodyDef);topBody.createFixture(fixtureDef);bodyDef.position.set(0, pixelsToMeters(mHeight) + boxHeight * .5f);Body bottomBody = mWorld.createBody(bodyDef);bottomBody.createFixture(fixtureDef);}private void createLeftAndRightBounds() {float boxWidth = pixelsToMeters(mRatio);float boxHeight = pixelsToMeters(mHeight);BodyDef bodyDef = new BodyDef();bodyDef.type = BodyDef.BodyType.StaticBody;PolygonShape box = new PolygonShape();box.setAsBox(boxWidth, boxHeight);FixtureDef fixtureDef = new FixtureDef();fixtureDef.shape = box;fixtureDef.density = 0.5f;fixtureDef.friction = 0.3f;fixtureDef.restitution = 0.5f;bodyDef.position.set(-boxWidth * .5f, boxHeight);Body leftBody = mWorld.createBody(bodyDef);leftBody.createFixture(fixtureDef);bodyDef.position.set(pixelsToMeters(mWidth) + boxWidth * .5f, 0);Body rightBody = mWorld.createBody(bodyDef);rightBody.createFixture(fixtureDef);}
  • 2.3 添加一个动态刚体,从(0,0)点下落
    public void addGiftBody() {// First we create a body definitionBodyDef bodyDef = new BodyDef();// We set our body to dynamic, for something like ground which doesn't move we would set it to StaticBodybodyDef.type = BodyDef.BodyType.DynamicBody;// Set our body's starting position in the worldbodyDef.position.set(pixelsToMeters(3), pixelsToMeters(3));bodyDef.linearVelocity.set((float) Math.random(), (float) Math.random() * 100);// Create our body in the world using our body definitionBody body = mWorld.createBody(bodyDef);//TODO 随机Bitmap bitmap = mBitmaps[0];GiftInfo giftInfo = new GiftInfo(bitmap);body.setUserData(giftInfo);body.setFixedRotation(false);PolygonShape box = new PolygonShape();float boxWidth = pixelsToMeters(pixelsToMeters(bitmap.getWidth()));float boxHeight = pixelsToMeters(pixelsToMeters(bitmap.getHeight()));box.setAsBox(boxWidth, boxHeight);// Create a fixture definition to apply our shape toFixtureDef fixtureDef = new FixtureDef();fixtureDef.shape = box;fixtureDef.density = 1.5f;fixtureDef.friction = 0.4f;fixtureDef.restitution = .6f; // Make it bounce a little bit// Create our fixture and attach it to the bodyFixture fixture = body.createFixture(fixtureDef);mBodyList.add(body);box.dispose();}

2.4 渲染、更新物体坐标、以此循环

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawGift(canvas);long time = System.currentTimeMillis() - mLastRenderTime;mLastRenderTime = time;doPhysicsStep(time);postInvalidate();}private void drawGift(Canvas canvas) {int size = mBodyList.size();for (int i = 0; i < size; i++) {Body body = mBodyList.get(i);GiftInfo giftInfo = (GiftInfo) body.getUserData();Bitmap bitmap = giftInfo.getBitmap();canvas.drawBitmap(bitmap, metersToPixels(mBodyList.get(i).getPosition().x) - bitmap.getWidth() * .5f,metersToPixels(mBodyList.get(i).getPosition().y) - bitmap.getHeight() * .5f, mPaint);}}private void doPhysicsStep(float deltaTime) {// fixed time step// max frame time to avoid spiral of death (on slow devices)float frameTime = Math.min(deltaTime, 0.25f);mAccumulator += frameTime;while (mAccumulator >= Constants.TIME_STEP) {mWorld.step(Constants.TIME_STEP, Constants.VELOCITY_ITERATIONS, Constants.POSITION_ITERATIONS);mAccumulator -= Constants.TIME_STEP;}}

结尾

  • 希望能够通过这个简单例子帮助大家使用libgdx-box2d,先水一波。

在Android上使用libgdx-box2d物理引擎相关推荐

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

    libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创 ...

  2. Box2D物理引擎入门

    一.什么是Box2D Box2D是一个强大的开源物理游戏引擎,用来模拟2D刚体物体运动和碰撞,由Erin Catto早在2007年用C++语言开发. Box2D集成了大量的物理力学和运动学的计算,并将 ...

  3. Box2D 物理引擎入门

    转自:https://www.jianshu.com/p/7681431618ec 一.什么是Box2D Box2D是一个强大的开源物理游戏引擎,用来模拟2D刚体物体运动和碰撞,由Erin Catto ...

  4. 用cocos2d-x(初级)实现篮球投篮小游戏,控制篮球投篮,一共三关(第二第三关使用box2d物理引擎)

    实现的功能:(分关说明) 主界面: 1.点击三个不同的按钮实现界面跳转. 第一二三关: 1.用简单的物理公式在update控制小球的运动,实时刷新小球的坐标. 2.使用box2d物理引擎来制作游戏场景 ...

  5. python box2d 教程_python下的Box2d物理引擎的配置

    I come back! 由于已经大四了,正在找工作 导致了至今以来第二长的时间内没有更新博客.向大家表示道歉 前言 Box2d物理引擎 Box2d是一款开源的2d物理引擎,存在很多的版本,C++,J ...

  6. Box2D物理引擎的使用方法

    转:http://www.toswf.com/blog/blogview.asp?logID=103 众所周知的Box2DFlash是一款不错的物理引擎,如果我们了解了他的使用的技巧,我们也可以做出不 ...

  7. Box2D物理引擎模拟炸弹爆炸效果

    今天咱们来模拟炸弹效果.于是问题一来了:"为什么要模仿这么暴力的效果呢?莫非几日不见,Yorhom人品煞变?" 其实玩过愤怒的小鸟的同学都应该对这种效果似曾相识,因为据非官方报道, ...

  8. cocos中的Box2d物理引擎

    原文地址:http://wwk.iteye.com/blog/1722124 一些Box2d的基本概念,一些cocos中使用box2d需要注意的地方 1. cocos2d 自带了两套物理引擎:Box2 ...

  9. Box2d 物理引擎

    1.cocos2d 自带了两套物理引擎:Box2D 和Chipmunk.  两套引擎都是为2D游戏设计的,可以和cocos2d 完美整合.  Box2D 是用 C++写的,而 Chipmunk 用的是 ...

  10. libgdx使用android控件,在Android上使用libGDX中的SQLite

    Dominik Buch.. 13 一种方法是始终在主项目中创建一个接口,让我们调用它NativeFunctions.然后,您的桌面和Android应用程序/活动都会实现此界面.在创建主项目时,您将传 ...

最新文章

  1. vins 解读_代码解读 | VINS 视觉前端
  2. ajax传递参数给springmvc
  3. ASP.NET开发:在用户控件中添加属性
  4. SAP Cloud for Customer和微信小程序的集成-原型开发示意图
  5. 在SQLSERVER企业管理器中如何创建触发器
  6. poi 操作excel的处理
  7. 本地远程查看服务器tomcat 上虚拟机信息
  8. wince怎么刷carplay_carplay wince安装版
  9. java 绘制点阵_[Java基础知识]点阵字库在JAVA中的实现
  10. 关于混合app 开发框架Ionic
  11. android killer java_Android反编译工具的使用-Android Killer
  12. 【零样本知识蒸馏】(六)NeutIPS 2019:Zero-shot knowledge transfer via adversarial belief matching
  13. 微信抢票应用开发总结
  14. java中如何开启事务_Java中开启事务操做数据库
  15. 世纪互联的那些人、那些年、那些事
  16. stream、lamda、optional
  17. WPF中的右键菜单ContextMenu
  18. android 游戏分享
  19. 单片机控制LCD1602显示英文句子
  20. 计算机运行断电 硬盘,电脑突然断电的坏处有哪些?你知道吗?

热门文章

  1. 生命科学名言16:两害相权取其轻
  2. Node对象与Element对象
  3. 优质流量水涨船高,私域流量营销裂变该如何做好?
  4. 英语学习打卡day7
  5. 只有梦幻西游和征途游戏内没有通货膨胀
  6. Android M App 永久隐藏导航栏的Solution
  7. 第五章 Java的基础类之String、StringBuffer、StringBuilder(下)
  8. 灰度图raw8转raw16或raw16转raw8方法
  9. 闪存驱动器_“空”和新格式化的闪存驱动器上如何有可用空间?
  10. 用ffmpeg将aac转成mp3 的.bat文件