`

android jbox2d学习笔记一 滑轮关节

阅读更多

/**
* 滑轮关节
*
* @time 下午12:49:27
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
@SuppressWarnings("unused")
public class PulleyJointSurfaceView extends SurfaceView implements Callback, Runnable {
private static final float RATE = 30;
private Thread thread;
private SurfaceHolder sfh;
private int screenW, screenH;
private Paint paint;
private boolean flag;
private Canvas canvas;


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


//
private Body body1, body2;
private float body1X = 40, body1Y = 200, body1W = 80, body1H = 80,//
body2X = 120, body2Y = 200, body2W = 80, body2H = 80;// 设置矩形坐标及宽高


private float ga1X = 100, ga1Y = 45, ga2X = 200, ga2Y = 45;// 两个动滑轮锚点


public PulleyJointSurfaceView(Context context) {
super(context);


screenW = this.getWidth();
screenH = this.getHeight();


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


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


this.setKeepScreenOn(true);
this.setFocusable(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);


// 创建两个矩形
body1 = createPolygon(body1X, body1Y, body1W, body1H, false);
body2 = createPolygon(body2X, body2Y, body2W, body2H, false);
// 创建滑轮关节
createPulleyJoint();
}


@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 PulleyJoint createPulleyJoint() {
PulleyJointDef def = new PulleyJointDef();// 创建滑轮关节数据实例
// 初始化滑轮关节
Vec2 ga1 = new Vec2(ga1X, ga1Y);
Vec2 ga2 = new Vec2(ga2X, ga2Y);
def.initialize(body1, body2, //
ga1, ga2,// 两个滑轮的锚点
body1.getWorldCenter(), body2.getWorldCenter(), // 两个矩形的锚点
1f);// 比例系数


PulleyJoint joint = (PulleyJoint) world.createJoint(def);// 创建滑轮节点
return joint;


}


/**
* 创建矩形对象
*/
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);// 创建物理世界的对象
def.angle = (float) (15 * Math.PI / 180);
body.m_userData = new MyRect(x, y, w, h);
body.createShape(polygonDef);// 设置皮肤
body.setMassFromShapes();// 整个对象计算打包
return body;
}


/**
* 绘制方法
*/
private void draw() {
try {
canvas = sfh.lockCanvas();
if (null != canvas) {
canvas.drawColor(Color.WHITE);


Body body = world.getBodyList();
for (int i = 1; i < world.getContactCount(); i++) {
// 绘制矩形
((MyRect) body.m_userData).draw(canvas, paint);
body = body.m_next;
}
// 绘制两个定滑轮,三条连线


canvas.drawCircle(ga1X, ga1Y, 10, paint);
canvas.drawCircle(ga2X, ga2Y, 10, paint);


canvas.drawLine(ga1X, ga1Y, ga2X, ga2Y, paint);// 两滑轮之间
canvas.drawLine(ga1X, ga1Y, body1.getPosition().x * RATE, body1.getPosition().y * RATE, paint);//
canvas.drawLine(ga2X, ga2Y, body2.getPosition().x * RATE, body2.getPosition().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();
paint.setStyle(Style.STROKE);
for (int i = 1; i < world.getContactCount(); 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();
}
}


}


}

分享到:
评论

相关推荐

    android 2D 引擎(jbox2d) 游戏源码(注释详细)

    对于想要学习Android游戏开发,尤其是物理效果实现的开发者来说,jBox2D是一个理想的起点。 首先,BallGame游戏的核心在于jBox2D的物理世界设置。在源码中,你会看到如何初始化一个`World`对象,这是所有物理模拟的...

    android 游戏引擎 jbox2d 物理引擎

    《Android游戏开发:深入理解JBox2D物理引擎》 在Android游戏开发中,物理引擎是构建逼真、动态游戏场景的关键技术之一。JBox2D作为一款基于Java的开源物理引擎,为开发者提供了强大的2D物理模拟功能,使得游戏中的...

    JBox2D引擎Android版

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

    jbox2d 2.1.2 游戏世界实例 android

    总结,jBox2D 2.1.2在Android游戏开发中的应用是一项复杂但有趣的任务。通过学习和实践,开发者能够创建出拥有逼真物理效果的游戏,增强玩家的沉浸感。无论是初学者还是经验丰富的开发者,都应该掌握这个强大的工具...

    JBox2D文档DOC

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

    安卓Android源码——基于JBox2D的安卓Android游戏开发全源码.zip

    本资源是关于使用JBox2D库进行安卓Android游戏开发的完整源码,这为我们提供了一个深入理解安卓游戏编程的实践案例。JBox2D是一个基于Java的物理引擎,它是Box2D的Java版本,Box2D是广泛应用于2D物理模拟的开源库,...

    基于JBox2D的Android游戏开发全源码.zip

    总之,这个基于JBox2D的Android游戏开发全源码是一个宝贵的教育资源,可以帮助你深入理解2D物理引擎在实际项目中的应用,以及Android游戏开发的各个方面,包括图形渲染、用户交互、物理模拟和性能优化。通过分析和...

    android webview jbox2d 源代码 项目源码

    在这个项目源码中,你可以学习到如何在Android上集成Webview与JBox2D,以及如何利用它们构建一个交互式的物理模拟应用。通过对源代码的深入研究,可以掌握这两项技术的结合使用,为你的Android开发带来更多的可能性...

    jbox2D源码及在android中的应用

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

    类似与愤怒的小鸟的游戏源码案例-jbox2d

    本案例将深入探讨如何利用开源物理引擎JBox2D在Android平台上实现类似愤怒小鸟的游戏。JBox2D是一个基于Java语言的2D物理模拟库,它源自著名的Box2D物理引擎,广泛应用于游戏开发,尤其适合创建具有真实感的物理效果...

    android JBOX2D实现粒子碰撞特效实例

    总之,使用JBOX2D在Android上实现粒子碰撞特效是一个涉及物理模拟、图形渲染和事件处理的过程。通过熟练掌握JBOX2D库,开发者可以创造出逼真的动态效果,提升游戏或应用的视觉吸引力。在实际项目中,不断试验和优化...

    JBox2D学习文档.doc

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

    jbox2d完整例子

    1. **世界管理器(World Manager)**:这是Jbox2d的核心,它维护了一个物理世界的模拟,包括物体、关节、重力等。开发者可以通过这个组件创建、销毁物理对象,并更新物理世界的状态。 2. **渲染模块**:将物理世界...

    jBox2d官方资料

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

    Android 基于JBox2D的Android游戏开发全源码-IT计算机-毕业设计.zip

    《基于JBox2D的Android游戏开发全源码》是一个非常适合Android开发初学者以及毕业设计项目的实践案例。这个源码库包含了一款Android游戏的完整实现,它利用了JBox2D物理引擎来创建真实感的游戏环境。在这里,我们将...

    jbox2d demo for android

    jbox2d 自己写的demo for android,可以用于参考学习jbox2d

    Android-使用jbox2d物理引擎打造摩拜单车贴纸动画效果

    在Android项目中集成jBox2D,你需要将库导入到项目依赖中,并创建一个World对象,这是所有物理模拟的容器。然后,根据设计需求,创建刚体、形状、约束,并在每一帧中调用World的step方法进行物理模拟。同时,需要...

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

    JBox2D是一款广泛使用的开源2D物理引擎,它基于Java实现,为Android平台提供了强大的物理模拟功能。本文将深入探讨Android应用源码中的JBox2D-src,以帮助开发者更好地理解和运用这一引擎。 一、JBox2D简介 JBox2D...

    jbox2d-testbed游戏引擎

    总的来说,jBox2D-Testbed是一个强大的学习和开发工具,它可以帮助开发者深入理解2D物理模拟,并快速构建出具有真实物理效果的游戏和应用。通过不断地实践和探索,你可以利用jBox2D创造出更加丰富多彩的2D世界。

    box2d中文教程和Jbox2d详解

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

Global site tag (gtag.js) - Google Analytics