`

andriod jbox2d学习笔记二 通过移动关节移动body

阅读更多

/**
* 通过移动关节移动body
*
* @time 下午12:50:47
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
@SuppressWarnings("unused")
public class PrismaticJointSurfaceView extends SurfaceView implements Callback, Runnable {
private Thread thread;
private int screenW, screenH;
private Canvas canvas;
private SurfaceHolder sfh;
private Paint paint;
private boolean flag;


// 创建物理世界
private AABB aabb;
private World world;
private float timeStep = 1f / 60f;
private Vec2 gravity;
private static final float RATE = 30;
private int iterations = 10;


// 移动关节
Body body1;
// 设置对象坐标
private float body1X = 10, body1Y = 40, body1W = 40, body1H = 40;


/**
* 构造函数
*
* @param context
*/
public PrismaticJointSurfaceView(Context context) {
super(context);


this.getWidth();
this.getHeight();


sfh = this.getHolder();
sfh.addCallback(this);


paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Style.STROKE);


this.setFocusable(true);
this.setKeepScreenOn(true);


// 创建物理世界
aabb = new AABB();// 创建物理世界的范围
aabb.lowerBound.set(-100, -100);// 设置左上角坐标
aabb.upperBound.set(100, 100);// 设置右下角坐标
gravity = new Vec2(0f, 10f);// 重力向量对象
world = new World(aabb, gravity, true);// 创建物理世界


// 添加一个矩形body
body1 = createPolygon(body1X, body1Y, body1W, body1H, false);
// 设置移动关节
createPrismaticJoint();


}


@Override
public void surfaceCreated(SurfaceHolder holder) {
flag = true;
thread = new Thread(this);
thread.start();
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {


}


@Override
public void surfaceDestroyed(SurfaceHolder holder) {
flag = false;
}


/**
* 创建对象
*/
private Body createPolygon(float x, float y, float w, float h, boolean isStatic) {
// 创建一个皮肤
PolygonDef polygonDef = new PolygonDef();
if (isStatic) {
polygonDef.density = 0;// 设置矩形对象为静态
} else {
polygonDef.density = 1;// 设置矩形对象为静态
}
// 摩擦力
polygonDef.friction = 0.8f;
// 恢复力
polygonDef.restitution = 0.3f;
// 快捷成盒子
polygonDef.setAsBox(w / 2 / RATE, h / 2 / RATE);
// 创建一个刚体
BodyDef def = new BodyDef();
def.position.set((x + w / 2) / RATE, (y + h / 2) / RATE);// 设置刚体坐标


Body body = world.createBody(def);// 创建物体
body.m_userData = new MyRect(x, y, w, h);
body.createShape(polygonDef);// 设置皮肤
// 整个物体计算打包
body.setMassFromShapes();
return body;


}


/**
* 创建移动关节
*/
private PrismaticJoint createPrismaticJoint() {
PrismaticJointDef def = new PrismaticJointDef();
// 预设马达的最大力
def.maxMotorForce = 10;
// 马达的最终力
def.motorSpeed = 10;
// 启动马达
def.enableMotor = true;
// 位移的最小偏移值
def.lowerTranslation = -80f / RATE;
// 位移动最大偏移值
def.upperTranslation = 80f / RATE;
// 启动限制
def.enableLimit = true;
// 初始化关节数据
def.initialize(world.getGroundBody(), body1, body1.getWorldCenter(), new Vec2(1, 0));


PrismaticJoint prismaticJoint = (PrismaticJoint) world.createJoint(def);// 创建物理世界的移动关节
return prismaticJoint;


}


/**
* 绘制方法
*/
private void draw() {
try {
canvas = sfh.lockCanvas();
if (null != canvas) {
canvas.drawColor(Color.WHITE);
Body body = world.getBodyList();
for (int i = 1; i < world.getBodyCount(); i++) {
// 绘制矩形
((MyRect) body.m_userData).draw(canvas, paint);
body = body.m_next;
}
// 画直线
canvas.drawLine(body1X + body1W / 2, body1Y + body1Y / 2, body1.getWorldCenter().x * RATE, body1.getWorldCenter().y * RATE, paint);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != canvas) {
sfh.unlockCanvasAndPost(canvas);
}
}


}


/**
* 游戏逻辑
*/
private void logic() {
// 运行物理世界
world.step(timeStep, iterations);


Body body = world.getBodyList();
for (int i = 1; i < world.getBodyCount(); i++) {
// 更新矩形坐标和角度
MyRect myRect = (MyRect) body.m_userData;
myRect.setX(body.getPosition().x * RATE - myRect.getW() / 2);
myRect.setY(body.getPosition().y * RATE - myRect.getH() / 2);
myRect.setAngle((float) (body.getAngle() * 180 / Math.PI));
body = body.m_next;
}


}


@SuppressWarnings("static-access")
@Override
public void run() {
while (flag) {
draw();
logic();
try {
thread.sleep((long) timeStep * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}


}

分享到:
评论

相关推荐

    JBox2D学习例子(16个)

    9. **7-13-5-2(通过移动关节绑定两个Body动作)**:通过移动关节可以控制一个Body影响另一个Body的运动,这对于创建动态交互效果非常有用。 10. **7-13-6(鼠标关节-拖拽Body)**:鼠标关节允许用户通过鼠标直接操纵...

    JBox2D学习文档.doc

    JBox2D 学习文档 JBox2D 是一个开源的物理引擎,可以用于开发 2D 游戏。它基于 Box2D 的 Java 版本,使用 Processing 库进行图形渲染。为了使用 JBox2D 开发游戏,需要了解一些基本的物理学概念。 密度是单位体积...

    jBox2d官方资料

    《JBox2d官方资料详解》 JBox2d是一个基于Java实现的开源物理引擎,它主要用于...通过深入学习和实践这些官方资料,开发者可以掌握JBox2d的使用,从而在自己的游戏中实现精细的物理效果,提升游戏的真实感和趣味性。

    jbox2d 2.1.2 游戏世界实例 android

    2. 创建实体:在jBox2D中,物体被称为`Body`,它们可以通过`BodyDef`和`FixtureDef`来定义。`BodyDef`包含了物体的位置、速度、质量等基本信息,而`FixtureDef`则定义了物体的形状(如圆形、矩形等)和物理属性...

    jbox2d相关源码

    为了实现更复杂的物理行为,JBox2D提供了多种类型的关节,如RevoluteJoint(旋转关节)、PrismaticJoint(滑动关节)和DistanceJoint(距离关节)等。通过这些关节,你可以将两个物体连接起来,限制它们的相对运动。...

    android 游戏引擎 jbox2d 物理引擎

    JBox2D的主要组件包括世界(World)、身体(Body)、形状(Shape)、关节(Joint)等。世界对象负责管理所有物理实体的运行,如更新状态、解决碰撞等。身体是物理实体的基本单位,可以设置质量、位置、速度等属性。...

    box2d中文教程和Jbox2d详解

    在Android平台上,Box2D通常与Java绑定,通过一个名为JBox2D的库来使用。本教程将深入探讨Box2D的基本概念以及如何在Java环境中利用JBox2d进行实际应用。 1. Box2D基础知识: - **物理世界**:Box2D中的所有物体都...

    jbox2d-testbed游戏引擎

    3. **高性能**:虽然运行在Java平台上,但jBox2D通过优化实现了良好的性能,能够满足实时物理计算的需求。 4. **可扩展性**:支持自定义行为,可以通过编写回调函数来处理碰撞、关节断裂等事件。 5. **测试床...

    JBox2D文档DOC

    JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档

    jbox2d完整例子

    《Jbox2d完整例子解析:游戏引擎与类设计思路》 ...通过学习和分析这个例子,开发者不仅能掌握Jbox2d的基本用法,还能理解游戏开发中的关键设计思想,这对于进一步开发自己的游戏项目具有重要的指导意义。

    jbox2d 小结

    ### jbox2d小结 #### 一、基础概念与...综上所述,jbox2d是一款功能强大且易于使用的物理引擎,非常适合初学者入门学习。通过深入理解其核心概念和技术细节,开发者可以更加灵活地运用它来创建丰富多彩的游戏世界。

    JBox2D最新版

    `jbox2d-testbed`通常包含了一系列示例和测试用例,开发者可以通过这些例子学习如何使用JBox2D,调试物理效果,验证引擎的正确性。 **项目配置** `.project`和`.classpath`文件是Eclipse IDE的工作空间配置文件,...

    JBox2D引擎Android版

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

    基于jbox2d的仿愤怒的小鸟游戏

    《基于jbox2d的仿愤怒的小鸟游戏》是一款利用jBox2D库开发的物理模拟游戏,旨在重现经典游戏“愤怒的小鸟”的玩法...通过学习和实践这个项目,开发者不仅可以深入了解jBox2D的功能,还能掌握游戏开发的一般流程和技术。

    Jbox2d齿轮传动源码.rar

    在Jbox2d中,我们可以通过`GearJointDef`类来定义齿轮关节,并使用`World.createJoint()`方法将其添加到物理世界中。`GearJointDef`有两个重要的属性:`joint1`和`joint2`,分别代表主轴和从轴的关节,以及一个`...

    Android应用源码之JBox2D-src_应用.zip

    1. **org.jbox2d**:这是JBox2D的核心库,包含各种物理实体(如Body、Fixture、Joint)和相关类。例如,`BodyDef`用于定义刚体的属性,`World`负责管理所有物理对象的模拟。 2. **src/main/java**:这个目录下的...

    JBox2D_2.1.2 官方API文档

    二、JBox2D主要类与接口 1. World类:管理所有物理实体和它们之间的交互,如创建、销毁体、执行物理模拟。 2. Body类:表示2D空间中的物理对象,包括其位置、速度、角速度等属性。 3. Shape类:抽象基类,表示...

    jbox2D源码及在android中的应用

    《jBox2D源码解析及其在Android平台的应用》 jBox2D是一个基于Java语言的物理模拟库,它是Box2D的Java版本,而Box...对于想要深入学习2D物理引擎开发或提升游戏品质的开发者来说,jBox2D是一个值得研究和掌握的工具。

    JBox2D详解

    50页文档,详细介绍JBox2D相关知识点; JBox2D是开源的物理引擎Box2D的Java版本,可以直接用于Android。由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该...

    jbox2d-2.0.1-library-only.jar

    jbox2d-2.0.1-library-only JAVA版本的BOX2D物理引擎;

Global site tag (gtag.js) - Google Analytics