2014-01-15 41 views
0

我就在cocos2d/Box2D的游戏工作,并拥有一切运作良好,移动精灵,碰撞等的cocos2d Box2D的风扇 - 影响精灵无碰撞

我想补充一点,影响我的移动精灵的一些元素没有精灵触摸或与他们碰撞,并不知道该怎么做。

我的精灵可以与物体发生碰撞,而且我可以做到这一点没有问题 - 但是我正在寻找一个影响我的精灵但不会碰撞的物体 - 例如风扇会吹动精灵,一个吸引我的精灵的磁铁型装置。

如果我的精灵与这样的对象碰撞,那么它应该注册一个碰撞并死亡,但是如果它只是将NEAR移动到对象,那么它应该被吸引或排斥。

有什么想法?

+2

您可以制作传感器主体,但不会产生接触事件,但没有碰撞响应,允许您对任何接触人体应用固定脉冲 – LearnCocos2D

+0

您可以定义区域,并且当您的精灵体进入该区域时,您可以改变重力采取行动 - 风扇或磁铁。 – Renaissance

回答

1

您可以随时对物体施加力(如F = ma)以使其移动。

box2d中的重力一直在做这个事情,如果你已经定义了一个重力矢量,它就会使物体落下。

所以,你的粉丝并不一定是一个真正的“物体”,因为它有一个身体。您可以随时使用box2d中的方法将风扇的力施加到您希望风扇吹出的物体上。我有一个“EntityController”的代码,用于施加推力,使其在某个方向(目标方向)上移动。这是它的代码:

void ApplyThrust() 
    { 
     // Get the distance to the target. 
     Vec2 toTarget = GetTargetPos() - GetBody()->GetWorldCenter(); 
     toTarget.Normalize(); 
     Vec2 desiredVel = GetMaxSpeed()*toTarget; 
     Vec2 currentVel = GetBody()->GetLinearVelocity(); 
     Vec2 thrust = desiredVel - currentVel; 
     GetBody()->ApplyForceToCenter(GetMaxLinearAcceleration()*thrust); 
    } 

在这种情况下,身体正在向目标移动。但它可能很容易就是目标是风扇吹进来的方向,而现在“正在吹制的东西”的质量中心被推离风扇。我的所有物体都有最大速度(GetMaximumSpeed(...)),所以这个函数只会施加力,直到物体以最大速度移动,然后不再施加(这是一个自然的反馈循环) 。

欢迎您查看代码库here on git hub的其余部分。这也是谈到in this post。请注意,这是用cocos2d-x(C++)编写的,但如果您将文件声明为.mm(允许使用C++代码),则相同的C++代码将在cocos2d中运行。或者只是使用没有代码的技术,因为你认为合适。

对您有帮助吗?