- 浏览: 225450 次
- 性别:
- 来自: 淄博
文章分类
- 全部博客 (666)
- java (6)
- android (9)
- 架构 (0)
- android游戏 (13)
- android系统 (14)
- c++ (14)
- 数据库 (10)
- javascript (2)
- 版本控制 (1)
- webservice (1)
- linux (5)
- uml (1)
- android多媒体部分 (16)
- java中的JNI (6)
- HTML5 (5)
- CSS3 (1)
- swing (13)
- 线程并发 (9)
- 分布式 (5)
- 云计算 (1)
- 通信协议 (4)
- xml (4)
- c# (1)
- lucene (0)
- ibatis (0)
- hibernate (3)
- struts1 (3)
- struts2 (4)
- jsf (0)
- spring (5)
- spring for android (0)
- 感悟 (2)
- jpa (1)
- android gis (1)
- jbpm (0)
- java设计模式 (8)
- java web (4)
- EXT js (0)
- node JS (2)
- python (3)
- c (17)
- weblogic (0)
- opencv (1)
最新评论
/**
* 通过移动关节移动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 571/** * 一个简单的游戏框架 * 没有按键处理,声音 ... -
android游戏开发学习笔记二(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:54 491/** * 画布 * * @author 岳 ... -
android游戏开发学习笔记三(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:55 618/** * 画笔 * * @author 岳 ... -
android游戏开发学习笔记四(学习书籍 Android游戏编程之从零开始)
2012-09-05 11:57 538/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔记五(学习书籍 Android游戏编程之从零开始)
2012-09-05 12:01 663/** * 剪切动画+移动位图 * * @author ... -
android游戏开发学习笔记六(学习书籍 Android游戏编程之从零开始)
2012-09-07 10:37 522/** * 位图 * * @author 岳振华 * ... -
android游戏开发学习笔之七 (学习书籍 Android游戏编程之从零开始)
2012-09-07 10:39 633/** * 可视区域 * * @time 上午10:42 ... -
android 游戏学习(jbox2d)
2012-09-09 11:14 520导入jbox2d-2.0.1-library-only.jar ... -
android游戏开发学习笔之八 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:23 472/** * 操作游戏中的人物 * * @time 上午1 ... -
android游戏开发学习笔之九 (学习书籍 Android游戏编程之从零开始)
2012-09-09 11:25 675/** * 矩形碰撞 * * @time 上午11:29 ... -
android 启动流程
2012-09-10 15:45 404bootload 加载linux 内核 挂载ramd ... -
android jbox2d学习笔记一 滑轮关节
2012-09-13 12:45 560/** * 滑轮关节 * * @time 下午12:49 ...
相关推荐
JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档JBox2D文档
由JBox2D 2.1.2 版本(目前官方最新版)源码修改而来,专门适合android平台使用,效率更高!
总共有16个例子,从浅到深的示范了如何使用JBox2D,例子可以直接运行,非常适合想学习JBox2D而又木有找到好教程的童鞋
游戏是对真实世界的仿真,其中用到了许多物理学知识,如密度、质量、质心、摩擦力、扭矩以及碰撞(恢复)系数等。接下来,本小节将简要介绍用JBox2D开发游戏时经常用到的一些物理学概念。
jbox2d 2.1.2 游戏世界的创建,jbox2d 的认识学校
50页文档,详细介绍JBox2D相关知识点; JBox2D是开源的物理引擎Box2D的Java版本,可以直接用于Android。由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该...
jbox2d是一个2D物理引擎,原版是Box2D,采用c++编写,jbox2d是原版的java版,使用jbox2d可以轻松的实现具有物理特性的动画效果,甚至是2d游戏,都可以轻松搞定
jbox2d-2.0.1-library-only JAVA版本的BOX2D物理引擎;
目前网上最详细的jbox2d的资料。 适用android系统
JBox2D是Box2D的Java版,JBox2D以其强大的引擎技术,实现出了另人震撼的物理特效,包括关节、碰撞、水流等等,甚是强大,有兴趣的童鞋们可以研究研究
android 游戏引擎 jbox2d 物理引擎 android 游戏引擎 jbox2d 物理引擎
网上的JBox2d案例一个是太少,另一个都是老版本的,新版用法都有明显区别了。所以自己经过研究,写了个简单的Demo,只有世界和刚体运动,没有碰撞检测和关节等。适合初学者研究入门! 请使用eclipse导入java工程...
box2d中文教程和Jbox2d详解 一份通用版 一份针对java语言的
jbox2d游戏引擎。用于构建移动游戏中物理世界。
jbox2d 自己写的demo for android,可以用于参考学习jbox2d
提示 由于本案例开发时使用了第三方的物理引擎JBox2D,因此需要在项目中添加相应的支持jar包"jbox2d-2.0.1-library-only.jar"。如果读者不清楚如何在Eclipse中为项目添加jar包,可以查阅相关资料,本书篇幅所限不再...
JBox2d详解-目前网上最全,讲解了java平台下游戏物理引擎的使用
jbox2d的chm文档 比用html的方便多了 英文版的
官方最新版JBox2D,内附说明文档,JBox2D 2.1.2.2
基于jbox2d的android 游戏开发相关源码