【问题标题】:SpriteKit - Scale in one directionSpriteKit - 向一个方向缩放
【发布时间】:2014-08-19 18:56:01
【问题描述】:

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 创建的墙壁,上端碰到屏幕边缘。线条(缩放点)在用户触摸的地方生成。所以我不希望红色框突出显示的垂直线部分在那里。

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

【问题讨论】:

    标签: ios sprite-kit scale skaction collision


    【解决方案1】:

    编辑更新问题: 听起来您可能会问“如何在单个轴上缩放一个物体,但只有当它与另一个物体碰撞时才停止在一个方向上缩放该单个轴”?仅使用动作并没有简单的方法来做到这一点,但是您可以通过操纵精灵的锚点来做一些轻微的手。或者,可能更合适的是,您应该每次触摸使用 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"];
    
    }
    

    【讨论】:

      【解决方案2】:

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

      wall.anchorPoint = CGPointMake(0, 0);    
      

      【讨论】:

      • 是的,就像我在回答中指出的那样,但是您的问题希望它们首先在两个方向上缩放,然后只在一个方向上停止,所以第二次编辑向您展示了如何这样做。
      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 2016-06-19
      • 2019-01-24
      • 2012-04-28
      • 2021-10-03
      • 2014-06-01
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多