2

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];
}

在此处输入图像描述

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

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

4

2 回答 2

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"];

}
于 2014-06-29T02:18:51.667 回答
1

像下面这样设置锚点使“线”在一个方向上缩放。

wall.anchorPoint = CGPointMake(0, 0);    
于 2014-06-29T21:34:58.700 回答