Android上使用Box2d

在Android上使用Box2D进行编程 通过以上步骤,您已经可以在Android应用程序中使用Box2D进行物理模拟了。当然,Box2D还提供了很多其他功能和选项,如碰撞检测、关节约束等,您可以进一步探索和使用这些功能来满足您的需求。在使用Box2D之前,我们需要创建一个物理世界并在其中添加物体。在我们创建了物理世界和物体之后,我们需要在每一帧中更新物理世界的状态。在上述示例中,我们首先创建了一个重力向下的物理世界,并在世界中添加了一个地面和一个动态方块。在这个示例中,我们使用了一个Handler来在Android的主线程中更新物理世界。 阅读详情

Android上使用Box2d



Box2d是一个非常优秀的开源2D物理引擎,可以模拟出非常真实的物理效果,今天我们介绍如何在Andoird下使用Box2d:

注:本文的大部分参考:http://rayleung.iteye.com/blog/439056



1.

Box2d原来使用c++写的,不过已经有了Java版本的:JBox2D,可以在http://sourceforge.net/projects/jbox2d/下载,一共有两个:

JBox2d-2.0.1.zip和JBox2D-2.0.1-b250-Full.jar。我的版本是2.0.1



2.

新建一个Android Project,如下所示:





2.

修改Jbox2dtestActivity.java文件如下:

package com.test.jbox2d;

import org.jbox2d.collision.AABB;
import org.jbox2d.collision.CircleDef;
import org.jbox2d.collision.PolygonDef;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyDef;
import org.jbox2d.dynamics.World;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

