2008-12-01 144 views
16

这是一个长周末假期,所以我再次得到了编码错误,并开始玩弄:2D平台游戏物理

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; 
+8

视频已关闭! – 2012-02-29 03:34:06

回答

1

这可能是一个绕道,但尝试从XNA 3.0,包含像物理和基本碰撞检测的东西Platformer入门套件。你需要改变一些东西才能在XNA之外工作,但这不是火箭科学。

XNAGS 3.0 download

2

重力很简单:

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

你要知道,大多数2D平台游戏我玩过有现实的重力。只要做一切让游戏变得有趣!

+4

从技术上讲,我认为你应该先更新位置(所以它使用前一个时间步的速度),然后更新速度。 – gnovice 2009-03-25 17:06:32

+0

@gnovice更为技术上的,请查看verlet – super 2016-01-10 14:56:41

-6

曾听说过GameMaker

+7

从中获得所有乐趣。 – FlySwat 2008-12-02 09:58:56

+0

你想用你的生活辛苦的方式做事,做我的客人 – wjhplano 2013-10-24 20:30:02

2

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

0

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

总而言之,问题的OP想要将物体从静止状态加速到最大速度。对于两种不同类型的拖拽,我经历了几次推导,以将速度建模为时间的函数。你的情况可能会略有不同,所以所使用的积分可能有不同的形式,或者需要用不同的初始条件来解决,但希望我的回答会在一些信息方面给你指出。

2

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

0

你碰到多个块的错误,你可以通过只碰撞与玩家最精确对齐的块或者具有最小偏移量来解决这个问题。一定不要只限于一个方向。实际上,块可以从马里奥的任何方向碰撞。 (上面做同样的游戏中的地面英镑,或钻旋转物)(侧面使用外壳)

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();