是否有一个tutotial或帮助文件,适合初学c#程序员使用.
我正在开始游戏,我正在使用Farseer作为物理引擎.
我已经设置了几个用作地形图块的框和一个用作播放器的框.这两者之间的碰撞非常奇怪,当它不是"直接"撞击时它们相交并滑动.
以下是发生了什么的GIF:http://i.imgur.com/HR0J0D3.gifv
以下是片段:
//Creating the body
PhysBody = BodyFactory.CreateRectangle(
Transform.World.PhysWorld,
ConvertUnits.ToSimUnits(Width * Transform.Scale),
ConvertUnits.ToSimUnits(Height * Transform.Scale),
5,
ConvertUnits.ToSimUnits(Transform.Position.ToVector2()));
//The tiles are static, the player is not
PhysBody.BodyType = Static ? BodyType.Static : BodyType.Dynamic;
//Drawing the test rectangles
ShapeRenderer.Instance.DrawRectangle(
sb,
ConvertUnits.ToDisplayUnits(PhysBody.Position).ToVector2(),
new Size2((int)(Width * Transform.Scale), (int)(Height * Transform.Scale)),
Color.White);
Run Code Online (Sandbox Code Playgroud)
我不认为其余的很重要,我所做的就是创造一个9.8重力的世界.
我也尝试过不使用Transform.Scale并且在播放器下方只有一个框,问题仍然存在.
我正在使用的图形引擎是紫外线
我有一个长方体,从45度角的佳能射出.身体也以45度角向上旋转,我已将质量设定在身体的前部.
然而,身体在空气中上升,当身体回到地面时,它不会旋转.有没有办法让大众方面先下来?
我的现实世界的例子是,扔一个带有绳子的网球.目前,当重力发挥作用时,弦不会落在球后面.
这是我的'球'
Body = BodyFactory.CreateRectangle(world, ConvertUnits.ToSimUnits(texture.Width), ConvertUnits.ToSimUnits(texture.Height),100f, postition, this);
Body.Mass = 1;
Body.LocalCenter = new Vector2(ConvertUnits.ToSimUnits(Texture.Width), ConvertUnits.ToSimUnits(Texture.Height / 2));
Body.UserData = this;
Body.BodyType = BodyType.Dynamic;
Body.CollisionCategories = Category.All;
Body.CollidesWith = Category.All;
Body.IgnoreGravity = false;
float ang = BarrelJoint.JointAngle;
Body.Rotation = ang;
Run Code Online (Sandbox Code Playgroud)
然后我这样做解雇它:
Body.ApplyLinearImpulse(new Vector2((float)Math.Cos(ang) * 100, (float)Math.Sin(ang) * 100));
Run Code Online (Sandbox Code Playgroud)
我猜我有一些设置或计算我忘了.
其中哪一个更适合自上而下的射击游戏?
我听说Box2D表现得更快,但我也注意到它缺乏对XNA的更广泛的社区支持(它似乎用于闪存 - 出于我不知道的原因).
然而,Farseer是为XNA而构建的,似乎适合它并且表现非常好.在我看来,Farseer的优点还在于它干净,易于使用的API(它也非常适合我的游戏引擎结构).但是我很害怕如果我使用它会有一些缺点(子弹和高速机体?奇怪的不是数字崩溃?)
总的来说,如果您指出哪一个适合更好的XNA/PC开发,我将不胜感激.
我需要这个的原因:
我现在应该得到你的意见吗?请保持直截了当告诉我,我使用Farseer而不是Box2D做了错误的步骤吗?(我必须在等待答案时开始工作.)
提前致谢
我目前正在使用Farseer Physics库在XNA中试验一些物理玩具,但我的问题不是特定于XNA或Farseer - 而是任何2D物理库.
我想添加"类似火箭"的运动(我说火箭就像它不必是火箭一样 - 它可能是水面上的飞机或船只或任何类似的情况)我的2D场景中的某些对象.我知道如何使用运动学模拟实现这一点,但我想使用动态模拟(即随时间推移施加力)来实现它.我对如何实现这一点感到很遗憾.
为了简化操作,我不需要动力学来旋转几何体,只是为了影响身体的速度.我正在使用一个设置为不在Farseer中旋转的圆几何,所以我只关心对象的速度.
我甚至不确定最好的抽象应该是什么.从概念上讲,我有身体当前移动的方向(单位矢量),我希望它去的方向,以及表示我希望它改变方向的速度的值,同时保持速度相对恒定(小的变化是可接受的).
我可以直接使用这种抽象,或使用类似"舵"值的东西来控制物体改变方向的速度(顺时针或逆时针).
我应该用什么样的力量来模拟我正在寻找的运动?请记住,我也希望能够在飞行中调整火箭的"推力".
编辑:我看到它的方式,并纠正我,如果我错了,你有两种力量(暂时忽略主推力):
1)你有一个静态的"鳍",总是指向与身体相同的方向.如果主体旋转使得翅片不与运动方向对齐,则空气阻力将沿着翅片的长度施加力,与运动方向和翅片之间的角度成比例.
2)你有一个"舵",它可以在指定的范围内自由旋转,这个范围与身体的质心相距一定距离(在这种情况下,我们有一个圆圈).同样,当该平面不平行于运动方向时,空气阻力沿着方向舵的长度引起比例力.
我的问题是,不同的说法,我如何计算空气阻力对鳍和方向舵的这些比例力?
编辑:作为参考,这里是我编写的一些代码来测试接受的答案:
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(string[] args)
{
float dc = 0.001f;
float lc = 0.025f;
float angle = MathHelper.ToRadians(45);
Vector2 vel = new Vector2(1, 0);
Vector2 pos = new Vector2(0, 0);
for (int i = 0; i < 200; i++)
{
Vector2 drag = vel * angle * dc;
Vector2 sideForce = angle * …
Run Code Online (Sandbox Code Playgroud) 我现在在我的游戏中有这个工作正常(ish),但我在数学方面并不出色.当两个原发性物质发生碰撞时,如果施加于原色的力超过设定的阈值,我希望它们粉碎成微小的碎片.我目前的碰撞事件处理程序看起来像这样.
public bool Collision(Fixture fixtureA, Fixture fixtureB, Manifold manifold)
{
Vector2 position = manifold.LocalNormal;
float angle = (float)Math.Atan2(position.Y, position.X);
Vector2 force = Vector2.Zero;
if (angle < 0)
force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X), (float)Math.Sin(MathHelper.TwoPi + angle) * fixtureA.Body.LinearVelocity.Y);
else
force = new Vector2((float)(Math.Cos(angle) * fixtureA.Body.LinearVelocity.X), (float)Math.Sin(MathHelper.TwoPi - angle) * fixtureA.Body.LinearVelocity.Y);
double XForce = Math.Sqrt(force.X * force.X);
double YForce = Math.Sqrt(force.Y * force.Y);
double totalForce = XForce + YForce;
if ((Breakable) && (totalForce > BreakForce))
{
Breakable = false;
Active = …
Run Code Online (Sandbox Code Playgroud) 我已成功使用Farseer使用XNA开发我的一款游戏.游戏就像Windows和WP7中的魅力一样.我目前正致力于使用Monotouch和Monogame在IOS中移植我的游戏.我已成功编译和使用Farseer,而不是我的游戏的第一个版本移植到Monotouch和Monogame.一切都很好,除了表演.iPhone设备上的游戏运行速度要慢得多.我做了一些代码调查,似乎主要的瓶颈是Farseer.当它需要连接一个固定装置(圆圈)来管理超过5-6个实体时,它变得非常慢.
阅读文档我注意到要调整Farseer我可以更改Setting static class中的值:
性能
为了充分利用引擎,您应该尝试遵循以下指南:
启用睡眠 睡眠使您可以拥有世界上大量的身体.它还可以增加发动机的稳定性,因为一堆物体中的小运动不会在堆叠中扩散.睡眠的身体几乎没有头顶,因此建议启用它.
禁用CCD 连续碰撞检测可防止隧道效应,但会降低性能.如果你没有隧道问题,你应该一起禁用CCD.
最小化位置和速度迭代 的次数大量的迭代使得引擎以性能为代价更加稳定.您应该调整值以适合您的游戏.
坏消息是如果我改变那个类的任何值,似乎什么也没发生.我尝试更改值如下:
EnableDiagnostics = false
VelocityIterations = 6
PositionIterations = 2
ContinuousPhysics = false
Run Code Online (Sandbox Code Playgroud)
我也尝试使用较低的值,如VelocityIterations = 1,但似乎没有任何改变....
任何人都已更改设置类值以提高性能?
我正在开发一个wp7游戏,其中玩家在程序中绘制线条并且球从它们反弹.我正在使用XNA和farseer物理.用户绘制直线,然后让程序将其转换为物理对象或至少是vector2s列表的最佳方法是什么?我已经尝试创建一个TouchLocations列表,但是如果用户没有画得很慢,就像我附上的图片一样,它会变得不稳定.有什么建议?谢谢 http://img829.imageshack.us/img829/3985/capturehbn.png
这是一些代码:我正在使用gamestatemanagement示例,这是在HandleInput方法中
foreach (TouchLocation t in input.TouchState) {
pathManager.Update(gameTime, t.Position);
}
Run Code Online (Sandbox Code Playgroud)
pathManager类管理路径类的集合,这些路径类是可绘制的物理对象.这是pathManager.Update
public void Update(GameTime gameTime, Vector2 touchPosition) {
paths.Add(new Path(world,texture, new Vector2(5,5) ,0.1f));
paths[paths.Count-1].Position = touchPosition;
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在正在做的事情,我愿意把它扔掉.您认为每个触摸位置都有一个5x5的矩形会破坏性能,但使用farseer我没有看到任何掉落,即使是大多数全屏.但是,如果快速绘制线,则此系统根本不会创建平滑线.
我怀疑这有什么帮助,但这里是Path构造函数.
public Path(World world, Texture2D texture, Vector2 size, float mass) {
this.Size = size;
this.texture = texture;
body = BodyFactory.CreateRectangle(world, size.X * pixelToUnit, size.Y * pixelToUnit, 1);
body.BodyType = BodyType.Static;
body.Restitution = 1f;
body.Friction = 0;
body.Friction = 10;
}
Run Code Online (Sandbox Code Playgroud) 我正在制作一个太空射击游戏,它发生在一个大的地牢里,它由大的矩形组成,用来定义墙壁.使用Farseer Physics对游戏中的所有内容进行物理模拟.但是有一个问题:我希望地牢看起来足够大,但这需要我的网格中至少有80x80个矩形,这意味着在最坏的情况下,我有6400个物理模拟的物体,这不完全是性能友好,你可以猜到.
我的临时解决方案是在垂直切片中划分网格,这样,对于每一列,使用布尔添加操作添加所有矩形,然后使用生成的凹多边形创建一个主体.它会稍微提高性能,但是多边形容易陷入混乱,变得不存在,阻塞通常应该可以遍历的方式甚至变得无效并导致Farseer崩溃.
我一直在考虑制作某种算法,以某种方式找到最大的墙壁区域,并将它们合并为一个大矩形,并继续为较小的矩形做这个,直到所有的孔都被填满,但我不知道如何实现这个.这似乎是一个完美的解决方案,因为它解决了性能问题以及我现在所拥有的凹形多边形混乱.有没有人知道如何实现这样的东西?
它不是完全停止使用物理引擎的解决方案,因为我游戏中的很多东西都依赖于它.
编辑:这是一个关于身体现在如何看起来的一个小例子:(每个数字都是一个身体)
这就是我希望他们成为的样子:
目前我正在开发一个使用物理引擎的简单游戏(Farseer for XNA).
我想问一下如何制作这个角色让他可以在地面上行走,在平台上跳跃而不会自行旋转.
因为我需要更新身体位置和旋转,因为它是一个物理对象,所以它会像通常那样自行旋转.
任何人都知道如何解决它?
farseer ×10
c# ×7
xna ×5
physics ×4
game-physics ×2
.net-3.5 ×1
2d ×1
box2d ×1
iphone ×1
monogame ×1
silverlight ×1
xamarin.ios ×1
xna-4.0 ×1