public class Jbox2dtestActivity extends Activity
{
  private final static int RATE = 10; //屏幕到现实世界的比例 10px:1m;
  private AABB worldAABB;             //创建 一个管理碰撞的世界
  private World world;
  private float timeStep = 1/60;      //模拟的的频率
  private int iterations = 10;        //迭代越大,模拟约精确,但性能越低
  private Body body,body2,body3;
  private MyView myView;
  private Handler mHandler;
  
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
    WindowManager.LayoutParams. FLAG_FULLSCREEN);

    worldAABB = new AABB();
         
    //上下界,以屏幕的左上方为 原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟
    worldAABB.lowerBound.set(-100.0f,-100.0f);
    worldAABB.upperBound.set(100.0f, 100.0f);//注意这里使用的是现实世界的单位

    Vec2 gravity = new Vec2(0.0f,10.0f);
    boolean doSleep = true;

    world = new World(worldAABB, gravity, doSleep);//创建世界

    createBox(160, 470, 160, 10, true);     
    createBox1(160, 150, 160, 10, false);

    createCircle(160, 100, 10);
    createCircle1(150, 60, 10);
    timeStep = 1.0f/60.0f;
    iterations = 10;

    myView = new MyView(this);
    setContentView(myView);
    mHandler = new Handler();
    mHandler.post(update);
  }

  private Runnable update = new Runnable()
  {
    public void run()
    {
      world.step(timeStep, iterations);//开始模拟
      Vec2 position = body.getPosition();
      Vec2 position1 = body2.getPosition();
      Vec2 position2 = body3.getPosition();
      myView.x=position.x*RATE;
      myView.y=position.y*RATE;

      myView.x1=position1.x*RATE; 
      myView.y1=position1.y*RATE;

      myView.x2=position2.x*RATE;
      myView.y2=position2.y*RATE;
      myView.update();
      mHandler.postDelayed(update, (long)timeStep*1000);
    }
  };
    
  public void createBox(float x, float y, float half_width, float half_height, boolean isStatic)
  { 
    PolygonDef shape = new PolygonDef();
    if(isStatic)
    {
      shape.density = 0;
    }
    else
    {
      shape.density = 2.0f;
    }
    shape.friction = 0.8f;
    shape.restitution = 0.3f;
    shape.setAsBox(half_width/RATE, half_height/RATE);

    BodyDef bodyDef = new BodyDef();
    bodyDef.position.set(x/RATE, y/RATE);
    Body body1= world.createBody(bodyDef);
    body1.createShape(shape);
    body1.setMassFromShapes();
  }
    
  public void createCircle(float x, float y, float radius)
  {
    CircleDef shape = new CircleDef();
    shape.density = 7;
    shape.friction = 0.2f;
    shape.radius = radius/RATE;

    BodyDef bodyDef = new BodyDef();
    bodyDef.position.set(x/RATE, y/RATE);
    body2 = world.createBody(bodyDef);
    body2.createShape(shape);
    body2.setMassFromShapes();
  }

  public void createCircle1(float x, float y, float radius)
  {
    CircleDef shape = new CircleDef();
    shape.density = 7;
    shape.friction = 0.2f;
    shape.radius = radius/RATE;

    BodyDef bodyDef = new BodyDef();
    bodyDef.position.set(x/RATE, y/RATE);
    body3 = world.createBody(bodyDef);
    body3.createShape(shape);
    body3.setMassFromShapes();
  }

  public void createBox1(float x, float y, float half_width, float half_height, boolean isStatic)
  { 
    PolygonDef shape = new PolygonDef();
    if(isStatic)
    {
      shape.density = 0;
    }
    else
    {
      shape.density = 2.0f;
    }
    shape.friction = 0.3f;
    shape.setAsBox(half_width/RATE, half_height/RATE);

    BodyDef bodyDef = new BodyDef();
    bodyDef.position.set(x/RATE, y/RATE);
    body= world.createBody(bodyDef);
    body.createShape(shape);
    body.setMassFromShapes();
  }

  class MyView extends View
  {
    Canvas canvas;
    public float x=160,y=150;
    public float x1=160,y1=100;
    public float x2=150,y2=60;
    public MyView(Context context)
    {
      super(context);
    }

    public void drawBox(float x, float y)
    {
      Paint mPaint = new Paint();
      mPaint.setAntiAlias(true);
      mPaint.setColor(Color.RED);
      canvas.drawRect(x-160, y-10, x+160, y+10, mPaint);
    }

    public void drawGround()
    {
      Paint mPaint = new Paint();
      mPaint.setAntiAlias(true);
      mPaint.setColor(Color.BLUE);
      canvas.drawRect(0, 460, 320, 480, mPaint);
    }

    public void drawCircle(float x1, float y1)
    {
      Paint mPaint = new Paint();
      mPaint.setAntiAlias(true);
      mPaint.setColor(Color.GREEN);
      canvas.drawCircle(x1, y1, 10, mPaint);
    }
    
    public void update()
    {
      postInvalidate();
    }
    
    protected void onDraw(Canvas canvas)
    {
      super.onDraw(canvas);
      this.canvas = canvas;
      drawGround();
      drawBox(x, y);
      drawCircle(x1, y1);
      drawCircle(x2, y2);
    }
  }
}




3.

加入JBox2D.jar库:

在项目目录中新建一个libs文件夹,

解压JBox2d-2.0.1.zip,找到jbox2d-2.0.1-library-only.jar,加入libs文件夹中

然后右击项目,选择属性,在Java Build Path的Libraries中加入这个jar文件,如下如所示:




4.

在模拟器中运行就可以了,结果如下:



不过在模拟器上运行会卡,在真机上也如此。并且运行程序时CPU使用率很高!不知如何解决?




完成!

24、Android平台下Box2D与Boost库的移植与使用 本文详细介绍了在Android平台上移植和使用Box2D物理引擎与Boost C++库的方法。涵盖了Box2D的世界构成、碰撞检测机制、传感器与过滤技术,以及Boost库的预构建流程,包括编译配置、GCC优化选项和静态库生成。同时探讨了Box2D的关节、射线投射等高级功能与Boost的头文件集成方式,为Android开发者提供高效的物理模拟与功能扩展解决方案。 阅读详情

相关推荐

jBox2D物理引擎在Android游戏开发中的应用详解

本文还有配套的精品资源,点击获取 简介:jBox2D是Box2D的Java实现版本,针对Android平台优化,提供2D物理模拟库。它包括World容器、Body物体表示、Fixture物理特性定义、Shape几何形状表示、Joint连接机制和施加Force/Torque的物理效果。通过API使用,开发者可以构建丰富的真实物理游戏场景,提升用户体验。 1. jBo...

