动力男孩flash乐园

不抛弃、不放弃,梦想要迂回去实现~!
  • 首页
  • 我的座右铭
  • 我的作品
  • 留言聊天室
  • 动力男孩的诞生

存档

‘Box2D’ 分类的存档
738次浏览↓

一个测试睡眠的例子

2009年11月27日 powerboy 31 条评论

  这里给出一个小例子,方便大家看到是否设置睡眠的区别。右上角的5个按钮代表重力方向,他们都是用向量模拟的,中间的按钮“无”代表失重状态。关于睡眠设置,默认是禁止睡眠,点击右侧按钮可以切换状态。通过观察你可以发现,当所有小球停止运动的时候,如果是禁止睡眠,当你改变重力方向的时候它们仍然可以运动,如果是允许睡眠的话,你会发现他们确实睡的跟死猪一样,一动不动。

Get Adobe Flash player

  需要看源码的朋友,请在下方留言,留下你的邮箱地址,我会尽快回复你的。

分类: Box2D, 我的AS3实验室 标签: as3, flash
1,539次浏览↓

Box2D——入门教程

2009年11月27日 powerboy 3 条评论

声明:以下文章是本人在学习过程中总结的一些个人经验,如果需要复制,请务必注明出处:http://www.p-boy.cn

  现在网上关于as3的物理引擎真是不少,比较之后发现,在开源引擎当中Box2D算是比较不错的了,只可惜他的结构比较复杂,而且国内网站关于Box2D方面的教程真是少的可怜。因为我知道这个最早是c++上面的2D引擎,所以我找到了http://www.box2d.org/manual.html网址,经过几天的研究,总算是入门了,下面我会系统的针对官网给出的HelloWorld程序进行讲解,把个人心得分享给大家(鼓掌)!

  这个引擎是先从创建一个世界对象开始的,他负责管理内部一切对象的内存和模拟过程。要创建一个世界中的对象,首先我们需要为世界定义边界区域,Box2D针对区域内的所有对象进行模拟碰撞,区域的大小并不重要,但更适合的区域将提高程序性能,一般来讲这个区域设置的要比演示区域更大一些,因为一旦对象在运动时到达了边界,它就会被“冻结”并停止一切模拟活动。

var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100,-100);//左边界、上边界
worldAABB.upperBound.Set(100,100);//右边界、下边界

  下面我们要为这个世界设置重力了,就是下面这段代码,其实这里面的重力是用向量b2Vec2(x,y);来表示的,x代表水平运动,正数向右,负数向左,y代表垂直运动,正数向下,负数向上。同时我们需要再定义一个布尔型参数(我命名为doSleep),来表示是否允许睡眠,睡眠所代表的含义网上也没有一个明确的介绍,这里我简要讲解一下。因为你在这个世界中生成的一切对象,他们的模拟效果都是实时计算出来的,当doSleep=false的时候,即使物体停止了运动,计算机还是在不停的进行着运算,其实这是完全不必要的,所以一般都设为true,这样当物体停止之后就不会进行无谓的cpu消耗了。

var gravity:b2Vec2 = new b2Vec2(0,10);
var doSleep:Boolean = true;

  以上参数都准备好了,我们可以将它们传入b2World对象中并将其实例化,这样一个物理引擎的模拟区域就做好了。

var world:b2World = new b2World(worldAABB,gravity,doSleep);

  让我们开始在其中加入你想要模拟的对象吧。本来在那个英文网站中给出的是5个步骤,但是我感觉还少点什么,所以我又加了一条:
第一步、创建并定义刚体位置。这里我做一下名词解释,在任何力的作用下,体积和形状都不发生改变的物体叫做“刚体”;

var ground:b2BodyDef = new b2BodyDef();
ground.position.Set(10, 12);//这里的位置也是用向量定义的

2、给刚体定义皮肤(注意这里的皮肤并不具备物理引擎的属性,因此才有了第四步);

bodyDef.userData = _mc;//我们自己绘制的图形
addChild(bodyDef.userData);

3、用世界对象添加刚体实例,需要注意的是世界对象里并没有保存body定义的引用;

var body:b2Body = world.CreateBody(bodyDef);

4、根据皮肤形状创建模拟图形类:摩擦力、密度、弹力等等;当密度为0的时候,物体是不会动的,相当于障碍物。摩擦力和弹力取值范围是0~1,形状的区域是由SetAsBox定义的,因为模拟图形和刚体都要求以中心点为注册点,因此这里的宽和高的值都是一半,同时需要注意,这里数值单位并不是像素,而是米,1米=30像素,大家在传值的时候可别忘记换算哦。

var box:b2PolygonDef = new b2PolygonDef();//创建多边形
box.density = _density;
box.friction = _friction;
box.restitution = _restitution;
box.SetAsBox(_halfWidth , _halfHeight);

5、在刚体上添加模拟图形实例;

body.CreateShape(box);

6、根据刚体的密度和面积计算出质量,密度*面积=质量。

body.SetMassFromShapes();

  这里有两个重要的参数需要我们自己定义一下。一个是迭代次数,这里我定义为m_iterations,建议迭代次数为10,这时一个比较合理的值,使用较少的迭代可以提高性能,但模拟质量受到影响。同样,使用更多的迭代性能有所下降,但提高了你的模拟质量。另外一个参数是游戏的刷新频率,我定义为m_timeStep,根据英文教程上记载,它采用的是1/60秒刷新一次,但因为它的平台是c++,性能比AVM2虚拟机高出数倍,完全可以这么做,而在flash中我们一般设置成1/30就可以了。

