SpriteKit: позиционирование спрайтов

Недавно я нашел руководство о том, как создать игру вроде Flappy Bird с помощью SpriteKit. Вместо реализации тап-механизма я использовал акселерометр устройства, чтобы перемещать птицу вправо и влево. Моя проблема сейчас связана с генерирующими трубами. Метод, использованный в уроке, создает трубы по оси x, а не по оси y, что я и хочу сделать.

-(void)createPipes
{
   SKTexture* _pipeTexture1 = [SKTexture textureWithImageNamed:@"Pipe1"];
   _pipeTexture1.filteringMode = SKTextureFilteringNearest;
   SKTexture* _pipeTexture2 = [SKTexture textureWithImageNamed:@"Pipe2"];
   _pipeTexture2.filteringMode = SKTextureFilteringNearest;

   SKNode* pipePair = [SKNode node];
   pipePair.position = CGPointMake( self.frame.size.width + _pipeTexture1.size.width * 2,   0 );
   pipePair.zPosition = -10;

   CGFloat y = arc4random() % (NSInteger)( self.frame.size.height / 3 );

   SKSpriteNode* pipe1 = [SKSpriteNode spriteNodeWithTexture:_pipeTexture1];
   [pipe1 setScale:2];
   pipe1.position = CGPointMake( self.frame.size.width/2 -100, self.frame.size.height+250 );
   pipe1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:pipe1.size];
   pipe1.physicsBody.dynamic = NO;
   [pipePair addChild:pipe1];

   SKSpriteNode* pipe2 = [SKSpriteNode spriteNodeWithTexture:_pipeTexture2];
   [pipe2 setScale:2];
   pipe2.position = CGPointMake( self.frame.size.width/2 +100, self.frame.size.height+250 );
   pipe2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:pipe2.size];
   pipe2.physicsBody.dynamic = NO;
   [pipePair addChild:pipe2];

   SKAction* movePipes = [SKAction repeatActionForever:[SKAction moveByX:0 y:-2 duration:0.02]];
   [pipePair runAction:movePipes];

   [self addChild:pipePair];
 }

Моя идея состоит в том, чтобы генерировать трубы, которые падают с «неба», и птица должна перемещаться между трубами, чтобы продолжать жить. Я надеюсь, что описание моей проблемы было очень ясным :) Спасибо

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


person Sahbi Belgacem    schedule 23.02.2014    source источник


Ответы (2)


Спасибо за ссылку на урок!

Если вы хотите, чтобы трубы упали, просто дайте им упасть! К трубам прикреплены физические тела, поэтому они должны падать с неба в зависимости от их вертикального положения. Тогда нет необходимости использовать SKAction для перемещения труб. Однако вам нужно изменить их флаг dynamic на YES, чтобы применить гравитационную силу. См. ссылку Xcode:

Логическое значение, указывающее, перемещается ли физическое тело при моделировании физики. Значение по умолчанию — ДА. Если значение НЕТ, то физическое тело игнорирует все приложенные к нему силы и импульсы. Это свойство игнорируется для тел с ребрами; они автоматически статичны.

person digitalbreed    schedule 23.02.2014
comment
На самом деле трубы падают горизонтально, но проблема в их расположении на экране. Когда они падают, я не вижу ни конца трубы для правой, ни начала левой. - person Sahbi Belgacem; 23.02.2014
comment
Возможно, я не совсем понимаю, что вы хотите сделать (может быть, поделитесь скриншотом?!), но тем не менее я хочу поделиться одной идеей: помните, что два канала являются дочерними элементами родительского элемента _pipePair и расположены относительно родителя. Родитель по-прежнему расположен у правого края экрана, как в учебнике, и вы ДОБАВЛЯЕТЕ дополнительное пространство в пикселях поверх него. Возможно, вам нужно обновить это, чтобы удовлетворить ваши потребности. - person digitalbreed; 23.02.2014
comment
Да, именно мне нужно изменить положение спрайтов в соответствии с моими потребностями. Я пытаюсь со вчерашнего дня найти правильные значения для труб. Посмотрите мой скриншот [ссылка] (dropbox.com/s /pnfukiwugtnme45/) - person Sahbi Belgacem; 23.02.2014
comment
Я пытался написать ответ в виде текста, но в конце концов я думаю, что картинка говорит больше, чем тысяча слов. Взгляните сюда, чтобы увидеть, как я бы расположил узлы. i58.tinypic.com/jkg3mv.png Обратите внимание, что текст (-1 = ничего, 1 = полная ширина) на самом деле должно быть (-1 = ничего, 0 = полная ширина) - person digitalbreed; 24.02.2014
comment
... и я не ожидал, что этот сервис изображений изменит мою картинку с PNG на JPG. Я сдаюсь. Свяжитесь со мной напрямую, если необходимо. - person digitalbreed; 24.02.2014
comment
По крайней мере, теперь я вижу конец правой трубы. Спасибо мужик за помощь. Я очень ценю это. :) - person Sahbi Belgacem; 24.02.2014
comment
Кстати, как я могу связаться с вами напрямую ..?? Я не нашел никакой контактной информации в вашем профиле..! - person Sahbi Belgacem; 24.02.2014
comment
У меня есть контактная форма на моей странице, и вы можете оставить комментарий к сообщению в блоге. - person digitalbreed; 25.02.2014

Я наконец нашел решение. Изменив значения положения труб, как показано ниже, мне удалось заставить их правильно отображаться на экране.

SKSpriteNode* pipe1 = [SKSpriteNode spriteNodeWithTexture:_pipe1];
pipe1.position = CGPointMake( (-0.39*pipe1.size.width), 0 );
SKSpriteNode* pipe2 = [SKSpriteNode spriteNodeWithTexture:_pipe2];
pipe2.position = CGPointMake(self.frame.size.width  *1.8, 0 );

Результат ==> картинка

Большой проблемой сейчас является найти способ сделать положение труб каким-то случайным. :)

person Sahbi Belgacem    schedule 24.02.2014