weixin_42418754的博客 1795

利用Jbox2D物理引擎实现愤怒的小鸟

要导入jar包:jbox2d-library-2.2.1.1.jar 1、

Hi~Future 2400

Android游戏源码基于jbox2d的仿愤怒的小鸟游戏

本项目是一个基于jbox2d的仿愤怒的小鸟的游戏源码,跟愤怒的小鸟玩法一致,不过主角从鸟换成了猪,游戏操作也比较流畅,不过玩了几局以后好像出现了bug,懂jbox2d的朋友再具体看一下吧,源码不多没有分层有比较详细的中文注释默认编译版本2.3.3编码GBK

Android使用JBox2D实现碰撞效果

4. 完整源码下载地址:https://pan.baidu.com/s/1gQihcPQLMz2NsT3dO4R0EQ?

lilihexiaoxiangege的博客 582

JBox2D引擎Android版

由JBox2D 2.1.2 版本(目前官方最新版)源码修改而来,专门适合android平台使用,效率更高!

手机相机基础技术解析:从硬件到算法的全面指南

手机相机的成像过程可简化为的链路,其核心硬件包括 镜头、CMOS传感器、ISP(图像信号处理器) 以及配套的软件算法。

weixin_44239603的博客 2450

jbox2d android教程,Jbox2d实践应用

开门见山,一针见血~~先来一张图片再说!前言JBox2D是开源的物理引擎Box2D的Java版本,可以直接用于Android。由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该引擎能够根据开发人员设定的参数,如重力、密度、摩擦系数和弹性系数等,自动地进行2D刚体物理运动的全方位模拟。开发前准备首先我们得上github...

weixin_39714835的博客 960

保姆级教程:用MS建完分子模型,如何一键转成LAMMPS能用的data文件?

本文详细介绍了如何将Materials Studio(MS)构建的分子模型转换为LAMMPS可用的data文件的全流程。重点讲解了力场选择、环境配置、转换命令参数解析及常见问题排查,帮助初学者快速掌握MS与LAMMPS之间的数据转换技巧,特别适合计算材料学领域的研究人员。

weixin_42665255的博客 471

在Android NDK中编译和使用Box2D

本文使用Windows+NDKr8编译,编译前请自行配置好相关环境变量 Box2D是一个在手机游戏开发中使用的物理引擎,本文使用NDK将Box2D移植到Android 首先去Box2D官网下载最新版的源码,目前版本是2.2.1,下载地址是:Box2D_v2.2.1.zip 解压源码,删除源码目录中除Box2D以外的其它目录,将HelloWorld目录中的HelloWorld.cpp复制到源码

tyl_355402的专栏 1144

【科研导航】【计算机视觉与图像处理】从顶刊到潜力股:跨学科(电子/电气/信息)SCI期刊投稿全景图

本文全面解析了计算机视觉与图像处理领域的SCI期刊投稿策略,涵盖从顶刊到潜力股的各类期刊特点。重点介绍了IEEE Transactions系列、Elsevier旗舰期刊以及二区优质期刊的审稿偏好和投稿技巧,特别适合电子/电气/信息交叉学科的研究者。文章还提供了三区、四区期刊的实用投稿建议,帮助科研新手快速找到适合的发表平台。

weixin_30897233的博客 83

UE4引擎分析获取UWord,GName,GetName,GObjectArray

UE4引擎具有很多固定特征和特性 所以我们在逆向UE4引擎开发的游戏的时候,可以利用这些特征和特性. 当然,正常思路逆向也是没问题的(例如我们的ttw课程全数据逆向),你就当多了一个针对于该引擎逆向的快捷方式 或则多了一个思路即可. 正常逆向+引擎分析,使逆向结果全面且快速.

任鸟飞2217777779的博客 1万+

android libgdx触摸,在Android上使用libgdx-box2d物理引擎

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

weixin_36204513的博客 346

国科大人工智能原理与算法-2024-第一次作业-雷震老师

