определить положение экрана на двух узлах

Сейчас я делаю копию Flappy Bird. Расслабьтесь, это только для меня и обучающей части, я не собираюсь ее публиковать, так что не ненавидьте.

Птица заблокирована в:

self.size.width/3

Трубы генерируются следующим образом:

- (void)generatePipes {
    for (NSInteger i = 0; i < 3; i++) {
        pipeNode = [SKNode node];

        [pipeNode setName:@"pipe"];
        [pipeNode setPosition:CGPointMake(self.size.width + 100.0 + (200.0 * i), 0.0)];

        [self addChild:pipeNode];

       **BLABLABLA. Some code**

        [pipeTop setPosition:CGPointMake(0.0, arc4random_uniform(250) + 460.0)];
        [pipeBottom setPosition:CGPointMake(0.0, pipeTop.position.y - (550.0 + arc4random_uniform(10)))];

        [pipeTop setPhysicsBody:[SKPhysicsBody bodyWithRectangleOfSize:pipeTop.size]];
        [pipeBottom setPhysicsBody:[SKPhysicsBody bodyWithRectangleOfSize:pipeBottom.size]];

        [pipeTop.physicsBody setDynamic:NO];
        [pipeBottom.physicsBody setDynamic:NO];

        pipeTop.physicsBody.categoryBitMask = blockBitMask;
        pipeBottom.physicsBody.categoryBitMask = blockBitMask;
        pipeNode.physicsBody.categoryBitMask = blockBitMask;

        [pipeNode addChild:pipeTop];
        //[pipeTop attachDebugRectWithSize:pipeTop.size];
        //[pipeBottom attachDebugRectWithSize:pipeBottom.size];
        [pipeNode addChild:pipeBottom];
    }
}

Это единственное, над чем я немного поработал, и да, я новичок в разработке игр. FirstDistance — это расстояние до прибытия первой трубы:

        firstDistance += -moveAmount.x;

    if(touchBegan > 0 && firstDistance > (self.size.width -(self.size.width/3)- 60)){
        distanceSinceLastPipe += -moveAmount.x;


        if (distanceSinceLastPipe >= 140.0) {
            distanceSinceLastPipe = 0.0;

            score += 1;

            [_scoreLabel setText:[NSNumberFormatter localizedStringFromNumber:@(score)
                                                                  numberStyle:NSNumberFormatterDecimalStyle]];
            [self runAction:[SKAction playSoundFileNamed:@"pipe.mp3" waitForCompletion:NO]];
        }
    }

Как сообщить методу обновления, что трубы проходят через птицу наиболее эффективно? Подсчитать пиксели между трубами и сбросить? Или это какой-то способ определить, когда они проходят?


person simonkaspers1    schedule 17.02.2014    source источник
comment
В проектах с открытым исходным кодом используются разные подходы. Некоторые считают пиксели, а некоторые из них не имеют похожего кода.   -  person simonkaspers1    schedule 17.02.2014
comment
Зачем нужно знать положение труб?   -  person T. Benjamin Larsen    schedule 17.02.2014
comment
Так что я могу добавить балл при прохождении их. Изображение со смещением 2-3 пикселя после трубы 600.   -  person simonkaspers1    schedule 17.02.2014
comment
Вам не нужно явно знать положение, но вам нужно знать, когда трубы проходят мимо птицы, верно? Смотрите мой ответ ниже.   -  person T. Benjamin Larsen    schedule 17.02.2014


Ответы (1)


Если вы знаете горизонтальное положение птицы, вы можете использовать «простую» математику, чтобы рассчитать, сколько времени потребуется трубе, чтобы достичь положения, которое означает, что она прошла мимо птицы. Некоторый псевдокод:

CGFloat totalDistanceForPipeToMove = pipe.position.x - endPosition.x; // endPosition == the final destination for the pipe.
CGFloat relativeSpeed = totalDistanceForPipeToMove / duration; // duration being the SKAction's duration
CGFloat distanceToBird = pipe.position.x - birdPosition.x; 
CGFloat timeThePipeReachesTheBird = distanceToBird / relativeSpeed;

Затем вы можете создать SKActionSequence, запуская его в то же время, когда труба начинает двигаться:

SKAction *wait = [SKAction waitForDuration: timeThePipeReachesTheBird];
SKAction *addToScore = [SKAction performSelector:@selector(addToScore) onTarget:self]; // performing the addToScore method
SKAction *sequence = [SKAction sequence:@[wait, addToScore]];

Еще один способ добиться того, что вы ищете, — создать непобедимого спрайта, который следует за птичьим спрайтом. Всякий раз, когда этот "scoreSprite" сталкивается с трубой, вы знаете, что труба прошла мимо птицы...

person T. Benjamin Larsen    schedule 17.02.2014
comment
Об этом: CGFloat totalDistanceForPipeToMove = pipe.position.x - endPosition.x; Что такое endPosition.x? 0? @никфальк - person simonkaspers1; 17.02.2014
comment
Это конечное положение, к которому труба направляется, вероятно, отрицательное значение, pipe.size.width/2, если ваш anchorPoint равен 0.5, 0.5... - person T. Benjamin Larsen; 17.02.2014
comment
Окей, я попробовал и мне понравилась идея призрака-фея. Я реализовал это, и это следует, но когда я использую contactBitMask, он сталкивается в канале и исчезает. Разве это не должно возвращаться к контактному методу: _scoreSprite.physicsBody.categoryBitMask = scoreBitMask; _scoreSprite.physicsBody.contactTestBitMask = blockBitMask; - person simonkaspers1; 17.02.2014
comment
Как вы настраиваете призрачного спрайта? Немного сложно комментировать без деталей, но да: общая идея заключается в том, что вы используете didBeginContact: для обработки логики. Узлы не должны просто исчезать сами по себе, если вы не скажете им... - person T. Benjamin Larsen; 17.02.2014