2d Platformer物理

时间:2008-12-01 23:22:49

标签: physics tile-engine

这是一个漫长的假期周末,所以我再次得到了编码错误并开始玩游戏:

Mario http://gfilter.net/junk/tileengine.jpg

我写了一个基本的磁贴引擎,但之前从未尝试过这个,我真的很难处理精灵碰撞检测并实现真实的重力物理。

对于任何其他游戏爱好作家,你能否指出一些关于最佳方法的演练?

更新

我以为我会分享进度报告:

http://www.youtube.com/watch?v=-RKNQ2UiiLY< - 游戏在行动

它仍然是真正的马车,但碰撞检测主要是工作,我已经开始研究其他一些功能(例如撞击块(注意错误)并与敌人交互)。

马里奥仍像他在月球上一样走路,我正在使用这些常数,有什么建议可以调整它们以获得更真实的效果吗?

    const float AirDrag = 1.00f;
    const float GroundFriction = .97f;
    const float Gravity = 0.8f;

9 个答案:

答案 0 :(得分:5)

下载FarseerPhysics引擎,了解它是如何工作的http://www.codeplex.com/FarseerPhysics我认为这是XNA / Silverlight最好的东西!

答案 1 :(得分:3)

重力很容易:

const gravity = ... ; // pixels per timestep (eg. video frame) squared
// while in freefall, each timestep:
y_velocity += gravity;
y_pos += y_velocity;

请注意,我玩过的大多数2D平台游戏具有逼真的引力。做任何让游戏变得有趣的事情!

答案 2 :(得分:2)

jnrdev可能会有所帮助。它涵盖了瓷砖碰撞/响应和斜坡。这不是我见过的最好的代码,但它完成了工作。

答案 3 :(得分:2)

http://www.metanetsoftware.com/technique/tutorialA.htmlhttp://www.metanetsoftware.com/technique/tutorialB.html有几个非常有用的二维平台游戏教程。我认为他们已经被其他人引用了SO。它们涵盖了碰撞检测和响应,光线投射,各种优化技术等,并且对于那些在数学上不那么倾向的人(比如我),对它背后的理论有很好的解释。它并没有像刚体动力学这样的东西,但我认为你不需要你正在编写的游戏类型(尽管如果你添加这种东西当然会很酷.. 。)

答案 4 :(得分:1)

这可能是一个绕道而行,但请尝试使用XNA 3.0中的Platformer入门套件,其中包含物理和基本碰撞检测等内容。你需要改变一些东西,让它在XNA之外工作,但这不是火箭科学。

XNAGS 3.0 download

答案 5 :(得分:0)

我不知道你在物理模型中使用了什么,但最近在fluid drag中解决了使用another SO question的物理模型。我不会重复我在答案中给出的所有内容,我只会link to it

总而言之,问题的OP希望将对象从静止加速到最大速度。我对两种不同类型的阻力进行了一些推导,将速度建模作为时间的函数。您的情况可能略有不同,因此使用的积分可能有不同的形式或需要在不同的初始条件下解决,但希望我的回答将指向您的信息方向。

答案 6 :(得分:0)

你的错误是多个块被碰撞,你可以通过仅碰撞与playerprite最对齐的块,或者具有最小的偏移量来解决这个问题。一定不要将其限制在一个方向。在马里奥,实际上可以从任何方向碰撞阻挡。 (通过在相同的游戏中做一个地面磅,或钻 - 旋转的东西)(使用壳的侧面)

答案 7 :(得分:0)

    UIGraphicsBeginImageContext(images.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIColor *color = [UIColor whiteColor];
    [color setFill];

    CGContextTranslateCTM(context, 1, images.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextSetBlendMode(context, kCGBlendModeDestinationOver);
    CGRect rect = CGRectMake(0.0, 0.0, images.size.width, images.size.height);
    CGContextDrawImage(context, rect, images.CGImage);
    CGContextClipToMask(context, rect, images.CGImage);
    CGContextAddRect(context, rect);
    CGContextDrawPath(context, kCGPathFill);
    images = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

答案 8 :(得分:-6)

有没有听说过GameMaker