- 浏览: 579773 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
hxlniada:
[color=darkred][/color][size=sm ...
利用Handler来更新android的UI -
jack_ye:
...
检测Android中触摸屏手势的动作与坐标 -
z278013421:
Android Services使用示例 -
东方vs不败:
写的不错,挺好的
利用Handler来更新android的UI -
liangxping:
就是双缓存机制而已。
Android中SurfaceView的使用示例
Box2d是一个很出名的2d物理引擎,大家可以google之。Box2d有C++,flash和Java等版本。android可以直接使用java版本的Jbox2d,但因为Jbox2d的图形渲染是使用processing库来实现的,所以,在android中使用Jbox2d的时候,图形渲染的工作就只能自己来写了。因为网上关于box2d的资料真的非常的少,特别是关于图形绘制方面,所以,虽然程序写得不是很好,还是贴上来了,先看截图:
程序很简单:蓝色的是地面,从上面掉下两个绿球和一个红色的方块,它们之间的碰撞都由box2d引擎自己来完成。
(这程序运行起来有点卡,我 也正在解决这个问题,有朋友知道答案的也请分享一下啦!)
代码如下:
package com.ray.test; import org.jbox2d.collision.AABB; import org.jbox2d.collision.CircleDef; import org.jbox2d.collision.PolygonDef; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.Body; import org.jbox2d.dynamics.BodyDef; import org.jbox2d.dynamics.World; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.Window; import android.view.WindowManager; public class MyBox2d extends Activity { private final static int RATE = 10;//屏幕到现实世界的比例 10px:1m; private AABB worldAABB;//创建 一个管理碰撞的世界 private World world; private float timeStep = 1/60;//模拟的的频率 private int iterations = 10;//迭代越大,模拟约精确,但性能越低 private Body body,body2,body3; private MyView myView; private Handler mHandler; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN); worldAABB = new AABB(); //上下界,以屏幕的左上方为 原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟 worldAABB.lowerBound.set(-100.0f,-100.0f); worldAABB.upperBound.set(100.0f, 100.0f);//注意这里使用的是现实世界的单位 Vec2 gravity = new Vec2(0.0f,10.0f); boolean doSleep = true; world = new World(worldAABB, gravity, doSleep);//创建世界 createBox(160, 470, 160, 10, true); createBox1(160, 150, 160, 10, false); createCircle(160, 100, 10); createCircle1(150, 60, 10); timeStep = 1.0f/60.0f; iterations = 10; myView = new MyView(this); setContentView(myView); mHandler = new Handler(); mHandler.post(update); } private Runnable update = new Runnable() { public void run() { world.step(timeStep, iterations);//开始模拟 Vec2 position = body.getPosition(); Vec2 position1 = body2.getPosition(); Vec2 position2 = body3.getPosition(); myView.x=position.x*RATE; myView.y=position.y*RATE; myView.x1=position1.x*RATE; myView.y1=position1.y*RATE; myView.x2=position2.x*RATE; myView.y2=position2.y*RATE; myView.update(); mHandler.postDelayed(update, (long)timeStep*1000); } }; public void createBox(float x,float y,float half_width,float half_height, boolean isStatic){ PolygonDef shape = new PolygonDef(); if(isStatic){shape.density = 0;} else{shape.density = 2.0f;} shape.friction = 0.8f; shape.restitution = 0.3f; shape.setAsBox(half_width/RATE, half_height/RATE); BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); Body body1= world.createBody(bodyDef); body1.createShape(shape); body1.setMassFromShapes(); } public void createCircle(float x,float y,float radius){ CircleDef shape = new CircleDef(); shape.density = 7; shape.friction = 0.2f; shape.radius = radius/RATE; BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); body2 = world.createBody(bodyDef); body2.createShape(shape); body2.setMassFromShapes(); } public void createCircle1(float x,float y,float radius){ CircleDef shape = new CircleDef(); shape.density = 7; shape.friction = 0.2f; shape.radius = radius/RATE; BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); body3 = world.createBody(bodyDef); body3.createShape(shape); body3.setMassFromShapes(); } public void createBox1(float x,float y,float half_width,float half_height, boolean isStatic){ PolygonDef shape = new PolygonDef(); if(isStatic){shape.density = 0;} else{shape.density = 2.0f;} shape.friction = 0.3f; shape.setAsBox(half_width/RATE, half_height/RATE); BodyDef bodyDef = new BodyDef(); bodyDef.position.set(x/RATE, y/RATE); body= world.createBody(bodyDef); body.createShape(shape); body.setMassFromShapes(); } class MyView extends View{ Canvas canvas; public float x=160,y=150; public float x1=160,y1=100; public float x2=150,y2=60; public MyView(Context context) { super(context); } public void drawBox(float x,float y){ Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.RED); canvas.drawRect(x-160, y-10, x+160, y+10, mPaint); } public void drawGround(){ Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.BLUE); canvas.drawRect(0, 460, 320, 480, mPaint); } public void drawCircle(float x1,float y1){ Paint mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.GREEN); canvas.drawCircle(x1, y1, 10, mPaint); } public void update(){ postInvalidate(); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); this.canvas = canvas; drawGround(); drawBox(x, y); drawCircle(x1, y1); drawCircle(x2, y2); } } }
程序运行的时候需要加载Jbox2d的库,可到以下地址下载(使用的是不带渲染部分的库jbox2d-2.0.1-library-only.jar):
http://sourceforge.net/projects/jbox2d/
- MyBox2d1.3.tar.gz (181.3 KB)
- 下载次数: 1189
评论
15 楼
1025250620
2011-12-09
private float timeStep = 1/60;//模拟的的频率
private int iterations = 10;//迭代越大,模拟约精确,但性能越低
这两个参数你能说的细致点么~?
private int iterations = 10;//迭代越大,模拟约精确,但性能越低
这两个参数你能说的细致点么~?
14 楼
wu520615
2011-07-19
我跑你的demo为什么物体不掉下来?看不到效果啊!!!求指导!!!
13 楼
wu520615
2011-07-19
为什么我跑你的demo,所有的物体都是不动的! 麻烦指导一下啊!
12 楼
LoveAndr0id
2010-07-20
确实有点卡,模拟器和手机都会卡。。。
不过还是要感谢楼主的分享。。。
请问那个JNI版本的Box2d是不是还没有完成,我刚刚翻0墙出去看了看,看得不是很明天(E文还不够好)
不过还是要感谢楼主的分享。。。
请问那个JNI版本的Box2d是不是还没有完成,我刚刚翻0墙出去看了看,看得不是很明天(E文还不够好)
11 楼
zyazy119
2010-04-14
请问怎么在模拟开始之后设定物体的速度和位置?谢谢
10 楼
zhenng
2009-10-22
jjcang 写道
android的skia本身已经不错了,
不是一个东西
9 楼
jjcang
2009-10-22
android的skia本身已经不错了,
8 楼
figofuture
2009-10-22
Box2D的Android NDK移植版本
http://hi.baidu.com/gamefish/blog/item/1cb236fa3e1f31809f5146f5.html
Box2D for Android NDK
http://www.box2d.org/forum/viewtopic.php?f=5&t=3355&start=10
google group
http://groups.google.com/group/android-ndk/browse_thread/thread/10f2e02c5d6857cb?pli=1
http://hi.baidu.com/gamefish/blog/item/1cb236fa3e1f31809f5146f5.html
Box2D for Android NDK
http://www.box2d.org/forum/viewtopic.php?f=5&t=3355&start=10
google group
http://groups.google.com/group/android-ndk/browse_thread/thread/10f2e02c5d6857cb?pli=1
7 楼
lordhong
2009-08-05
raymondlueng 写道
我觉得JAVA版本box2d运行速度不行的原因在于它的垃圾回收机制,物理引擎里面使用的大量的而有生命周期很短的数据结构得不到及时回收。
嗯, JVM这个问题, 短期内在手机和嵌入式硬件上还不会得到完美解决...
6 楼
xhanxhanxhan
2009-08-05
iphone 的BOX2D 上有很多例子
查阅 cocos2d-iphone
查阅 cocos2d-iphone
5 楼
raymondlueng
2009-08-05
我觉得JAVA版本box2d运行速度不行的原因在于它的垃圾回收机制,物理引擎里面使用的大量的而有生命周期很短的数据结构得不到及时回收。
4 楼
lordhong
2009-08-05
多谢楼主分享! Java版的box2d确实比C/C++版的要慢, mobile gaming这一点, java确实不合适(至上目前是这样). iPhone上是用的C/C++版, 很流畅!
3 楼
raymondlueng
2009-08-04
恩,我也用过SurfaceView,感觉差不多。另外还用了一下NDK版本的Box2d,那个性能比较好!
2 楼
magicgod
2009-08-04
view挺慢的吧,应该用SurfaceView
1 楼
诸葛紧
2009-08-04
这里有人移植box2d
http://code.google.com/p/androidbox2d/
不过看他的截图帧率仍然不能满足游戏或应用要求啊,
以前我看过一个OECAKE在iphone上的演示视频,流体,刚体,气体都表现得很完美,一点都不卡,不知道怎么优化的
http://code.google.com/p/androidbox2d/
不过看他的截图帧率仍然不能满足游戏或应用要求啊,
以前我看过一个OECAKE在iphone上的演示视频,流体,刚体,气体都表现得很完美,一点都不卡,不知道怎么优化的
发表评论
-
类似Chome的翻转效果
2012-09-18 23:14 2412简单的demo,屏幕上下滑动翻转View,类似Android ... -
3D编程基础数学之旋转及在Android中的应用
2012-02-10 00:11 0最近因为兴趣,看了一些3D编程的书,有种感觉就是写这些书的作者 ... -
Android中屏幕Density对BitmapDrawable的影响
2011-07-08 21:44 7904很早之前写的文章了,发在这里记录一下。 在之前的 ... -
Android程序与Javascript的交换
2010-04-16 21:40 0hello! -
Android Services使用示例
2010-01-12 16:50 14143Android开发中,当需要创建在后台运行的程序的时候,就要 ... -
Android游戏开发之服务器端
2010-01-09 16:38 6720首先我不知道这篇文章发到Android开发板块是否适合的,因为 ... -
Android ListView常用用法
2009-12-03 20:56 36748ListView是比较常用的控件,但一直都觉得创建ListVi ... -
Android View添加 Listener 小技巧示例
2009-12-02 15:35 9872在开发中为控件添加Listener是非常常见的工作,最简单的添 ... -
Android Gesture 手势识别使用实例
2009-10-20 11:56 10216很高兴能在Android1.6的sdk看到手势识别这一 ... -
Android第二个游戏 DragonFeed(勇者喂恶龙)
2009-10-12 17:57 8117这是参加学校一个小比赛的参赛游戏,之前一直在忙 认证考试和项目 ... -
Android 震动示例--心跳效果
2009-10-02 23:58 7718正在开发第二个游戏,计时就要结束的时候,为了营造紧张的气氛, ... -
Android adb的使用略解
2009-09-30 16:08 40288安卓网的一个帖子,写得不错,记下来 ADB全称Android ... -
Android游戏开发之连连看算法
2009-09-29 00:36 10480因为有朋友在站内信中问到连连看的具体算法,所以我就把算法pos ... -
android游戏开发之选关画面
2009-09-21 15:44 4056在游戏开发中,往往要提供选关的页面,选择关卡可以简单地使用li ... -
Android重力感应Demo
2009-09-11 23:33 14081android中的很多游戏的游戏都使用了重力感应的技术,但其a ... -
Android游戏开发之爆炸效果
2009-09-02 00:29 18551在做Android游戏MagicBubble开发的时候 ... -
Android 的第一个游戏
2009-08-18 08:48 8020学了android1个多月,做了一款连连看游戏,上了andro ... -
Android canvas的save()和restore()用法
2009-08-05 12:21 19929在读Android SDK里面的samples里面游戏的时候, ... -
利用Handler更新Android UI的另一种方法
2009-07-29 11:28 11922文字程序很简单,一个View,一个Activity,利用han ... -
android布局学习利器-Hierarchy Viewer
2009-07-27 18:17 8148Hierarchy Viewer 帮你分析应用程序UI布局 ...
相关推荐
在本案例中,我们看到的"box2d物理引擎cocos2d"是Cocos2d集成了Box2D物理引擎的一个实例,它涵盖了Cocos2d的2.x和3.x两个版本。 Box2D引擎的核心概念包括刚体(Bodies)、形状(Shapes)、关节(Joints)和力...
本文将深入探讨如何在cocos2d-x项目中集成并使用Box2D物理引擎。 1. **cocos2d-x简介** cocos2d-x是用C++编写的,基于cocos2d-x Objective-C版本的跨平台游戏开发框架。它支持iOS、Android、Windows、Mac等多个...
示例项目则是一个实际的应用实例,它展示了Box2D引擎的使用方法。你可以运行并分析这个例子,看看它是如何实现物体运动、碰撞响应以及与用户交互的。这有助于理解如何在实际场景中应用所学的知识。 在实际开发中,...
Box2D是一款强大的开源2D物理引擎,广泛应用于游戏开发,为游戏中的物体运动提供真实感的物理模拟。本章将深入探讨Box2D在游戏开发中的应用和核心概念。 首先,Box2D的设计目标是简化2D物理模拟,使开发者能够轻松...
Box2D是一个强大的开源2D物理引擎,专为游戏开发者设计,使得在游戏场景中创建真实的物理效果变得简单易行。这个中文手册是为那些希望深入理解和应用Box2D的程序员准备的,提供了详尽的指导和实例,帮助开发者更好地...
Box2D是一个开源的2D物理引擎,由Ernesto Pena开发,广泛应用于游戏开发,尤其是像"愤怒的小鸟"这样的休闲游戏中。这个引擎以其高效、精确的模拟物理效果而闻名,允许开发者轻松地创建出逼真的物体碰撞、重力和其他...
Box2D是一个流行的开源2D物理引擎,常用于游戏开发和其他需要实时物理模拟的应用中。在本主题中,我们将探讨如何将Box2D集成到Qt应用程序中,为你的项目添加真实的物理效果。Qt是一个功能强大的C++框架,用于创建跨...
Box2D是一个强大的2D物理引擎,被广泛应用于游戏开发和模拟系统中,尤其是在Android平台上。这个引擎允许开发者创建复杂的物理交互,如重力、碰撞检测、摩擦力和弹力等,无需从头编写底层物理代码。在Android上使用...
Box2D是一个开源的2D物理引擎,广泛用于游戏开发,模拟和教育领域。它提供了现实世界的物理行为,如重力、碰撞检测、摩擦力和弹力,使得开发者能够创建出更加逼真的游戏环境和交互体验。以下是关于Box2D物理引擎的...
本项目提供的“拆方块游戏”源代码是基于Box2D物理引擎实现的一个实例,旨在帮助开发者理解如何运用Box2D来创建具有真实感的物理效果的游戏。 Box2D引擎的核心在于模拟现实世界的物理现象,如重力、碰撞检测、摩擦...
Box2D是一个开源的2D物理引擎,广泛用于游戏开发,尤其在移动平台如Android上。这个"Android Box2D物理世界源码"压缩包很可能包含了一整套用于在Android应用中实现2D物理模拟的代码。让我们深入探讨Box2D在Android...
8. **实例代码**:提供的实例工具类可以帮助开发者快速理解和应用Box2D的基本概念,通过查看和运行示例代码,可以更好地掌握引擎的用法。 9. **模拟与更新**:在每帧中,你需要调用World的Step方法来更新物理模拟。...
Box2D是一个开源的2D物理引擎,广泛用于游戏开发、模拟和教育领域。它的名称是"Box2D"的缩写,意为"二维物理盒",版本号2.1.2,意味着这是该引擎的某个特定稳定版本。Box2D由Erin Catto开发,它提供了一个强大的API...
Cocos2d-x是一个广泛使用的2D游戏开发框架,它支持多种物理引擎,其中包括Box2d。Box2d是一款功能强大的2D物理引擎,被许多游戏开发者所青睐。在Cocos2d-x 3.2版本中,开发者可以利用Box2d引擎来创建复杂的物理效果...
总的来说,Box2D是一款功能强大、易于使用的2D物理引擎,它的源代码为开发者提供了深入学习和定制的机会,是游戏开发不可或缺的工具。无论是初学者还是经验丰富的程序员,都能从中受益,构建出更加真实、有趣的2D...
综上所述,"android下box2d小demo"是一个Android应用,演示了如何使用Box2D引擎创建2D物理模拟。通过这个项目,你可以学习到如何在Android环境中集成Box2D,设置物理世界,创建和管理物理实体,以及处理用户输入和...
在Android平台上,常见的物理引擎有Box2D、JBox2D和AndEngine Physics Extension等,它们为开发者提供了丰富的物理模拟功能。 在描述中提到的小球落下又弹起的场景,这是通过重力和弹力两个关键物理概念实现的。...
这里为了配合我们的引擎实现,选择通过Opengl ES来作为渲染部分,这部分就需要我们自己来实现,其实我们也可以不使用其图像渲染部分,因为我们主要是使用Box2d来做物理检测,稍后我们会通过一个实例游戏来介绍。...
Box2D-Lite是2D物理引擎Box2D的一个精简版,专为教育和学习游戏物理设计。这个轻量级的实现提供了基础的物理模拟功能,让开发者能够快速理解和应用2D物理原理到游戏场景中。在C++环境下,Box2D-Lite是一个理想的学习...