SpriteKit - масштаб в одном направлении

Как заставить объект расти в одном направлении - это 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];
}

Как я хочу, чтобы это работало: Касание 1 делает горизонтальную линию от точки, которая смещается в обоих направлениях по оси X, пока оба конца не коснутся края экрана. Затем касание 2 создаст точку, которая будет стрелять в обоих направлениях по оси y, пока нижний конец не коснется стены, созданной касанием 1, а верхний край не коснется края экрана. Линии (масштабированные точки) генерируются там, где пользователь касается. Поэтому я не хочу, чтобы часть вертикальной линии, выделенная красной рамкой, была там.

Масштабирование в одном направлении - это всего лишь решение, которое я вижу для этой проблемы, если есть лучший способ решить эту проблему, я непременно попробую это другое решение.

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

}

Установка точки привязки, как показано ниже, делала масштаб "линий" в одном направлении.

wall.anchorPoint = CGPointMake(0, 0);    
Другие вопросы по тегам