声明:以下文章是本人在学习过程中总结的一些个人经验,如果需要复制,请务必注明出处:http://www.p-boy.cn
工具,是一把利器,做事情需要讲究方式方法,如果做事情时选择了合适的工具,可以让你的做事效率事半功倍。工具,可以是有形的也可以是无形的。但是,什么样的工具适合自己,怎样来选择适合自己的工具呢,这是每个人都需要努力去研究的话题。
不管是哪家公司,都可能遇到过这种情况:在同一个项目里,每个部门的职能各不相同,有时候会发现项目推进的很困难,部门之间会相互推卸责任、扯皮,尤其越大的公司表现的越明显。究其原因,很多人可能会说这样的话,例如:项目需求不明确、这个问题应该XXX来负责、这个问题我以前都讲过等等之类的话。其实我们回过头来仔细想想,这些部门的领导们是否以身作则了呢?正有一句话所谓:有什么样的领导,就有什么样的团队。这的确是有根据的,领导就相当于航海中的信号灯,当船只在遇到大雾而迷路的时候,它能够指明方向,让大家跳出现有的困境而向前看。一旦这个时候没有了信号灯或者信号灯给错了方向,那么整只船队也就跟着一起陷进去了。所以对于领导的团队管理,是一定要讲究方法的。如果领导能够观察到每个成员的工作方式,也许就会用自己的经验去帮助他们改进;如果能够跟踪到每个成员的项目进度,也许就会更好的安排工作周期;如果能够关注一下其他团队目前的现状和所需要协助的地方,也许就会避免团队之间走更多的弯路。
但是假设上面的条件都满足就可以了吗,显然这里面还有一个执行力的问题,如果这一条不满足,纵使你有再多的管理经验也无济于事。既然我们谈到了执行力,就不得不谈“威信”二字,你可以有“威”,但是没有“信”的话,恐怕“威”也很难持久。如果想要每个成员都“信”你,必然要经历一个长期而持续的过程,而这个过程,恰恰也是对领导的一个考验。
备注:
有形的工具:各种软件(例如Redmine、Project等等)。
无形的工具:沟通技巧、解决问题的方式、意识(例如遇到问题,知道需要向谁寻求协助)
自从新换了工作之后,就一直没怎么再更新博客了,每天的时间都安排的满满的,今天借着推出这款小游戏的机会,赶紧踩个脚印。本来计划这款游戏半个月完成,但由于平时的工作太忙,导致我一周只有一天的开发时间,这款游戏在经历了2个多月之后才浮出水面,现在还仍然在完善中。
目前正在跟人人网合作,在此感谢跟我一起奋斗的兄弟们,没有大家的共同努力,这款游戏是永远也不会有成功的基因的。
游戏地址:http://page.renren.com/littlecvs/index
最近在学习用asdoc生成文档,我们在使用官方API文档的时候,都能看到有些类的底部会有关于这个类是如何使用的例子,他是如何做到的呢,其实用的就是这个指令:@includeExample xxx/example.as,在它后面跟的是例子的路径,但是有一点,我们不能因为想要写个小例子,就把它放在跟类相同的路径下吧,这会非常糟糕的,我们更希望把例子集中在一个文件夹下统一管理,有什么好办法吗,答案是肯定的。我们需要在编译语句后面加上-examples-path [盘符]:\[路径],它指的就是我们存放例子的路径,但是一定要记住,存放example的路径最好跟类文件的路径是一样的,这样管理起来更方便。比如我把框架放在d盘名为powerboy的目录下,框架里有个cn.pboy.control.Button的类,它的路径看起来像这样:d:\powerboy\cn\pboy\control\Button.as,现在我要对这个类添加例子,我想把例子统一放在d盘的examples文件夹下统一管理,那么路径应该是这样的:d:\examples\cn\pboy\control\ButtonExample.as,然后在命令行工具下把当前盘符设为d:\powerboy>,通过以下命名就可以编译了:asdoc -source-path . -doc-sources . -examples-path d:\examples
这里给出一个小例子,方便大家看到是否设置睡眠的区别。右上角的5个按钮代表重力方向,他们都是用向量模拟的,中间的按钮“无”代表失重状态。关于睡眠设置,默认是禁止睡眠,点击右侧按钮可以切换状态。通过观察你可以发现,当所有小球停止运动的时候,如果是禁止睡眠,当你改变重力方向的时候它们仍然可以运动,如果是允许睡眠的话,你会发现他们确实睡的跟死猪一样,一动不动。
需要看源码的朋友,请在下方留言,留下你的邮箱地址,我会尽快回复你的。
声明:以下文章是本人在学习过程中总结的一些个人经验,如果需要复制,请务必注明出处: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、在刚体上添加模拟图形实例;
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引擎,做了一个Demo,这个引擎结构还是比较复杂的,不过入门之后学起来就没一开始那么费力了。

需要看源码的朋友,请在下方留言,留下你的邮箱地址,我会尽快回复你的。
最近我用一个单例模式类LoginNetManager对socket进行了封装,里面有一个send方法,专门用户向服务器发送事件,写法如下:
1
2
| LoginNetManager.getInstance().addEventListener(NetEvent.SOCKET_ERROR,onConnectError);
LoginNetManager.getInstance().send(NetEvent.LS_MSG_ADDCONNECT); |
这个就是向服务器发送其中一个事件信息的语句,但奇怪的问题出现了,我在flashIDE本地进行测试的时候,一切正常,但是当我放到虚拟路径下测试的时候,它就会提示说“无法找到空对象引用的属性或方法”,我一看,问题就出在第二行那个send的方法,难道说类还没有完全实例化的时候,程序就继续向下运行了?但是这里也不存在异步执行啊,无奈之下,我修改成一个延迟语句:
1
2
| LoginNetManager.getInstance().addEventListener(NetEvent.SOCKET_ERROR,onConnectError);
setTimeout(getSocket,500); |
我在getSocket方法中调用那条语句,问题就都解决了。这确实很蹊跷,我承认flash在本地运行与在网页中运行的时候,执行的是不同的flash player程序,但是从这个例子来讲,不同flash player之间的差异性还是显而易见的。
今天应朋友需求,写了一个简单的图像加水印小软件,这个姑且叫做1.0版本吧,以后还会陆续添加更多功能。
