创建一个Jump动作

时间:2014-01-20 15:03:07

标签: ios7 sprite-kit

我在spritekit / IOS中工作,我有一个按钮,点击它时会运行一个动作。按钮工作正常,但我的行动很糟糕。点击我运行此操作。

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

然后导致我的精灵在该位置上进行旋转飞踢。我需要一点帮助,因为我尝试用

替换y轴
_sprite.position+10 

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

4 个答案:

答案 0 :(得分: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点。

然而,它看起来不像跳跃。它不会加速或任何事情。

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

碰撞检测方法

Sprite Kit物理引擎

通常有两种方法可以做到这一点。最简单(尽管最长的学习曲线)是在SKPhysicsBody中使用SpriteKit和内置物理引擎。

你可以在你的角色和边界SKPhysicsBody上添加SKPhysicsBody

然后为了让角色跳跃,你会使用类似......

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

这将立即对角色施加力量,使其“跳跃”在空中。然后使用物理引擎,你已经建立了重力,所以角色将开始减速并下降直到它再次撞到地板。

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

手动

手动完成是另一种情况。这不需要设置,但需要很多数学。这种方法的工作方式是使用update:函数,然后每个更新周期计算字符的速度和位置,并相应地更新位置。

你真的不想这样做。

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

答案 1 :(得分:0)

你去了:

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

答案 2 :(得分:0)

如果您要使用力(和物理)来移动您的玩家,那么使用冲动会给您带来更好的结果:

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

以上内容取决于许多因素,包括重力值和_sprite.physicsBody的质量。试验是弄清楚这里有用的最佳方法。

答案 3 :(得分:0)

如果你没有使用物理,你可以使用followPath动作和缓和来获得一些有点逼真的跳跃效果(类似于cocos2d&#39; s跳转到动作)。一个简单的例子,说明如何将其作为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;
}