有時候兩個body碰撞時需要精確到某條邊,所以在創(chuàng)建body的時候需要創(chuàng)建multiFixture,也就是多個fixture的組合。早期Box2D版本中Polygon Shape有setAsEdge方法設(shè)置每條邊的fixture,v2.2.1之后只有setAsBox方法了。 方法一:可以在每條邊的位置上加上一個Edg
有時候兩個body碰撞時需要精確到某條邊,所以在創(chuàng)建body的時候需要創(chuàng)建multiFixture,也就是多個fixture的組合。早期Box2D版本中Polygon Shape有setAsEdge方法設(shè)置每條邊的fixture,v2.2.1之后只有setAsBox方法了。
方法一:可以在每條邊的位置上加上一個Edge Shape,然后再body中加入這個邊的fixture并保存起來,碰撞的時候就能判斷是碰到哪條邊了。
方法二:直接用body的createFixture(edgeShape,density)方法,直接創(chuàng)建一條edge的fixture,因?yàn)橐话氵叢恍枰渌麑傩浴DJ(rèn)邊有摩擦力和彈力。
邊也是以body中點(diǎn)為原點(diǎn),所以邊的起點(diǎn)和終點(diǎn)要用寬和高的一半來算。
這樣添加后的碰撞種類(以player站在platform)上為例,可分為:
1. player的polygonShape和platform的topEdgeShape碰撞。
2. player的bottomEdgeShape和platform的polygonShape碰撞。
3. player的polygonShape和platform的polygonShape碰撞。
4. player的bottomEdgeShape和platform的topEdgeShape不會發(fā)生碰撞,因?yàn)樗麄兌际荅dge類型。
edgeShape的長度比polygonShape相應(yīng)邊的長度短一點(diǎn),這樣分別在判斷左右兩邊和上下兩邊是否發(fā)生碰撞時,不會相互影響到。當(dāng)rightEdge碰撞時,bottomEdge不會發(fā)生碰撞;當(dāng)bottomEdge碰撞時,rightEdge也不會發(fā)生碰撞。
如果edgeShape的長度和polygonShape相應(yīng)邊的長度一樣的話,當(dāng)rightEdge碰撞時,bottomEdge的右端也會頂?shù)綁ι希l(fā)生碰撞,從而產(chǎn)生邏輯錯誤。比如:設(shè)定bottomShape發(fā)生碰撞時player的狀態(tài)是isJump=NO,bottomEdge沒有碰撞時isJump=YES。當(dāng)player跳起并碰到墻壁時,isJump應(yīng)該是YES狀態(tài),但bottomEdge檢查到了碰撞,將isJump設(shè)為NO,這樣player的其他行為和動作會發(fā)生錯誤。
或者把矩形polygonShape的直角頂點(diǎn)“切掉”,變成八邊形。
如下圖所示:
1.
//DELTA_LENGTH = 0.5 //fixture1 with polygon shape b2PolygonShape rectShape; rectShape.SetAsBox(size.x/2/PTM_RATIO, size.y/2/PTM_RATIO); b2FixtureDef fixtureDef1; p_body->CreateFixture(&fixtureDef1); //fixture2 with edge shape b2EdgeShape edgeShape; edgeShape.Set(b2Vec2((-size.x/2 + DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO), b2Vec2((size.x/2 - DELTA_LENGTH)/PTM_RATIO, (s-size.y/2)/PTM_RATIO)); b2FixtureDef fixtureDef2; fixtureDef2.shape = &edgeShape; p_bottomFixture = p_body->CreateFixture(&fixtureDef2);
2.
b2EdgeShape edgeShape; edgeShape.Set(b2Vec2((-size.x/2 + DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO), b2Vec2((size.x/2 - DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO)); p_bottomFixture = p_body->CreateFixture(&edgeShape, 0);
3 polygonShape必須是凸多邊形,頂點(diǎn)按照逆時針方向依次給出
b2PolygonShape polygonShape; b2Vec2 vec[] = {b2Vec2(-size.x/2/PTM_RATIO, -size.y/2/PTM_RATIO), b2Vec2(size.x/2/PTM_RATIO, -size.y/2/PTM_RATIO), b2Vec2(size.x/2/PTM_RATIO, -size.y/4/PTM_RATIO), b2Vec2(size.x/4/PTM_RATIO, size.y/2/PTM_RATIO), b2Vec2(-size.x/4/PTM_RATIO, size.y/2/PTM_RATIO), b2Vec2(-size.x/2/PTM_RATIO, -size.y/4/PTM_RATIO)}; polygonShape.Set(vec, 6); b2FixtureDef fixtureDef1; fixtureDef1.shape = &polygonShape; fixtureDef1.density = dens; fixtureDef1.friction = f; fixtureDef1.restitution = rest; p_polygonFixture = p_body->CreateFixture(&fixtureDef1);
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com