var m_iterations:Number = 10;
var m_timeStep:Number = 1 / 30;

  现在一切都准备好了,我们要让所有对象模拟运动。其实他也是通过侦听帧频率而不断刷新实现的,把上面那两个参数传入世界对象的Step方法中即可,同时我们需要遍历世界中的一切对象,并对每个对象的坐标和角度进行更新。

addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
function Update(e:Event):void
{
	world.Step(m_timeStep, m_iterations);
	for (var bb:b2Body=world.m_bodyList; bb; bb=bb.m_next)
	{
		if (bb.m_userData is Sprite)
		{
			bb.m_userData.x=bb.GetPosition().x * 30;//这里获取的变量单位是米,乘以30转换成像素单位
			bb.m_userData.y=bb.GetPosition().y * 30;
			bb.m_userData.rotation=bb.GetAngle() * (180 / Math.PI);
		}
	}
}

  好了,现在相信大家已经对Box2D有了一定了解,赶快尝试制作一些效果吧。

  本文出自动力男孩博客:http://www.p-boy.cn/?p=473

分类: Box2D, flash教程 标签: as3, 教程
932次浏览↓

Box2D——shoot Demo

2009年11月27日 powerboy 29 条评论

  最近研究Box2D引擎,做了一个Demo,这个引擎结构还是比较复杂的,不过入门之后学起来就没一开始那么费力了。

Get Adobe Flash player

  需要看源码的朋友,请在下方留言,留下你的邮箱地址,我会尽快回复你的。

分类: Box2D, 我的AS3实验室 标签: as3, flash
RSS 订阅
  • Google
  • 有道
  • 鲜果
  • 抓虾
  • My Yahoo!
  • newsgator
  • Bloglines
  • 哪吒

分类列表

  • actionscript3.0学习笔记 (16)
  • air学习笔记 (6)
  • alternativa3D (3)
  • AS2疑难杂症 (1)
  • Box2D (3)
  • flash教程 (5)
  • flex学习笔记 (3)
  • 心情驿站 (24)
  • 我收集的flash 8.0资料 (3)
  • 我收集的flash 9.0资料 (3)
  • 我收集的文章 (21)
  • 我的AS2实验室 (4)
  • 我的AS3实验室 (9)
  • 我的新闻 (17)
  • 我的相册 (6)
  • 我翻译的英文资料 (7)
  • 日语学习 (2)
  • 英语学习 (2)

最近发表

  • 浅谈工具的意义
  • “小小便利店”终于上线啦
  • 禁止按tab时焦点从flash切换到地址栏
  • 隐藏Flex滚动条的箭头和滑竿
  • 为asdoc设定example
  • 一个测试睡眠的例子
  • Box2D——入门教程
  • Box2D——shoot Demo
  • 一个由单例模式引发的问题
  • 给图像加水印

最近评论

  • 空谷的回响 发表于 一个测试睡眠的例子
    我的QQ:373131285,希... »
  • manyu 发表于 一个测试睡眠的例子
    请给我发一份吧~我也在学习~谢谢... »
  • Brooks 发表于 mp3播放器 beta2.0(开源)
    好像不能下啊,楼主给我发一份吧,... »
  • velika 发表于 Box2D——shoot Demo
    刚开始学Box2d。发一份源码来... »
  • velika 发表于 一个测试睡眠的例子
    我也想要一份源码,谢谢15337... »
  • velika 发表于 一个测试睡眠的例子
    正在学BOX2D,楼主帮了我大忙... »
  • sky 发表于 一个测试睡眠的例子
    房主,你太强了,非常值得我学习,... »
  • GGGG 发表于 Box2D——shoot Demo
    zswrhua@163.com ... »
  • kirahua 发表于 Box2D——shoot Demo
    我也正在学习用BOX2D 做游戏... »
  • sans 发表于 Box2D——shoot Demo
    楼主很厉害哦,正在学box2d呢... »
  • 下一页 »

存档

  • 2010年五月 (2)
  • 2010年二月 (1)
  • 2009年十二月 (2)
  • 2009年十一月 (4)
  • 2009年十月 (1)
  • 2009年九月 (2)
  • 2009年八月 (2)
  • 2009年七月 (4)
  • 2009年五月 (3)
  • 2009年三月 (3)
  • 2009年二月 (2)
  • 2009年一月 (8)
  • 2008年十二月 (10)
  • 2008年十一月 (7)
  • 2008年十月 (4)
  • 2008年九月 (7)
  • 2008年八月 (8)
  • 2008年七月 (4)
  • 2008年六月 (5)
  • 2008年五月 (11)
  • 2008年四月 (14)
  • 2008年三月 (8)
  • 2008年二月 (12)

友情链接

  • alan新浪博客
  • sunbright
  • 云风Blog
  • 嘎嘎在东京
  • 张毅君/工长君
  • 永明则名
  • 海峡IT网
  • 闪界
  • 雷晟的新浪博客
  • 鼠标炸弹
置顶 WordPress
版权所有 © 2008-2010 动力男孩flash乐园 京ICP备09048608号
主题由 NeoEase 提供, 通过 XHTML 1.1 和 CSS 3 验证.Powered by WordPress