Nano Hash - криптовалюты, майнинг, программирование

Набор спрайтов SKPhysicsJoint

Я пытаюсь поэкспериментировать с системой суставов Sprite Kit. До сих пор у меня были трудности с изготовлением даже одной нити «веревки». Конечная цель состоит в том, чтобы создать что-то вроде баскетбольной сетки, где будет 1 левая веревка (вертикальная), 1 правая веревка (вертикальная) и по крайней мере 2 веревки между левой и правой веревками (горизонтально) - всего 4 веревки. . После этого выясняем, как сделать так, чтобы две горизонтальные веревки не сталкивались с объектом (пушечным ядром?), Когда он проходит через них. Кто-нибудь знает, как сделать что-то подобное? Я пробовал это в течение 2 недель, и у меня болят глаза и пальцы.


Ответы:


1

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

со скриншотом здесь https://dl.dropboxusercontent.com/s/flixgbhfk2yysr8/screenshot.jpg?dl=0

РЕДАКТИРОВАТЬ: извините за это, код теперь в obj-C

РЕДАКТИРОВАТЬ: вставьте эти методы в свой подкласс SKScene:

-(void)addBasketAtPos:(CGPoint)pos WithSize:(CGSize)size HoopThickness:(CGFloat)hoopThickness RopeThickness:(CGFloat)ropeThickness GapSize:(CGFloat)gapSize {

    int nSect=ceil(size.height/(ropeThickness*4));

    SKSpriteNode *hoop=[SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(size.width+hoopThickness, hoopThickness)];
    hoop.position=pos;
    //[self addChild:hoop];

    SKNode *lHoopEdge=[SKNode node];
    lHoopEdge.position=CGPointMake(pos.x-size.width/2, pos.y);
    lHoopEdge.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:hoopThickness/2];
    lHoopEdge.physicsBody.dynamic=false;
    lHoopEdge.physicsBody.restitution=0.9;
    [self addChild:lHoopEdge];
    SKNode *rHoopEdge=[SKNode node];
    rHoopEdge.position=CGPointMake(pos.x+size.width/2, pos.y);
    rHoopEdge.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:hoopThickness/2];
    rHoopEdge.physicsBody.dynamic=false;
    rHoopEdge.physicsBody.restitution=0.9;
    [self addChild:rHoopEdge];

    NSMutableArray *rope1=[self makeRopeAtPos:lHoopEdge.position node:lHoopEdge num: nSect gap:size.height/nSect width:ropeThickness];
    NSMutableArray *rope2=[self makeRopeAtPos:rHoopEdge.position node:lHoopEdge num: nSect gap:size.height/nSect width:ropeThickness];

    CGFloat insetStep=(size.width-gapSize)/2/nSect;
    for (int i=0;i<rope1.count;++i) {
        SKNode *a=[rope1 objectAtIndex:i];
        SKNode *b=[rope2 objectAtIndex:i];
        a.position=CGPointMake(a.position.x+i*insetStep, a.position.y);
        b.position=CGPointMake(b.position.x-i*insetStep, b.position.y);
    }

    for (int i=0;i<rope1.count;++i) {
        /*
        SKNode *n1=[rope1 objectAtIndex:i];
        SKNode *n2=[rope2 objectAtIndex:i];
        SKPhysicsJointLimit* joint=[self joinBodyA:n1.physicsBody bodyB:n2.physicsBody ropeThickness:ropeThickness];
        [self.physicsWorld addJoint:joint];
         */
        if (i>0) {
            [self.physicsWorld addJoint:[self joinBodyA:((SKNode*)[rope1 objectAtIndex:i]).physicsBody
                                                  bodyB:((SKNode*)[rope2 objectAtIndex:i-1]).physicsBody
                                          ropeThickness:ropeThickness]];
            [self.physicsWorld addJoint:[self joinBodyA:((SKNode*)[rope2 objectAtIndex:i]).physicsBody
                                                  bodyB:((SKNode*)[rope1 objectAtIndex:i-1]).physicsBody
                                          ropeThickness:ropeThickness]];
        }
        if (i==rope1.count-1) {
            [self.physicsWorld addJoint:[self joinBodyA:((SKNode*)[rope1 objectAtIndex:i]).physicsBody
                                                  bodyB:((SKNode*)[rope2 objectAtIndex:i]).physicsBody
                                          ropeThickness:ropeThickness]];
        }
    }

    [self addChild:hoop];
}

-(NSMutableArray*)makeRopeAtPos:(CGPoint)p node:(SKNode*)node num:(int)num gap:(CGFloat)gap width:(CGFloat)width {
    NSMutableArray *array=[[NSMutableArray alloc] init];
    SKNode *last=node;
    CGPoint pos=p;
    CGPoint anchor=pos;
    for (int i=0; i<num; ++i) {
        pos=CGPointMake(pos.x, pos.y-gap);
        last=[self makeRopeSegAtPos:pos prev:last anchor:anchor first:(i==0) width:width];
        anchor=pos;
        [array addObject:last];
    }
    return array;
}