1. 反射行动(比如从热炉子上缩回你的手)是理性的吗?它们是智能的吗? 2. 以下的计算机系统在何种程度上是人工智能的实例: - 超市条码扫描器 - 网络搜索引擎 - 语音激活的电话菜单 - 对网络状态动态响应的网络路由算法 3. 为什么进化会倾向于导致行为合理的系统?设计这样的系统想达到的目标是什么?

MatsumotoChrikk 2930

在Android上使用libgdx-box2d物理引擎

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

xzy2046的专栏 1227

Go基础:一文掌握Go语言网络编程

Go语言凭借强大的标准库和原生并发支持,非常适合网络编程开发。文章介绍了Go语言在网络编程中的核心概念和应用场景,包括TCP、UDP和HTTP等协议的具体实现方法。主要内容包括:1)网络编程核心概念(Listener、Conn、Addr等);2)TCP服务器/客户端的实现流程与示例代码;3)UDP无连接通信的实现方式;4)利用net/http包构建HTTP服务。文章通过详细的代码示例展示了如何利用Go的Goroutine和Channel特性高效处理网络连接,并强调了连接管理的最佳实践。

数据知道的博客 5515

原理和代码解读:用Diffusion Models高清图像修复(Image Inpainting)

在最近的Diffusion Models应用中,Image Inpainting+ControlNet/Lora等工作在模特衣服生成、家居场景重建等场景中得到了广泛的应用。这篇博客主要介绍Diffusion Models如何在修复高清图像的。

沉迷单车的追风少年 2497

Android 2d物理引擎Box2d的使用示例

Box2d是一个很出名的2d物理引擎,大家可以google之。Box2d有C++,flash和Java等版本。android可以直接使用java版本的Jbox2d,但因为Jbox2d的图形渲染是使用processing库来实现的,所以,在android中使用Jbox2d的时候,图形渲染的工作就只能自己来写了。因为网上关于box2d的资料真的非常的少,特别是关于图形绘制方面,所以,虽然程序写得不是很

乐吾天 2175

2025年新发表的语音大模型全双工模型/框架/技术

参考该论文,给出2025年新发表的全双工模型或框架或技术下面这份清单专挑、且与“全双工语音对话/同步对话(边听边说、可打断、回馈/相槌、重叠语音)”直接相关的。我也结合你提到的的四大维度(暂停处理、相槌、顺滑换手、打断管理)来点出它们各自的贡献点,便于后续评测与对比。

u013250861的博客 631

android游戏开发框架libgdx的使用(九)—在libgdx中使用Box2d

在游戏开发中难免会需要模拟现实情况,一般常见的就是模拟物理世界。 比如物体碰撞,车辆前进,物体下落等。也许有人会觉得原来有实现过一些效果没有看到用什么物理知识呢。 在我看来引入物理引擎并不是必须的,但是这样可以让游戏更逼真。物理引擎的话首选Box2d,但是它是C++写的,直接用不方便。 在Android游戏开发中使用物理引擎一般有三个比较好的选择: 1.JBox2d Box2d的Java

紫叶枫林 430

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在Android上使用libgdx-box2d物理引擎的实践-20220113

根据文章“在Android上使用libgdx-box2d物理引擎”后实践过程 1. gralde报错解决,猜测是gralde语法和版本号问题。 1.去maven库手动下载com.badlogicgames.gdx:gdx-box2d的Jar包和com.badlogicgames.gdx:gdx-box2d-platform的so库,手动放到项目中https://mvnrepository.com/artifact/com.badlogicgames.gdx/gdx-box2d/1.9.1...

由求的成长之路 1977

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[ IOS-Cocos2d-x (Box2d)游戏开发之四] -Cocos2d-x for android 使用Box2d报错解决

Cocos2d-x for android 使用Box2d报错解决 环境:2dx-1.0.1-x-0.9.2 ps:在1.0.1版本,新建一个android项目,缺少一个default.properties  拷贝一个到androud目录下 但是to android的时候编译会出错 因为2dx for android 工程并没有加入Box2D库 需要修改下列文件:

Mr_Hiki的专栏 688

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: Android之3D物理引擎
下一篇: Android上使用libgdx
htttw
博客等级 码龄18年 378粉丝 73原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值