4

我正在使用精灵套件制作游戏,现在我想知道让对象“跳跃”的最佳方法是什么。因此它将以几个像素垂直启动。这是我要跳转的对象的代码:

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"bal.png"];
sprite.position = CGPointMake(self.frame.size.width/4 + arc4random() % ((int)self.frame.size.width/2), (self.frame.size.height/2 + arc4random() % ((int)self.frame.size.height/2)));
sprite.color = [self randomColor];
sprite.colorBlendFactor = 1.0;
sprite.xScale = 0.2;
sprite.yScale = 0.2;
[self addChild:sprite];
sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2];
self.physicsWorld.gravity = CGVectorMake(0.0f, -4.0f);
4

2 回答 2

7

我会尽量避免直接设置物体的速度。相反,我会对物体施加力和冲动。在大多数情况下,这会更好,因为它不会破坏物理模拟。例如,这就是我如何让我的对象跳转:

- (void) jump:(SKSpriteNode*)obj
{
    if (obj.isTouchingGround)
    {
        CGFloat impulseX = 0.0f;
        CGFloat impulseY = 25.0f;           
        [object.physicsBody applyImpulse:CGVectorMake(impulseX, impulseY) atPoint:obj.position];   
    }
}
于 2014-03-21T20:13:16.153 回答
4

通过更改与精灵关联的velocity属性,为身体提供速度。physicsBody

具体来说,您需要添加

sprite.physicsBody.velocity = CGVectorMake(vx,vy);

编辑:如果您想通过操作来做到这一点,请使用以下两个类方法之一SKAction

+ (SKAction *)followPath:(CGPathRef)path duration:(NSTimeInterval)sec;
+ (SKAction *)moveByX:(CGFloat)deltaX y:(CGFloat)deltaY duration:(NSTimeInterval)sec;

但是,使用其中任何一个都需要您根据速度矢量计算东西并自己处理重力(以提供合适的deltaXdeltaY/或正确的path),这是非常不必要的。为什么不直接提及速度并让其SpriteKit为您解决呢?

于 2013-10-17T03:02:12.667 回答