2014-01-20 24 views
2

我正在spritekit/IOS中工作,其中有一个按钮在点击时运行一个动作。按钮工作正常,但我的行动是可怕的。点击我运行此操作。创建跳转动作

actionMove=[SKAction moveTo:CGPointMake(300,300)duration:2.0]; 

然后导致我的精灵在那个位置做旋转飞行踢。我需要一点帮助,因为我试图更换y轴

_sprite.position+10 

但它给了我一个错误。 感谢

回答

3

你需要的是行动moveByX:y:duration: ...

排序的。

你可以这样做......

SKAction *rise = [SKAction moveByX:0 y:10 duration:1]; 
SKAction *fall = [SKAction moveByX:0 y:-10 duration:1]; 
SKAction *jump = [SKAction sequence:@[rise, fall]]; 

然后你可以运行在你的精灵的jump行动。

这会在1秒内将精灵向上移动10点,然后在1秒内向下移动10点。

但是,它不会看起来像一个跳跃。它不会加速或任何事情。

如果您在游戏中包含类似跳跃的内容,那么您通常会希望在地板上进行某种碰撞检测,并使用力量来移动您的精灵而不是动作。

碰撞检测方法

雪碧套件物理引擎

有你能做到这两种常规方法。最简单的(尽管最长的学习曲线)是使用SKPhysicsBodySpriteKit中内置的物理引擎。

你会为你的角色和边界SKPhysicsBody添加一个SKPhysicsBody到地板上。

然后使人物跳跃,你会使用类似...

[character.physicsBody applyImpulse:CGVectorMake(0, 1)]; 

这将适用于即时力的人物,因此空气中的“跳跃”。然后用你在重力作用下建立的物理引擎,角色会开始减速并下落,直到它再次落地。

这里有一些设置(比你想象的要少),但一旦设置完成,其余的就非常非常简单。

手动

要做到这一点是手动另一种情况。这不需要设置,只需要很多数学。它的工作方式是使用update:函数,然后每个更新周期计算角色的速度和位置,并相应地更新位置。

你真的不想这样做。

通过将SKPhysicsBody添加到需要碰撞的东西(角色和地板),然后利用重力和applyImpulse,使事情变得非常简单。它会使它更容易,它会执行得更快,它会看起来好上百万倍:D

+0

感谢您的支持帮帮我。我的小精灵和我的地板有碰撞检测。不过,正如你所提到的,这不是跳跃的最佳方式。我想我会扯掉它,然后用力。你有一个很好的链接或代码片段来演示它吗?谢谢 – Janita

+0

@ user3215538我用快速指南编辑了我的答案。 – Fogmeister

+0

这里有很多Sprite套件教程http://www.raywenderlich.com/?s=sprite+kit&cof=FORID%3A10我确定在那里有一个物理教程。 – Fogmeister

0

你去那里:

CGPoint pos = _sprite.position; 
pos.y = pos.y + 10; 
_sprite.position = pos; 
+0

我很矛盾,因为其他答案有这样一个很好的例子和有价值的信息。然而,如果问问题的人首先不能理解这个答案,那么除了通过剪切/粘贴工作以及一些摆弄之外,如果有人能够有效地运用其他答案中的任何概念,那么他的能力就会受到质疑。理解CGPoint是什么以及为什么他的尝试不起作用,应该先于任何其他解决方案。 – prototypical

+0

我明白为什么我的努力没有根据他的答案工作。然而有人也指出,这种方法不是完成这个的方法,因为我的游戏使用物理,所以我只是改变了 – Janita

+0

我个人并不理解这个问题。我以为他试图用更新循环更新角色的位置;顺便说一句,我不认为这是一个坏主意。你不需要成为一个天才做一个简单的插值。我个人认为物理对于像这样的小游戏来说是过分的(我们对此一无所知;上下文就是一切),并且它可能会出现问题。但不要相信我,阅读这篇写过“学习Cocos2D”的人的博客文章http://www.learn-cocos2d.com/2013/08/physics-engine-platformer-terrible-idea/ –

0

如果你打算使用力(和物理)来移动你的球员,那么使用冲动会给你更好的结果:

_sprite.physicsBody applyImpulse:CGVectorMake(0, <value>); 

以上取决于许多因素,包括重力值和_sprite.physicsBody的质量。试验是弄清楚在这里工作的最好方法。

0

如果你不使用物理,你可以使用followPath动作和缓动来获得有些逼真的跳跃效果(类似于cocos2d的跳转到动作)。一个简单的例子,这可以作为SKAction的类别方法实施:

+ (SKAction *)jumpWithStartPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint height:(CGFloat)height { 
    UIBezierPath *bezierPath = [[UIBezierPath alloc] init]; 
    [bezierPath moveToPoint:startPoint]; 
    CGPoint peak = CGPointMake(endPoint.x - startPoint.x, startPoint.y + height); 
    [bezierPath addCurveToPoint:endPoint controlPoint1:peak controlPoint2:peak]; 

    SKAction *jumpAction = [SKAction followPath:bezierPath.CGPath asOffset:NO orientToPath:NO duration:.5f]; 
    jumpAction.timingMode = SKActionTimingEaseIn; 
    return jumpAction; 
}