js box2dweb как создать кольцо, внутри которого будет пусто
Я хочу создать кольцо на box2dweb, внутри которого я хочу чтобы прыгал шар. Шары, квадраты, полигоны я научился создавать без проблем. Но я без понятия как создать кольцо, центр которого будет на координатах 512, 256 и внутри него должно быть пусто и чтобы шар из него не мог выпасть. Вот мой код:
class Ring extends GameObject{
constructor(){
super(new Vector3(0,0,0),new Size(1,1));
this.circleThickness = 5;
this.radius = 240;
const circleRadius = this.radius * pxsi;
const circleThickness = this.circleThickness * pxsi;
var bodyDef1 = new b2BodyDef;
bodyDef1.type = b2Body.b2_dynamicBody;
bodyDef1.position.Set(512*pxsi, 256*pxsi);
var body1 = pworld.CreateBody(bodyDef1);
var shape1 = new b2CircleShape(240*pxsi); // радиус кольца
body1.CreateFixture2(shape1, 1);
var bodyDef2 = new b2BodyDef;
bodyDef2.type = b2Body.b2_dynamicBody;
bodyDef2.position.Set(513*pxsi, 256*pxsi); // смещаем по оси X
var body2 = pworld.CreateBody(bodyDef2);
var shape2 = new b2CircleShape(200*pxsi); // радиус внутреннего отверстия кольца
body2.CreateFixture2(shape2, 1);
}
OnRender(rect){
g.beginPath();
g.arc(512,256, this.radius, 0, 2 * Math.PI);
g.strokeStyle = 'white';
g.lineWidth = this.circleThickness;
g.stroke();
}
}
class Player extends GameObject{
constructor(){
super(new Vector3(512,256,10), new Size(48,48));
this.radius = 24;
bodyDef.type = b2Body.b2_dynamicBody;
fixDef.shape = new b2CircleShape(this.radius*pxsi);
bodyDef.position.x = this.pos.x*pxsi;
bodyDef.position.y = this.pos.y*pxsi;
const body = pworld.CreateBody(bodyDef);
this.body = body;
this.fixture = body.CreateFixture(fixDef);
body.SetUserData(this);
this.OnUpdate = true;
}
OnRender(rect){
g.beginPath();
g.arc(0,0, this.radius, 0, 2 * Math.PI);
g.fillStyle = 'white';
g.fill();
}
Update(){
const pbody = this.body;
const pos_si = pbody.GetPosition();
const pos = this.pos;
pos.x = pos_si.x * sipx;
pos.y = pos_si.y * sipx;
this.Rotate = pbody.GetAngle();
}
}
var b2Vec2 = Box2D.Common.Math.b2Vec2
, b2AABB = Box2D.Collision.b2AABB
, b2BodyDef = Box2D.Dynamics.b2BodyDef
, b2Body = Box2D.Dynamics.b2Body
, b2FixtureDef = Box2D.Dynamics.b2FixtureDef
, b2Fixture = Box2D.Dynamics.b2Fixture
, b2World = Box2D.Dynamics.b2World
, b2MassData = Box2D.Collision.Shapes.b2MassData
, b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape
, b2CircleShape = Box2D.Collision.Shapes.b2CircleShape;
var pworld = new b2World(new b2Vec2(0, 10),true);
var fixDef = new b2FixtureDef;
fixDef.density = 1.0;
fixDef.friction = 0.5;
fixDef.restitution = 0.9;
var bodyDef = new b2BodyDef;
const pxsi = 0.001;
const sipx = 1/pxsi;