-(SKNode*)makeRopeSegAtPos:(CGPoint)pos prev:(SKNode*)prev anchor:(CGPoint)anchor first:(BOOL)first width:(CGFloat)width {
    //SKNode *r=[SKNode node];
    SKSpriteNode *r=[SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(anchor.y-pos.y, width)];
    r.position=pos;
    r.anchorPoint=CGPointMake(0, 0.5);
    if (first) {
        //r.size=CGSizeMake(10, 20);
        r.constraints=@[[SKConstraint orientToPoint:anchor inNode:self offset:nil]];
    }else {
        r.constraints=@[[SKConstraint orientToNode:prev offset:nil]];
    }
    r.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:width];
    r.physicsBody.allowsRotation=NO;
    //r.physicsBody.density=0.2;
    r.physicsBody.linearDamping=0.8;
    [self addChild:r];
    SKPhysicsJointLimit *j=[SKPhysicsJointLimit jointWithBodyA:r.physicsBody bodyB:prev.physicsBody anchorA:r.position anchorB:anchor];
    [self.physicsWorld addJoint:j];
    return r;

}

-(SKPhysicsJoint*)joinBodyA:(SKPhysicsBody*)bodyA bodyB:(SKPhysicsBody*)bodyB ropeThickness:(CGFloat)ropeThickness {
SKPhysicsJointLimit *j=[SKPhysicsJointLimit jointWithBodyA:bodyA bodyB:bodyB anchorA:bodyA.node.position anchorB:bodyB.node.position];
SKSpriteNode *rope=[SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(j.maxLength, ropeThickness)];

rope.anchorPoint=CGPointMake(0, 0.5);
rope.constraints=@[[SKConstraint distance:[SKRange rangeWithUpperLimit:1] toNode:bodyA.node],[SKConstraint orientToNode:bodyB.node offset:nil]];
SKAction *keepLength=[SKAction repeatActionForever:[SKAction sequence:@[[SKAction waitForDuration:1/60],[SKAction runBlock:^{
    rope.size=CGSizeMake(sqrtf(powf(bodyA.node.position.x-bodyB.node.position.x, 2)+powf(bodyA.node.position.y-bodyB.node.position.y, 2)), rope.size.height);
}]]]];
[rope runAction:keepLength];
[self addChild:rope];
return j;

}

использовать

[self addBasketAtPos: CGPointMake(self.size.width/2, self.size.height*0.7)
            WithSize: CGSizeMake(100, 100)
       HoopThickness: 10
       RopeThickness: 5
             GapSize: 80
];

добавить корзину

см. новый скриншот здесь: https://dl.dropboxusercontent.com/s/xe07ri70rgpxp47/screenshot%202.jpg?dl=0

11.11.2014
  • Свифт-код. Сладкий! Моя первая попытка его использования. Я собираюсь сделать соединительный заголовок Objective-C, протестировать код и вернуться к вам, чтобы узнать, как это работает. 12.11.2014
  • Мне трудно внедрить ваш код Swift в мой код Objective-C. У меня есть класс MyScene: SKScene Objective-C. Я создал Bridging-Header.h для своего класса Net.swift. Net.swift содержит указанный выше код. Из-за моей некомпетентности я не знаю, как заставить 2 работать. У вас случайно не было вышеперечисленного в Objective-C? 12.11.2014
  • да, извините, я должен был заметить, что вы написали свой в obj-c, отредактируете код obj-c (я тоже не понимаю мосты) :) 12.11.2014
  • Мужик, ты чудотворец! Большое спасибо: D 12.11.2014
  • Итак, я работал с кодом, но смог отображать шары только при касании, установив для .showsFPS и т. д. значение YES. Я не был в состоянии засвидетельствовать фактическую сеть. Я также создал @property SKSpriteNode для использования вместо SKNode *hoop. Но безуспешно. Я думаю, что мне пока не суждено увидеть физическую сеть в iOS какими-то высшими силами :( 12.11.2014
  • В контроллере просмотра, когда вы настраиваете вызов сцены skView.showsPhysics = YES;, чтобы включить рисование отладки физики, чтобы вы могли видеть физические тела 13.11.2014
  • Да. Это сработало. Красиво с точки зрения механики. Сеть ведет себя лучше, чем идеально. Теперь я собираюсь работать над этим кодом, чтобы сделать его визуальным и не полагаться на showPhysics. Большое спасибо Окапи. 13.11.2014
  • Окапи, я все настроил так, как хочу, но не могли бы вы порекомендовать, как сделать веревку видимой (может быть, белого цвета)? Я пытался работать с методом makeRopeAtPos, используя SKSpriteNode, чтобы иметь возможность создавать для него цвета или текстуры, но затем, так сказать, шквал проблем возникает по ссылке кода. 13.11.2014
  • Это должно быть возможно с помощью [SKConstraint orientToNode:], я попробую. 13.11.2014
  • СПАСИБО БОЛЬШОЕ. Вы не представляете, как много значит для меня этот код! Спасибо. 14.11.2014
  • @Krekin См., что длина новой кодовой веревки теперь отрегулирована до нужного размера. 15.11.2014
  • А, понятно. Вы добавили SKAction *keepLength. Это работает хорошо. Спасибо. 16.11.2014
  • Привет, Окапи. В вашем коде @[[SKConstraint orientToNode:prev offset:nil]]; привык работать. Везде работало смещение: помещалось в код. Теперь этого не происходит после обновления iOS 9. Я попытался изменить nil в смещении на что-то другое, например: offset:[SKRange rangeWithConstantValue:0]]]; но игра все равно вылетает если сеть присутствует в игре. Есть рекомендации что делать? 19.09.2015
  • Обновлен код в соответствии с текущими стандартами — см. выше. Теперь все работает. 27.03.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..