Windows phone 7 Farseer-粒子不´;t根据边界移动/反弹

Windows phone 7 Farseer-粒子不´;t根据边界移动/反弹,windows-phone-7,windows-phone-7.1,box2d,farseer,Windows Phone 7,Windows Phone 7.1,Box2d,Farseer,我用这句话表达了我的观点: class Maze { private Body _agentBody; private Sprite _box; private GameplayScreen _screen; private float _offset; public Maze(World world, GameplayScreen screen, Vector2 position) {

我用这句话表达了我的观点:

class Maze
    {
        private Body _agentBody;
        private Sprite _box;
        private GameplayScreen _screen;
        private float _offset;

        public Maze(World world, GameplayScreen screen, Vector2 position)
        {
            _agentBody = BodyFactory.CreateBody(world, position);
            _agentBody.BodyType = BodyType.Dynamic;
            _agentBody.IsStatic = true;
            _agentBody.Restitution = 0.2f;
            _agentBody.Friction = 0.2f;

            _offset = ConvertUnits.ToDisplayUnits(1f);
        // spodek
            _agentBody.CreateFixture(new PolygonShape(PolygonTools.CreateRectangle(1f, 0.05f, new Vector2(0f, 1f), 0), 1f));
            // spodek
            _agentBody.CreateFixture(new PolygonShape(PolygonTools.CreateRectangle(1f, 0.05f, new Vector2(0f, -1f), 0), 1f));
            // pravy bok
            _agentBody.CreateFixture(new PolygonShape(PolygonTools.CreateRectangle(0.05f, 1f, new Vector2(1f, 0f), 0), 1f));
            // levy bok
            _agentBody.CreateFixture(new PolygonShape(PolygonTools.CreateRectangle(0.05f, 1f, new Vector2(-1f, 0f), 0), 1f));   
            _screen = screen;

            //GFX
            AssetCreator creator = _screen.ScreenManager.Assets;
            _box = new Sprite(creator.TextureFromVertices(PolygonTools.CreateRectangle(1f, 0.05f),
                                                           MaterialType.Blank, Color.White, 1f));
        }

        public Body Body
        {
            get { return _agentBody; }
        }

        public void Draw()
        {
            SpriteBatch batch = _screen.ScreenManager.SpriteBatch;
            batch.Draw(_box.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
                        Color.White, _agentBody.Rotation, _box.Origin + new Vector2(0f, _offset), 1f, SpriteEffects.None, 0f);
            batch.Draw(_box.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
                        Color.White, _agentBody.Rotation, _box.Origin + new Vector2(0f, -_offset), 1f, SpriteEffects.None, 0f);

            batch.Draw(_box.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
                        Color.White, _agentBody.Rotation + MathHelper.Pi / 2f, _box.Origin + new Vector2(0f, _offset), 1f, SpriteEffects.None, 0f);
            batch.Draw(_box.Texture, ConvertUnits.ToDisplayUnits(_agentBody.Position), null,
                        Color.White, _agentBody.Rotation + MathHelper.Pi / 2f, _box.Origin + new Vector2(0f, -_offset), 1f, SpriteEffects.None, 0f);
        }

    }
这些是我的小粒子:

for (int i = 0; i < 8; i++)
            {
                _sands[i] = BodyFactory.CreateRectangle(_world, 0.05f, 0.05f, 1f);
                _sands[i].IsStatic = false;
                _sands[i].Restitution = 0.1f;
                _sands[i].Friction = 0.1f;
                _sands[i].Position = new Vector2(1.8f + i * 0.2f, 2.2f);
            }

            _sand = new Sprite(ScreenManager.Assets.TextureFromShape(_sands[0].FixtureList[0].Shape,
                                                                        MaterialType.Dots,
                                                                        Color.SandyBrown, 0.8f));
但我不明白为什么如果我用边界旋转,那么为什么partlicles仍然存在。我尝试改变粒子的恢复,当有1f时,它们会恢复(反弹),我可以用边界旋转,它们会从边界的新位置恢复,但当我有像上面这样的设置时,粒子会掉落,边界内的粒子会停在底部边界,其他粒子会完全掉落。所以在开始之后,我有了第一个图像,在我用边框旋转之后,我得到了第二个图像。我做错了什么?为什么当我更改恢复时,他们会反弹0.2,而不是

编辑: 迷宫构造器中的新行:

agentBody = BodyFactory.CreateBody(world, position);
            _agentBody.BodyType = BodyType.Dynamic;
            _agentBody.IgnoreGravity = true;
            _agentBody.Restitution = 0.1f;
            _agentBody.Friction = 1f;

            _offset = ConvertUnits.ToDisplayUnits(1.5f);

            FixtureFactory.AttachRectangle(3f, 0.1f, 1f, new Vector2(0, 1.55f), _agentBody);
            FixtureFactory.AttachRectangle(3f, 0.1f, 1f, new Vector2(0f, -1.55f), _agentBody);
            FixtureFactory.AttachRectangle(width, 3f, 1f, new Vector2(-1.55f, 0f), _agentBody);
            FixtureFactory.AttachRectangle(width, 3f, 1f, new Vector2(1.55f, 0f), _agentBody);
以下是调试视图的外观:

随身体旋转:

public override void HandleInput(GameTime gameTime, InputState input)
{
    if (input == null)
        throw new ArgumentNullException("input");

    // Read in our gestures
    foreach (GestureSample gesture in input.Gestures)
    {
        if (gesture.GestureType == GestureType.HorizontalDrag)
        {
            if (gesture.Delta.X < 0)
            {
                _maze.Body.Rotation += 0.02f;
            }
            else if (gesture.Delta.X > 0)
            {
                _maze.Body.Rotation -= 0.02f;
            }
        }
    }
public override void HandleInput(游戏时间游戏时间,输入状态输入)
{
如果(输入==null)
抛出新的ArgumentNullException(“输入”);
//读懂我们的手势
foreach(输入.手势中的手势示例手势)
{
if(手势.GestureType==GestureType.HorizontalDrag)
{
if(手势δX<0)
{
_迷宫体旋转+=0.02f;
}
else if(手势Delta.X>0)
{
_迷宫体旋转-=0.02f;
}
}
}

小粒子体一旦停止移动,就可能处于睡眠状态。它们周围的框架是一个静止的物体,因此发动机不希望它移动,但你正在移动它。在这种情况下,小粒子体不会醒来


你需要设置小粒子体,使其无法睡眠,或使其周围的框架成为动态或运动学体。一般来说,如果一个物体要移动,不要使其成为静态体。

你说得对。他们在睡觉。所以我将迷宫设为动态,并将IgnoreGravity设为真,但现在我有一个问题,粒子无法移动u底部边框,但在debugview夹具中看起来不错。但是你回答了我的问题,所以谢谢:)你是使用SetTransform旋转帧吗?这有点像传送物体,可能会导致一些不现实的行为。你应该通过设置速度或施加力/脉冲来移动物体。我是通过“body.Rotation”旋转的当有用户输入的时候。我认为这是对的。但是当文章出现时,它们会从底部边界掉下来(我根本没有在迷宫中移动).当我将带有static的行删除为true时,我必须更改带有fixture的代码,但当我查看debugview fixture是否正确时,它们被设置为迷宫的边界。没问题,我添加了一个问题。好的。我不熟悉这个框架,但似乎更改该变量会直接影响到身体的私人部分,并且会胡闹h它,而不是设定速度或施加力/脉冲的预期方法。查看SetAngularVelocity。要使其围绕其中心旋转,可能需要使用旋转关节将其固定到位,或使其成为一个运动体,从而忽略重力。
public override void HandleInput(GameTime gameTime, InputState input)
{
    if (input == null)
        throw new ArgumentNullException("input");

    // Read in our gestures
    foreach (GestureSample gesture in input.Gestures)
    {
        if (gesture.GestureType == GestureType.HorizontalDrag)
        {
            if (gesture.Delta.X < 0)
            {
                _maze.Body.Rotation += 0.02f;
            }
            else if (gesture.Delta.X > 0)
            {
                _maze.Body.Rotation -= 0.02f;
            }
        }
    }