我正在spritekit/IOS中工作,其中有一个按钮在点击时运行一个动作。按钮工作正常,但我的行动是可怕的。点击我运行此操作。创建跳转动作
actionMove=[SKAction moveTo:CGPointMake(300,300)duration:2.0];
然后导致我的精灵在那个位置做旋转飞行踢。我需要一点帮助,因为我试图更换y轴
_sprite.position+10
但它给了我一个错误。 感谢
我正在spritekit/IOS中工作,其中有一个按钮在点击时运行一个动作。按钮工作正常,但我的行动是可怕的。点击我运行此操作。创建跳转动作
actionMove=[SKAction moveTo:CGPointMake(300,300)duration:2.0];
然后导致我的精灵在那个位置做旋转飞行踢。我需要一点帮助,因为我试图更换y轴
_sprite.position+10
但它给了我一个错误。 感谢
你需要的是行动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点。
但是,它不会看起来像一个跳跃。它不会加速或任何事情。
如果您在游戏中包含类似跳跃的内容,那么您通常会希望在地板上进行某种碰撞检测,并使用力量来移动您的精灵而不是动作。
碰撞检测方法
雪碧套件物理引擎
有你能做到这两种常规方法。最简单的(尽管最长的学习曲线)是使用SKPhysicsBody
和SpriteKit
中内置的物理引擎。
你会为你的角色和边界SKPhysicsBody添加一个SKPhysicsBody
到地板上。
然后使人物跳跃,你会使用类似...
[character.physicsBody applyImpulse:CGVectorMake(0, 1)];
这将适用于即时力的人物,因此空气中的“跳跃”。然后用你在重力作用下建立的物理引擎,角色会开始减速并下落,直到它再次落地。
这里有一些设置(比你想象的要少),但一旦设置完成,其余的就非常非常简单。
手动
要做到这一点是手动另一种情况。这不需要设置,只需要很多数学。它的工作方式是使用update:
函数,然后每个更新周期计算角色的速度和位置,并相应地更新位置。
你真的不想这样做。
通过将SKPhysicsBody
添加到需要碰撞的东西(角色和地板),然后利用重力和applyImpulse
,使事情变得非常简单。它会使它更容易,它会执行得更快,它会看起来好上百万倍:D
你去那里:
CGPoint pos = _sprite.position;
pos.y = pos.y + 10;
_sprite.position = pos;
我很矛盾,因为其他答案有这样一个很好的例子和有价值的信息。然而,如果问问题的人首先不能理解这个答案,那么除了通过剪切/粘贴工作以及一些摆弄之外,如果有人能够有效地运用其他答案中的任何概念,那么他的能力就会受到质疑。理解CGPoint是什么以及为什么他的尝试不起作用,应该先于任何其他解决方案。 – prototypical
我明白为什么我的努力没有根据他的答案工作。然而有人也指出,这种方法不是完成这个的方法,因为我的游戏使用物理,所以我只是改变了 – Janita
我个人并不理解这个问题。我以为他试图用更新循环更新角色的位置;顺便说一句,我不认为这是一个坏主意。你不需要成为一个天才做一个简单的插值。我个人认为物理对于像这样的小游戏来说是过分的(我们对此一无所知;上下文就是一切),并且它可能会出现问题。但不要相信我,阅读这篇写过“学习Cocos2D”的人的博客文章http://www.learn-cocos2d.com/2013/08/physics-engine-platformer-terrible-idea/ –
如果你打算使用力(和物理)来移动你的球员,那么使用冲动会给你更好的结果:
_sprite.physicsBody applyImpulse:CGVectorMake(0, <value>);
以上取决于许多因素,包括重力值和_sprite.physicsBody的质量。试验是弄清楚在这里工作的最好方法。
如果你不使用物理,你可以使用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;
}
感谢您的支持帮帮我。我的小精灵和我的地板有碰撞检测。不过,正如你所提到的,这不是跳跃的最佳方式。我想我会扯掉它,然后用力。你有一个很好的链接或代码片段来演示它吗?谢谢 – Janita
@ user3215538我用快速指南编辑了我的答案。 – Fogmeister
这里有很多Sprite套件教程http://www.raywenderlich.com/?s=sprite+kit&cof=FORID%3A10我确定在那里有一个物理教程。 – Fogmeister