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

введите здесь описание изображения

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

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


person KevinF    schedule 29.06.2014    source источник


Ответы (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"];

}
person Cooper Buckingham    schedule 29.06.2014

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

wall.anchorPoint = CGPointMake(0, 0);    
person KevinF    schedule 29.06.2014
comment
Да, точно так же, как я указал, что они будут в моем ответе, но ваш вопрос хотел, чтобы они сначала масштабировались в обоих направлениях, а затем останавливались только в одном направлении, поэтому второе редактирование показало вам, как это сделать. - person Cooper Buckingham; 30.06.2014