有時(shí)候兩個(gè)body碰撞時(shí)需要精確到某條邊,所以在創(chuàng)建body的時(shí)候需要?jiǎng)?chuàng)建multiFixture,也就是多個(gè)fixture的組合。早期Box2D版本中Polygon Shape有setAsEdge方法設(shè)置每條邊的fixture,v2.2.1之后只有setAsBox方法了。 方法一:可以在每條邊的位置上加上一個(gè)Edg
有時(shí)候兩個(gè)body碰撞時(shí)需要精確到某條邊,所以在創(chuàng)建body的時(shí)候需要?jiǎng)?chuàng)建multiFixture,也就是多個(gè)fixture的組合。早期Box2D版本中Polygon Shape有setAsEdge方法設(shè)置每條邊的fixture,v2.2.1之后只有setAsBox方法了。
方法一:可以在每條邊的位置上加上一個(gè)Edge Shape,然后再body中加入這個(gè)邊的fixture并保存起來,碰撞的時(shí)候就能判斷是碰到哪條邊了。
方法二:直接用body的createFixture(edgeShape,density)方法,直接創(chuàng)建一條edge的fixture,因?yàn)橐话氵叢恍枰渌麑傩?。默認(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不會(huì)發(fā)生碰撞,因?yàn)樗麄兌际荅dge類型。
edgeShape的長(zhǎng)度比polygonShape相應(yīng)邊的長(zhǎng)度短一點(diǎn),這樣分別在判斷左右兩邊和上下兩邊是否發(fā)生碰撞時(shí),不會(huì)相互影響到。當(dāng)rightEdge碰撞時(shí),bottomEdge不會(huì)發(fā)生碰撞;當(dāng)bottomEdge碰撞時(shí),rightEdge也不會(huì)發(fā)生碰撞。
如果edgeShape的長(zhǎng)度和polygonShape相應(yīng)邊的長(zhǎng)度一樣的話,當(dāng)rightEdge碰撞時(shí),bottomEdge的右端也會(huì)頂?shù)綁ι?,發(fā)生碰撞,從而產(chǎn)生邏輯錯(cuò)誤。比如:設(shè)定bottomShape發(fā)生碰撞時(shí)player的狀態(tài)是isJump=NO,bottomEdge沒有碰撞時(shí)isJump=YES。當(dāng)player跳起并碰到墻壁時(shí),isJump應(yīng)該是YES狀態(tài),但bottomEdge檢查到了碰撞,將isJump設(shè)為NO,這樣player的其他行為和動(dòng)作會(huì)發(fā)生錯(cuò)誤。
或者把矩形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)按照逆時(shí)針方向依次給出
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)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com