2013-05-16 5 views
2

Я успешно интегрировал Farseer для XNA в MonoGame без особых проблем. Укладка, сложная динамика и т. Д., Похоже, работают нормально, но я абсолютно не могу заставить мяч отскочить на пол. Когда мяч касается земли, он просто останавливается там и только уходит, если толкнул другой мяч.Farseer, MonoGame, мяч не отскакивает

Мой код (в F #, но оно должно быть достаточно ясно, < - означает назначение, все остальное такое же, как C#) для создания мяч и земля:

member physics.CreateBall(x:float32<m>,y:float32<m>,r:float32<m>,m:float32<kg>,dynamic:bool) = 
    let myBody = Factories.BodyFactory.CreateBody(physics.Physics, Microsoft.Xna.Framework.Vector2(x * 1.0f<1/m> + random_range -30.0f 30.0f, y * 1.0f<1/m>) * PhysicsWorld.Scale) 
    do myBody.LastFrameUpdate <- Casanova.Core.get_frame_counter() 
    do myBody.BodyType <- if dynamic then BodyType.Dynamic else BodyType.Static 
    do myBody.Restitution <- 1.0f 
    do myBody.Friction <- 0.0f 
    do myBody.Mass <- m * 1.0f<_> 
    let circleShape = new CircleShape(r * PhysicsWorld.Scale * 1.0f<1/m>, 1.0f) 
    let fixture = myBody.CreateFixture(circleShape) 
    { Body = myBody; Tick = Rule.Create 0 } 
    member physics.CreateBox(x:float32<m>,y:float32<m>,w:float32<m>,h:float32<m>,m:float32<kg>,dynamic:bool) = 
    let myBody = Factories.BodyFactory.CreateBody(physics.Physics, Microsoft.Xna.Framework.Vector2(x * 1.0f<1/m>, y * 1.0f<1/m>) * PhysicsWorld.Scale) 
    do myBody.LastFrameUpdate <- Casanova.Core.get_frame_counter() 
    do myBody.BodyType <- if dynamic then BodyType.Dynamic else BodyType.Static 
    do myBody.Restitution <- 1.0f 
    do myBody.Friction <- 0.0f 
    do myBody.Mass <- m * 1.0f<_> 
    let rectangle = PolygonTools.CreateRectangle(w * PhysicsWorld.Scale * 1.0f<1/m>, h * PhysicsWorld.Scale * 1.0f<1/m>) 
    let boxShape = PolygonShape(rectangle, 1.0f) 
    let fixture = myBody.CreateFixture(boxShape) 
    { Body = myBody; Tick = Rule.Create 0 } 
+0

Объекты кузова и приспособления имеют свойства реставрации и трения. Убедитесь, что оба установлены. Застрял в той же проблеме, потому что у меня были только свойства тела. – Wolf5

ответ

1

Самое простое решение все. Код выше был почти правильным, минус порядок инициализации. Вот рабочая версия для справок:

let myBody = Factories.BodyFactory.CreateBody(physics.Physics, Microsoft.Xna.Framework.Vector2(x * 1.0f<1/m>, y * 1.0f<1/m>) * PhysicsWorld.Scale) 
let rectangle = PolygonTools.CreateRectangle(w * PhysicsWorld.Scale * 1.0f<1/m>, h * PhysicsWorld.Scale * 1.0f<1/m>) 
let boxShape = PolygonShape(rectangle, 1.0f) 
let fixture = myBody.CreateFixture(boxShape) 
do myBody.LastFrameUpdate <- Casanova.Core.get_frame_counter() 
do myBody.BodyType <- if dynamic then BodyType.Dynamic else BodyType.Static 
do myBody.Restitution <- restitution 
do myBody.Friction <- friction 
do myBody.Mass <- m * 1.0f<_>