【发布时间】:2013-05-27 17:37:19
【问题描述】:
我已经成功地将 Farseer for XNA 集成到 MonoGame 中,几乎没有遇到任何问题。堆叠、复杂的动力学等似乎都工作得很好,但我绝对不能让球在地板上弹跳。 当球接触地面时,它会停在那里,只有在被另一个球推动时才会离开。
我的代码(在 F# 中,但应该足够清楚;
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 }
【问题讨论】:
-
body 和 fixture 对象都具有 Restitution 和 Friction 属性。确保两者都已设置。因为我只设置了 body 属性,所以遇到了同样的问题。