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;
}
}
}