- 浏览: 263205 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
/**
* 滑轮关节
*
* @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游戏开发学习笔记一(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:52 677/** * 一个简单的游戏框架 * 没有按键处理,声音 ... -
android游戏开发学习笔记二(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:54 642/** * 画布 * * @author 岳 ... -
android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:55 707/** * 画笔 * * @author 岳 ... -
android游戏开发学习笔记四(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:57 637/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔记五(学习书籍 Android游戏编程之从零开始)
2012-09-05 12:01 548/** * 剪切动画+移动位图 * * @author ... -
android游戏开发学习笔记六(学习书籍 Android游戏编程之从零开始)
2012-09-07 10:37 738/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔之七 (学习书籍 Android游戏编程之从零开始)
2012-09-07 10:39 820/** * 可视区域 * * @time 上午10:42 ... -
android 游戏学习(jbox2d)
2012-09-09 11:14 751导入jbox2d-2.0.1-library-only.jar ... -
android游戏开发学习笔之八 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:23 747/** * 操作游戏中的人物 * * @time 上午1 ... -
android游戏开发学习笔之九 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:25 699/** * 矩形碰撞 * * @time 上午11:29 ... -
andriod jbox2d学习笔记二 通过移动关节移动body
2012-09-13 12:47 828/** * 通过移动关节移动body * * @time ...
相关推荐
对于想要学习Android游戏开发,尤其是物理效果实现的开发者来说,jBox2D是一个理想的起点。 首先,BallGame游戏的核心在于jBox2D的物理世界设置。在源码中,你会看到如何初始化一个`World`对象,这是所有物理模拟的...
《Android游戏开发:深入理解JBox2D物理引擎》 在Android游戏开发中,物理引擎是构建逼真、动态游戏场景的关键技术之一。JBox2D作为一款基于Java的开源物理引擎,为开发者提供了强大的2D物理模拟功能,使得游戏中的...
由JBox2D 2.1.2 版本(目前官方最新版)源码修改而来,专门适合android平台使用,效率更高!
总结,jBox2D 2.1.2在Android游戏开发中的应用是一项复杂但有趣的任务。通过学习和实践,开发者能够创建出拥有逼真物理效果的游戏,增强玩家的沉浸感。无论是初学者还是经验丰富的开发者,都应该掌握这个强大的工具...
JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档
本资源是关于使用JBox2D库进行安卓Android游戏开发的完整源码,这为我们提供了一个深入理解安卓游戏编程的实践案例。JBox2D是一个基于Java的物理引擎,它是Box2D的Java版本,Box2D是广泛应用于2D物理模拟的开源库,...
总之,这个基于JBox2D的Android游戏开发全源码是一个宝贵的教育资源,可以帮助你深入理解2D物理引擎在实际项目中的应用,以及Android游戏开发的各个方面,包括图形渲染、用户交互、物理模拟和性能优化。通过分析和...
在这个项目源码中,你可以学习到如何在Android上集成Webview与JBox2D,以及如何利用它们构建一个交互式的物理模拟应用。通过对源代码的深入研究,可以掌握这两项技术的结合使用,为你的Android开发带来更多的可能性...
《jBox2D源码解析及其在Android平台的应用》 jBox2D是一个基于Java语言的物理模拟库,它是Box2D的Java版本,而Box...对于想要深入学习2D物理引擎开发或提升游戏品质的开发者来说,jBox2D是一个值得研究和掌握的工具。
本案例将深入探讨如何利用开源物理引擎JBox2D在Android平台上实现类似愤怒小鸟的游戏。JBox2D是一个基于Java语言的2D物理模拟库,它源自著名的Box2D物理引擎,广泛应用于游戏开发,尤其适合创建具有真实感的物理效果...
总之,使用JBOX2D在Android上实现粒子碰撞特效是一个涉及物理模拟、图形渲染和事件处理的过程。通过熟练掌握JBOX2D库,开发者可以创造出逼真的动态效果,提升游戏或应用的视觉吸引力。在实际项目中,不断试验和优化...
JBox2D 学习文档 JBox2D 是一个开源的物理引擎,可以用于开发 2D 游戏。它基于 Box2D 的 Java 版本,使用 Processing 库进行图形渲染。为了使用 JBox2D 开发游戏,需要了解一些基本的物理学概念。 密度是单位体积...
1. **世界管理器(World Manager)**:这是Jbox2d的核心,它维护了一个物理世界的模拟,包括物体、关节、重力等。开发者可以通过这个组件创建、销毁物理对象,并更新物理世界的状态。 2. **渲染模块**:将物理世界...
《JBox2d官方资料详解》 JBox2d是一个基于Java实现的开源物理引擎,它主要用于...通过深入学习和实践这些官方资料,开发者可以掌握JBox2d的使用,从而在自己的游戏中实现精细的物理效果,提升游戏的真实感和趣味性。
《基于JBox2D的Android游戏开发全源码》是一个非常适合Android开发初学者以及毕业设计项目的实践案例。这个源码库包含了一款Android游戏的完整实现,它利用了JBox2D物理引擎来创建真实感的游戏环境。在这里,我们将...
jbox2d 自己写的demo for android,可以用于参考学习jbox2d
在Android项目中集成jBox2D,你需要将库导入到项目依赖中,并创建一个World对象,这是所有物理模拟的容器。然后,根据设计需求,创建刚体、形状、约束,并在每一帧中调用World的step方法进行物理模拟。同时,需要...
JBox2D是一款广泛使用的开源2D物理引擎,它基于Java实现,为Android平台提供了强大的物理模拟功能。本文将深入探讨Android应用源码中的JBox2D-src,以帮助开发者更好地理解和运用这一引擎。 一、JBox2D简介 JBox2D...
总的来说,jBox2D-Testbed是一个强大的学习和开发工具,它可以帮助开发者深入理解2D物理模拟,并快速构建出具有真实物理效果的游戏和应用。通过不断地实践和探索,你可以利用jBox2D创造出更加丰富多彩的2D世界。
在Android平台上,Box2D通常与Java绑定,通过一个名为JBox2D的库来使用。本教程将深入探讨Box2D的基本概念以及如何在Java环境中利用JBox2d进行实际应用。 1. Box2D基础知识: - **物理世界**:Box2D中的所有物体都...