2011-04-14 2 views
2

저는 Flash 게임을 만들고 있는데, Box2D에서 다각형 모양을 그릴 때 정말 이상한 문제가 발생했습니다.Box2D에서 사용자 정의 폴리곤 그리기

여기 내가 사용하는 코드입니다 : vertexArray, 4 개 b2Vec2 정점을 포함하는 유효한 배열이다 볼록 형상을 구성하는

var fixtureDefs:Array = new Array(); 

... 

var fDef:b2FixtureDef = new b2FixtureDef(); 
fDef.density = 0; 
fDef.shape = new b2PolygonShape(); 
b2PolygonShape(fDef.shape).SetAsArray(vertexArray); 
fixtureDefs.push(fDef); 

//This gets repeated several times, so that at the end you get a body consisting of several convex shapes. 

... 

var bD:b2BodyDef = new b2BodyDef(); 
bD.type = b2Body.b2_staticBody; 
bD.position.Set(300/Constants.RATIO,200/Constants.RATIO); 

var body:b2Body = Constants.world.CreateBody(bD); 

... 

for each(var fD:b2FixtureDef in fixtureDefs) { 
body.CreateFixture(fD); 
} 

.

내가 테스트 할 때 문제는, 해당 신체에 대해 충돌이 올바르게 작동하지 않는다는 것입니다. 다른 대부분의 객체 (몸, 사용자 제어 문자)는 몸체가 전혀없는 것처럼 똑바로지나갑니다. 일부 레이 캐스트도 통과합니다.

내가 충분히 가지고있는 한 종류의 시체 (관례 적)가 어떻게 든 시체를 감지하고 그 몸체와 충돌합니다. 특별한 종류의 적들이 시도하는 레이 캐스트 do - 캐릭터가 다각형 뒤에 숨어있을 때 볼 수없는 것처럼 보입니다.

다른 이상한 점 : SetAsArray 대신 SetAsBox 만 사용하면 동일한 코드를 시도 할 때 정확하게 작동합니다.

저는 사용자 정의 ContactListener 클래스를 사용하고 있습니다. 그러나 실현하지 않으면 가능한 한 모든 연락처 필터링을 수행하지 않았습니다.

Flash 9 버전의 Box2D 2.1a를 사용하고 있습니다.

제안 사항? 내가 명백한 것을 놓치고 있거나 (하나님이 금물!) 버그를 발견 했습니까? 당신의 도움을 주셔서 감사합니다!

안드레이

답변

3

Heyo 안드레이, 당신이 제대로 작동하려면 거의 모든 선언해야하므로

2.1A가 엄격한 측면에 더 많은 것이다.

private var body:b2Body; 
private var bodyDef:b2BodyDef = new b2BodyDef(); 
private var bodyPoly:b2PolygonShape = new b2PolygonShape(); 
private var bodyFix:b2FixtureDef = new b2FixtureDef(); 

private var vertexArray:Array = new Array(); 

public function Example() 
{ 

//Setting up Vertices in an Array 
var ver1:b2Vec2 = new b2Vec2(-1, -1); 
var ver2:b2Vec2 = new b2Vec2(1, -1); 
var ver3:b2Vec2 = new b2Vec2(1, 1); 
var ver4:b2Vec2 = new b2Vec2(-1, 1); 

//Push in order 
vertexArray.push(ver1, ver2, ver3, ver4); 

bodyDef.type = b2Body.b2_dynamicBody; 
//b2Vec2 Array then Vertex Count 
bodyPoly.SetAsArray(vertexArray, vertexArray.length); 
bodyFix.shape = bodyPoly; 
bodyFix.density = 0.5; 
bodyFix.friction = 0.5; 
bodyFix.restitution = 0.5; 
bodyDef.position.Set(0, 0); 
body = m_world.CreateBody(bodyDef); 
body.CreateFixture(bodyFix); 

} 

AS3의 OOP- 각 지점 전에 하나의 오른쪽에 있어야한다는 것을 기억하십시오. 나는 일의 설명에 아주 좋은 아니에요

vertexArray.push(ver1, ver2, ver3, ver4); 

오른쪽

var ver1:b2Vec2 = new b2Vec2(-1, -1);//Top Left 
var ver2:b2Vec2 = new b2Vec2(1, -1);//Top Right 
var ver3:b2Vec2 = new b2Vec2(1, 1);//Bottom Right 
var ver4:b2Vec2 = new b2Vec2(-1, 1);//Bottom Left 
왼쪽

배치하지만 난이 도움의 희망! -Zero

+2

안녕하세요, 오늘 문제가 무엇인지 발견했지만 24 시간 대기로 인해 게시 할 수 없습니다. 어쨌든, 당신은 꽤 많이 못 박았습니다. 내 문제가 반 시계 방향으로 정점을 나열했다. 나는 시계 방향으로 그것들을 입력하려고 노력했다. 그리고 그것은 일했다! 모든 매뉴얼은 그것이 CCW라고 말하지만 "CCW는 z 축이 비행기를 가리키는 오른손 좌표계와 관련이 있습니다. 이것은 시계 방향으로 회전 할 수 있습니다. 좌표 체계 협약 " 누군가 이것을 설명 할 수 있습니까? -Andrey – Andrey

0

Heyo again, 대부분의 Box2D 버전이 다른 사람들에 의해 작성되었으므로 소스 코드가 변경되어 프로그래밍 언어에 더 잘 부합하기 위해 찾고 있던 설명서가 AS3에서 다른 언어를 참조했을 가능성이 큽니다. 가능성이 C++.

원본에는 'Docs'라는 폴더가 있어야하며 해당 버전의 문서가있는 폴더가 있어야합니다.

+0

C++ 및 AS3 온라인 설명서와 다운로드 한 라이브러리에서 사용하고있는 설명서를 확인하십시오. 내가 생각하는 온라인 AS3에서 약간의 부정확성을 보았지만 C++은 꽤 최신 버전이다. Box2D 포럼에 질문 해 보겠습니다. 당신의 도움을 주셔서 감사합니다! -Andrey – Andrey

+0

대단히 환영합니다! – b2Zero

관련 문제