- 浏览: 248462 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (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 644/** * 一个简单的游戏框架 * 没有按键处理,声音 ... -
android游戏开发学习笔记二(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:54 615/** * 画布 * * @author 岳 ... -
android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:55 680/** * 画笔 * * @author 岳 ... -
android游戏开发学习笔记四(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:57 614/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔记五(学习书籍 Android游戏编程之从零开始)
2012-09-05 12:01 526/** * 剪切动画+移动位图 * * @author ... -
android游戏开发学习笔记六(学习书籍 Android游戏编程之从零开始)
2012-09-07 10:37 663/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔之七 (学习书籍 Android游戏编程之从零开始)
2012-09-07 10:39 741/** * 可视区域 * * @time 上午10:42 ... -
android 游戏学习(jbox2d)
2012-09-09 11:14 696导入jbox2d-2.0.1-library-only.jar ... -
android游戏开发学习笔之八 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:23 661/** * 操作游戏中的人物 * * @time 上午1 ... -
android游戏开发学习笔之九 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:25 624/** * 矩形碰撞 * * @time 上午11:29 ... -
andriod jbox2d学习笔记二 通过移动关节移动body
2012-09-13 12:47 739/** * 通过移动关节移动body * * @time ...
相关推荐
由JBox2D 2.1.2 版本(目前官方最新版)源码修改而来,专门适合android平台使用,效率更高!
JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档
android 游戏引擎 jbox2d 物理引擎 android 游戏引擎 jbox2d 物理引擎
jbox2d 自己写的demo for android,可以用于参考学习jbox2d
一款2D引擎jbox2d打造的物理游戏源码,适合入门或中级开发人员学习!
jbox2d 2.1.2 游戏世界的创建,jbox2d 的认识学校
本项目是移植java版 jbox2d 测试项目到android平台上的完整源码,我实现了其中四个比较典型的例子,其他的暂时没做。 大家可以通过此案例掌握 box2d DebugDraw 用法 及box2d 各种入门提高
安卓Android源码——基于JBox2D的安卓Android游戏开发全源码.zip
由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该引擎能够根据开发人员设定的参数,如重力、密度、摩擦系数和弹性系数等,自动地进行2D刚体物理运动的全...
目前网上最详细的jbox2d的资料。 适用android系统
android JBOX2D实现粒子碰撞特效实例,亲自测试过,是可以用的,谢谢!
总共有16个例子,从浅到深的示范了如何使用JBox2D,例子可以直接运行,非常适合想学习JBox2D而又木有找到好教程的童鞋
网上的JBox2d案例一个是太少,另一个都是老版本的,新版用法都有明显区别了。所以自己经过研究,写了个简单的Demo,只有世界和刚体运动,没有碰撞检测和关节等。适合初学者研究入门! 请使用eclipse导入java工程...
游戏是对真实世界的仿真,其中用到了许多物理学知识,如密度、质量、质心、摩擦力、扭矩以及碰撞(恢复)系数等。接下来,本小节将简要介绍用JBox2D开发游戏时经常用到的一些物理学概念。
jbox2d是一个2D物理引擎,原版是Box2D,采用c++编写,jbox2d是原版的java版,使用jbox2d可以轻松的实现具有物理特性的动画效果,甚至是2d游戏,都可以轻松搞定
jbox2d-2.0.1-library-only JAVA版本的BOX2D物理引擎;
类似与愤怒的小鸟的游戏源码案例 采用jbox2d实现。
box2d中文教程和Jbox2d详解 一份通用版 一份针对java语言的
android webview jbox2d 源代码 项目源码 文件中包含了很多我下载的案例
jbox2D源码及在android中的应用