2014-01-15 59 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中運行。或者只是使用沒有代碼的技術,因爲你認爲合適。

對您有幫助嗎?