bodyWithEdgeLoopFromRect не работает в ландшафте

Я просто пытаюсь настроить базовую сцену в ландшафте, с гравитацией и с краевой петлей.

Я настроил физическое тело сцены и физическое тело спрайта mainCharacter, вот мой код:

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        self.backgroundColor = [SKColor redColor];
        [self setPhysicsBody:[SKPhysicsBody bodyWithEdgeLoopFromRect:[self frame]]];
    }
    return self;
}


-(void)setupMain
{
    if (!self.mainCharacter)
    {
        self.mainCharacter = [[SKSpriteNode alloc] initWithImageNamed:@"spriteDefault"];

       [self.mainCharacter setPosition:CGPointMake(CGRectGetMidX([self frame]), CGRectGetMidY([self frame]))];

       [self addChild:self.mainCharacter];

       self.mainCharacter.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.mainCharacter.frame.size];
       self.mainCharacter.physicsBody.dynamic = YES;
       self.mainCharacter.physicsBody.affectedByGravity = YES;
       self.mainCharacter.physicsBody.mass = 0.02;
    }
 }

Итак, в портретном режиме все работает идеально, а вот в ландшафтном все становится совсем не так.

Я подумал, что это как-то связано

  [self setPhysicsBody:[SKPhysicsBody bodyWithEdgeLoopFromRect:[self frame]]];

Как ни странно, крайняя петля по оси x для пейзажа (ось y в портретном режиме) работает нормально, но я просто проваливаюсь по оси y (x для портрета).

Я предполагаю, что кадр возвращает положение по оси Y где-то за пределами экрана в ландшафтном режиме .... то есть где-то выше или ниже экрана. ...Может быть... Не совсем уверен.

Тем не менее, я пробовал несколько разных вариантов, в том числе вручную устанавливал прямоугольник с помощью CGRectMake(). Мне не удалось заставить что-либо работать должным образом.

Любой совет будет принят с благодарностью!!!


person Nolan Anderson    schedule 25.10.2013    source источник
comment
проверьте это stackoverflow.com/questions/19353942 /   -  person DogCoffee    schedule 25.10.2013


Ответы (3)


Ладно, это супер Джанки исправление...

 self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 200, 320, 200)];

Я не уверен, почему это работает ... и, очевидно, будут некоторые проблемы на экранах меньшего размера ... Мы будем очень признательны за более качественные исправления и объяснения !! Спасибо

person Nolan Anderson    schedule 25.10.2013
comment
см. комментарий Смика для фактического решения - person LearnCocos2D; 25.10.2013

Вам нужно будет настроить петлю края в viewWillLayoutSubviews, так как размер сцены известен только тогда:

-(void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];

// Configure the view.
SKView * skView = (SKView *)self.view;
if (!skView.scene) {
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    [skView presentScene:scene];
}

}

person DubaiCoder    schedule 01.04.2014

Вам нужно установить CollisionBitMask вашего mainCharacter равным sceneCategory (необходимо создать). Ваши узлы будут затронуты только в том случае, если вы сообщите им об этом.

person Diogo Aleixo    schedule 27.01.2015