2

Farseer for XNA を 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 }
4

1 に答える 1

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<_>
于 2013-05-27T09:37:19.930 に答える