SpriteKit - 向一个方向缩放

时间:2014-06-29 02:10:34

标签: ios sprite-kit scale skaction collision

如何使对象在一个方向上成长是SpriteKit?

最终,我希望在用户触摸的位置插入一个节点,并使其具有线刻度的每一端,直到它击中同一类别中的另一个对象或触及屏幕边缘。我知道如何让它在轴上缩放,然后我可以在检测到一次碰撞后取消缩放,但我希望两个方向都能独立缩放,直到每个方向发生碰撞。我是SpriteKit的新手,所以我的搜索可能使用错误的条款,但我找不到任何相关内容。

代码添加"墙"用户触摸的地方

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch * touch in touches) {
        CGPoint location = [touch locationInNode:self];
        [self addWallAtLocation:location];
    }
}

-(void)addWallAtLocation:(CGPoint)location{

    int odd_or_even = arc4random() % 2;

    SKSpriteNode * wall = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor]     size:CGSizeMake(2, 2)];
    wall.position = location;

    wall.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(2, 2)];
    wall.physicsBody.dynamic = NO;
    wall.physicsBody.categoryBitMask = wallCategory;
    wall.physicsBody.contactTestBitMask = ballCategory;

    [self addChild:wall];

    SKAction * grow;

    if (odd_or_even == 1) {
        grow = [SKAction scaleYTo:300 duration:2];
    } else {
        grow = [SKAction scaleXTo:300 duration:2];
    }

    [wall runAction:grow];
}

enter image description here

我希望它如何工作: 触摸1从在x轴上向两个方向射出的点开始水平线,直到两端都到达屏幕边缘。触摸2然后将创建在y轴上沿两个方向射出的点,直到下端撞击由触摸1创建的墙并且上端撞击屏幕的边缘。在用户触摸的地方生成线(缩放点)。所以我不希望红框突出显示的垂直线部分在那里。

向一个方向扩展只是我看到这个问题的解决方案,如果有更好的解决方法,我一定会尝试其他解决方案。

2 个答案:

答案 0 :(得分:2)

编辑更新的问题: 听起来你可能会问如何在单个轴上缩放一个东西,但是只有当它与另一个东西碰撞时才停止在一个方向上缩放该单个轴"?使用动作并不是一种简单的方法,但是你可以通过操纵精灵的锚点来做一些轻微的操作。或者,更合适的是,你应该每次触摸使用2个精灵,一个动作向北发送一个,另一个动作向另一个向南发送。也许是这样的:

-(void)someMethod{

    SKSpriteNode *touch2TopPart = [SKSpriteNode node];
    SKSpriteNode *touch2BottomPart = [SKSpriteNode node];
    touch2TopPart.anchorPoint = CGPointMake(.5, 0);
    touch2BottomPart.anchorPoint = CGPointMake(.5, 1);

    touch2TopPart.name = @"touch2TopPart";
    touch2BottomPart.name = @"touch2BottomPart";

    SKAction *sendTopPartUp = [SKAction scaleYTo:100 duration:2];
    SKAction *sendBottomPartDown = [SKAction scaleYTo:100 duration:2];

    [touch2TopPart runAction:sendTopPartUp withKey:@"sendTopPartUp"];
    [touch2BottomPart runAction:sendBottomPartDown withKey:@"sendBottomPartDown"];

}

-(void)whateverTheCollisonMethodIsCalledBetweenThingAandThingB
{
    SKSpriteNode *somePartMovingInASingleDirection = thingAOrWhatever;

    [somePartMovingInASingleDirection removeAllActions];

}

---原始答案 我不确定你要问的是什么,但是你已经有了在X或Y中进行缩放的操作,所以这里是在模拟物理之后删除其中一个动作的简单用法。您可能正在寻找如何检测两个实体之间的特定碰撞,但我无法确定。

-(void)someMethod{

    SKSpriteNode *thisSprite = [SKSpriteNode node];

    thisSprite.name = @"spriteRunningActions";

    SKAction *growX = [SKAction scaleXTo:100 duration:2];
    SKAction *growY = [SKAction scaleYTo:100 duration:2];

    [thisSprite runAction:growX withKey:@"actionCurrentlyScalingX"];
    [thisSprite runAction:growY withKey:@"actionCurrentlyScalingY"];

}

-(void)didSimulatePhysics
{
    SKSpriteNode *thatSprite = (SKSpriteNode*)[self childNodeWithName:@"spriteRunningActions"];

    //stop a given action
    [thatSprite removeActionForKey:@"actionCurrentScalingX"];
    [thatSprite removeActionForKey:@"actionCurrentScalingY"];

}

答案 1 :(得分:1)

如下所示设置锚点使“线”在一个方向上缩放。

wall.anchorPoint = CGPointMake(0, 0);