0

Хорошо, у меня было несколько вопросов, которые теперь плавают вокруг stackoverflow, и большинство из них связаны с этим вопросом. Я пытаюсь получить его сам, и у меня есть пара раз, но результат никогда не был тем, чего я ожидал. Я пытаюсь создать цепочку, которую может бросить мой спрайт.Как сделать удлиняющую цепочку

До сих пор то, что я сделал, бросает провод крюка из центра спрайта наружу. Как только он перемещается на 10 пикселей от позиции спрайтов, он генерирует другое звено в цепочке. Затем цепь поворачивается в соответствии с вращением цепей и прикрепляется к ней с помощью штыря. Это действительно работает довольно хорошо. Единственная проблема заключается в том, что он работает, когда я устанавливаю скорость мировой физики до 0,01. Если я верну его в обычную физику, он выдает ведущее звено в цепочке, но в основном пропускает все остальное. До этого я попытался скрыть ссылку в физическом теле и вызвал didEndContact, чтобы прикрепить другие ссылки, но это не сработало почти так же хорошо.

Есть ли у кого-нибудь идеи о том, как я могу это сделать? Я просто нуждаюсь в цепи, чтобы простираться от положения спрайтов, до максимальной длины, а затем отступать. Я понятия не имел, что это будет сложно. Заранее благодарю за вашу помощь, если вы хотите, чтобы я опубликовал свой код, я был бы рад, но, учитывая, что я не думаю, что это сработает, я еще не добавил его. Еще раз благодарю вас за то, что за несколько недель я пробовал свой мозг, и мне кажется, что я никуда не ухожу, хотя я узнал много бесценных концепций, которые я глубоко признателен сообществу stackoverflow.

+0

Рассматривали ли вы линию, которая простирается со временем от спрайта до места назначения? – 0x141E

+0

Я бы хотел, чтобы физика веревки была реализована с помощью цепочки, но если это единственный способ, которым это может работать, мне придется ее взять. Смогу ли я подключить физическое тело к расширяющейся линии? Мне так нужно было бы воссоздать линию и ее физическое тело в каждом кадре в соответствии с увеличением его длины? – Ryoku

+0

Я создал цепи, связанные с SKPhysicsJointPins, но никогда не был доволен тем, как он взаимодействовал с другими физическими телами. – 0x141E

ответ

1

Это простой пример того, как нарисовать линию, которая постоянно обновляется ...

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 

    startingPoint = positionInScene; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 

    // Remove temporary line if it exist 
    [lineNode removeFromParent]; 

    CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
    CGPathMoveToPoint(pathToDraw, NULL, startingPoint.x, startingPoint.y); 
    CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y); 

    lineNode = [SKShapeNode node]; 
    lineNode.path = pathToDraw; 
    CGPathRelease(pathToDraw); 
    lineNode.strokeColor = [SKColor whiteColor]; 
    lineNode.lineWidth = 1; 
    [self addChild:lineNode]; 
} 

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    UITouch* touch = [touches anyObject]; 
    CGPoint positionInScene = [touch locationInNode:self]; 

    // Remove temporary line 
    [lineNode removeFromParent]; 

    CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
    CGPathMoveToPoint(pathToDraw, NULL, startingPoint.x, startingPoint.y); 
    CGPathAddLineToPoint(pathToDraw, NULL, positionInScene.x, positionInScene.y); 

    SKShapeNode *finalLineNode = [SKShapeNode node]; 
    finalLineNode.path = pathToDraw; 
    CGPathRelease(pathToDraw); 
    finalLineNode.strokeColor = [SKColor redColor]; 
    finalLineNode.lineWidth = 1; 
    [self addChild:finalLineNode]; 
} 

EDIT: Этот метод определяет, когда линия, определяемая точками начала и конца, пересекается с одним или несколькими физическими телами.

- (void) rotateNodesAlongRayStart:(CGPoint)start end:(CGPoint)end 
{ 
    [self.physicsWorld enumerateBodiesAlongRayStart:start end:end 
        usingBlock:^(SKPhysicsBody *body, CGPoint point, 
            CGVector normal, BOOL *stop) 
    { 
     SKNode *node = body.node; 
     [node runAction:[SKAction rotateByAngle:M_PI*2 duration:3]]; 
    }]; 
} 
+0

Это огромное спасибо! Чтобы цепь была эффективной, хотя мне нужно будет обнаружить столкновения с ней. Мне также придется указывать столкновения для «головы» цепочки с другими объектами. Должен ли я сделать это, связав физическое тело с линией (чтобы обнаружить столкновения по всему телу), а затем добавить дополнительный узел спереди с собственным телом фиаков (чтобы представить голову). Или вы думаете, что это даст непредсказуемые результаты физики и/или снизит частоту кадров? – Ryoku

+0

Это зависит от того, что вы пытаетесь имитировать. Вы могли бы на отдельном спрайте во главе линии и обнаружить столкновения с этим. Почему вам нужно обнаруживать, когда линия сталкивается с другими физическими телами? – 0x141E

+0

Я хочу, чтобы строка разорвалась, если она вступает в контакт с определенными объектами. – Ryoku

Смежные вопросы