1.关于Hero,Enemy对象碰撞的问题
Citrus中的Hero,Enemy对象默认是相互碰撞的,不只是Hero和Enemy, Hero和Hero之间,Enemy和Enemy之间也会。这是因为这些对象实现了物理学,都定义成为了刚体。
在实际游戏中,角色和对人往往都是可以重合的,没有必要检测碰撞。
Citrus中暂时只能通过更改Hero,Enemy源代码来去除碰撞检测。通过更改他们的defineFixture方法可以达到目的。
_fixtureDef.filter.maskBits = PhysicsCollisionCategories.GetAllExcept("Items");
比如上面的代码是Enemy类defineFixture中的,表示出了Items对象都会发生碰撞,这也包括了enemy,hero,可以改成
_fixtureDef.filter.maskBits = PhysicsCollisionCategories.GetAllExcept("BadGuys");
这样就不会和自己同类的对象发生碰撞了,也就是说可以重叠显示了。
2.关于tiled map的一些问题
Citrus中能够解析tmx文件(tiled 生成)并自己创建platform对象,也就说只要你在场景中创建了物理世界,你创建的hero,enemy都会顺利地落在这些platform上面。
但是这有个问题,就说当platform位置比较低的时候,hero站在platform下面按空格跳跃会直接撞到上面的platform。解决这个需要在tmx文件的object层给类型为citrus.objects.platformer.box2d.Platform的对象设置属性oneway=true,这样hero只有从上面落下的时候和platform碰撞。
上图创建的地图中每个platform两旁创建了两个竖直的Object,这里我给他定义type为citrus.objects.platformer.box2d.Sensor,目的是防止怪物从这些较长的platform上面掉下来。
当然光这样做citrus是不会自己给你完成这样的功能的,还需要自己创建一个类,继承Enemy,重写他的handleBeginContact方法
public class Monster extends MyEnemy
{
public function Monster(name:String, params:Object = null)
{
super(name, params);
}
override public function handleBeginContact(contact:b2Contact):void {
var obj:IBox2DPhysicsObject = Box2DUtils.CollisionGetOther(this, contact);
if (obj is Sensor) {
turnAround();
}
super.handleBeginContact(contact);
}
override public function handleEndContact(contact:b2Contact):void {
super.handleEndContact(contact);
}
}
var obj:IBox2DPhysicsObject = Box2DUtils.CollisionGetOther(this, contact);
获取碰撞对象
if (obj is Sensor) {
turnAround();
}
如果对象是我们创建在platform两头的Sensor,那怪物就要掉头了,也就掉不下去了。
大猩猩刚掉头^o^