SKSpriteNode с цветом не отображается

Я создал SKSPriteNode без текстуры, но с цветом

let tileNode = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 80.0, height: 120.0))
tileNode.position = CGPointMake(50, 50)
tileNode.name = "rectangle"
addChild(tileNode)

Но узел не отображается на экране.

Тем не менее, я могу обнаружить это с помощью сенсорного столкновения

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    let location: CGPoint = (touches.anyObject() as UITouch).locationInNode(tilesLayer)
    let rect: SKSpriteNode = tilesLayer.childNodeWithName("rectangle") as SKSpriteNode
    if rect.containsPoint(location) {
        println("TOUCHED")    //It works
    }
}

EDIT: цвет SKSpriteNode скрыт только при наличии фоновой текстуры SKSpriteNode. Полный код: https://gist.github.com/BabyAzerty/9dca752d9faa7b768bf0


person Kalzem    schedule 01.12.2014    source источник


Ответы (2)


Я полагаю, вы создали свой проект, используя шаблон проекта Game в Xcode, верно? Ваша проблема заключается в этой строке в GameViewController.m (примерно строка 41).

/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = YES;

Если вы установите для этого параметра значение NO, то он будет отображаться так, как вы ожидаете. Я создаю свои игровые проекты из пустых проектов, поэтому у меня никогда не было этого свойства. Просто найдите свой код для ignoresSiblingOrder

Конечно, если вам нужна оптимизация рендеринга, вы всегда можете использовать zPosition.

person Mobile Ben    schedule 03.12.2014

Я заметил, что разница между созданием SKSpriteNode с текстурой и SKSpriteNode с цветом заключается в том, что версии текстуры не нужно изменять z-индекс. Он будет отображаться поверх предыдущего addChild(someNodes) автоматически.

Они оба имеют z-индекс по умолчанию 0, но по некоторым причинам SKSpriteNode с цветом скрыт за вашим предыдущим addChild (someNodes).

Эта строка должна помочь:

tileNode.zPosition = 1 //Or higher

Однако я решил создать перечисление, которое управляет различными z-слоями (точно так же, как в Unity Engine):

enum ZLayer: CGFloat {
    case Undefined = 0
    case Background
    case Foreground
    case GUI
}

И используйте это так:

tileNode.zPosition = ZLayer.Background.rawValue

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

person Kalzem    schedule 01.12.2014
comment
Итак, я прочитал это сообщение, и ваша работа вокруг показалась странной. Я действительно проверил то, что вы сказали, в своем собственном коде. Обратите внимание, что я использовал для этого Obj-C, но конечный результат должен быть таким же (в противном случае, я думаю, это будет ошибка SK). Я обнаружил, что если я добавляю цветной прямоугольник после других узлов someNodes, мой цветной прямоугольник отображается после некоторых узлов. Я бы порекомендовал вам добавить отладку, чтобы распечатать дерево узлов. - person Mobile Ben; 02.12.2014
comment
Только что попробовал в Obj-C, бывает. Я отредактировал свой пост, чтобы добавить полную функцию (суть). Использование XCode 6.1 - person Kalzem; 02.12.2014