- 浏览: 260847 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (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)
/**
* 通过移动关节移动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();
}
}
}
}
发表评论
-
android游戏开发学习笔记一(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:52 673/** * 一个简单的游戏框架 * 没有按键处理,声音 ... -
android游戏开发学习笔记二(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:54 639/** * 画布 * * @author 岳 ... -
android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:55 705/** * 画笔 * * @author 岳 ... -
android游戏开发学习笔记四(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:57 634/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔记五(学习书籍 Android游戏编程之从零开始)
2012-09-05 12:01 546/** * 剪切动画+移动位图 * * @author ... -
android游戏开发学习笔记六(学习书籍 Android游戏编程之从零开始)
2012-09-07 10:37 725/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔之七 (学习书籍 Android游戏编程之从零开始)
2012-09-07 10:39 805/** * 可视区域 * * @time 上午10:42 ... -
android 游戏学习(jbox2d)
2012-09-09 11:14 745导入jbox2d-2.0.1-library-only.jar ... -
android游戏开发学习笔之八 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:23 735/** * 操作游戏中的人物 * * @time 上午1 ... -
android游戏开发学习笔之九 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:25 687/** * 矩形碰撞 * * @time 上午11:29 ... -
android jbox2d学习笔记一 滑轮关节
2012-09-13 12:45 803/** * 滑轮关节 * * @time 下午12:49 ...
相关推荐
9. **7-13-5-2(通过移动关节绑定两个Body动作)**:通过移动关节可以控制一个Body影响另一个Body的运动,这对于创建动态交互效果非常有用。 10. **7-13-6(鼠标关节-拖拽Body)**:鼠标关节允许用户通过鼠标直接操纵...
JBox2D 学习文档 JBox2D 是一个开源的物理引擎,可以用于开发 2D 游戏。它基于 Box2D 的 Java 版本,使用 Processing 库进行图形渲染。为了使用 JBox2D 开发游戏,需要了解一些基本的物理学概念。 密度是单位体积...
《JBox2d官方资料详解》 JBox2d是一个基于Java实现的开源物理引擎,它主要用于...通过深入学习和实践这些官方资料,开发者可以掌握JBox2d的使用,从而在自己的游戏中实现精细的物理效果,提升游戏的真实感和趣味性。
2. 创建实体:在jBox2D中,物体被称为`Body`,它们可以通过`BodyDef`和`FixtureDef`来定义。`BodyDef`包含了物体的位置、速度、质量等基本信息,而`FixtureDef`则定义了物体的形状(如圆形、矩形等)和物理属性...
为了实现更复杂的物理行为,JBox2D提供了多种类型的关节,如RevoluteJoint(旋转关节)、PrismaticJoint(滑动关节)和DistanceJoint(距离关节)等。通过这些关节,你可以将两个物体连接起来,限制它们的相对运动。...
JBox2D的主要组件包括世界(World)、身体(Body)、形状(Shape)、关节(Joint)等。世界对象负责管理所有物理实体的运行,如更新状态、解决碰撞等。身体是物理实体的基本单位,可以设置质量、位置、速度等属性。...
在Android平台上,Box2D通常与Java绑定,通过一个名为JBox2D的库来使用。本教程将深入探讨Box2D的基本概念以及如何在Java环境中利用JBox2d进行实际应用。 1. Box2D基础知识: - **物理世界**:Box2D中的所有物体都...
3. **高性能**:虽然运行在Java平台上,但jBox2D通过优化实现了良好的性能,能够满足实时物理计算的需求。 4. **可扩展性**:支持自定义行为,可以通过编写回调函数来处理碰撞、关节断裂等事件。 5. **测试床...
JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档
《Jbox2d完整例子解析:游戏引擎与类设计思路》 ...通过学习和分析这个例子,开发者不仅能掌握Jbox2d的基本用法,还能理解游戏开发中的关键设计思想,这对于进一步开发自己的游戏项目具有重要的指导意义。
### jbox2d小结 #### 一、基础概念与...综上所述,jbox2d是一款功能强大且易于使用的物理引擎,非常适合初学者入门学习。通过深入理解其核心概念和技术细节,开发者可以更加灵活地运用它来创建丰富多彩的游戏世界。
`jbox2d-testbed`通常包含了一系列示例和测试用例,开发者可以通过这些例子学习如何使用JBox2D,调试物理效果,验证引擎的正确性。 **项目配置** `.project`和`.classpath`文件是Eclipse IDE的工作空间配置文件,...
由JBox2D 2.1.2 版本(目前官方最新版)源码修改而来,专门适合android平台使用,效率更高!
《基于jbox2d的仿愤怒的小鸟游戏》是一款利用jBox2D库开发的物理模拟游戏,旨在重现经典游戏“愤怒的小鸟”的玩法...通过学习和实践这个项目,开发者不仅可以深入了解jBox2D的功能,还能掌握游戏开发的一般流程和技术。
在Jbox2d中,我们可以通过`GearJointDef`类来定义齿轮关节,并使用`World.createJoint()`方法将其添加到物理世界中。`GearJointDef`有两个重要的属性:`joint1`和`joint2`,分别代表主轴和从轴的关节,以及一个`...
1. **org.jbox2d**:这是JBox2D的核心库,包含各种物理实体(如Body、Fixture、Joint)和相关类。例如,`BodyDef`用于定义刚体的属性,`World`负责管理所有物理对象的模拟。 2. **src/main/java**:这个目录下的...
二、JBox2D主要类与接口 1. World类:管理所有物理实体和它们之间的交互,如创建、销毁体、执行物理模拟。 2. Body类:表示2D空间中的物理对象,包括其位置、速度、角速度等属性。 3. Shape类:抽象基类,表示...
《jBox2D源码解析及其在Android平台的应用》 jBox2D是一个基于Java语言的物理模拟库,它是Box2D的Java版本,而Box...对于想要深入学习2D物理引擎开发或提升游戏品质的开发者来说,jBox2D是一个值得研究和掌握的工具。
50页文档,详细介绍JBox2D相关知识点; JBox2D是开源的物理引擎Box2D的Java版本,可以直接用于Android。由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该...
jbox2d-2.0.1-library-only JAVA版本的BOX2D物理引擎;