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);