2016-01-03 7 views
0

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

Вот Shapes Класс:

class Shapes: SKNode{ 

var cY = SKSpriteNode(imageNamed: "Shape1") 
var sY = SKSpriteNode(imageNamed: "Shape2") 
var pY = SKSpriteNode(imageNamed: "Shape3") 


convenience init(pOffset: CGFloat) { 
    self.init() 
    positionOffset = pOffset 

    self.addChild(cY) 
    self.addChild(sY) 
    self.addChild(pY)  
} 

func updateDelta(delta: NSTimeInterval) { 

    ..... 
} 

GameScene Класс:

var can1 : Shapes! 

let shapesCategory: UInt32 = 1 << 0 
let seaCategory: UInt32 = 1 << 1 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var sea = SKSpriteNode(imageNamed: "sea") 
    sea.position = pos1 

    physicsWorld.contactDelegate = self 

    sea.physicsBody = SKPhysicsBody(circleOfRadius: square.size.height/2) 
    sea.physicsBody!.affectedByGravity = false 
    sea.physicsBody!.dynamic = false 
    sea.physicsBody!.categoryBitMask = seaCategory 
    sea.physicsBody!.collisionBitMask = shapesCategory 
    sea.physicsBody!.contactTestBitMask = shapesCategory 

    addChild(sea) 

    // for now I'm just dealing with if shape 1 was to spawn 
    can1 = Shapes(pOffset: size.width/4) // a shape spawns on this point 
    can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: self.size.height/28) 
    can1.cY.physicsBody!.dynamic = false 
    can1.cY.physicsBody?.categoryBitMask = shapesCategory 
    can1.cY.physicsBody?.collisionBitMask = seaCategory 
    can1.cY.physicsBody?.contactTestBitMask = seaCategory 

    addChild(can1) 
} 

func didBeginContact(contact: SKPhysicsContact) { 
    if (contact.bodyA.categoryBitMask) == seaCategory || (contact.bodyB. 
     categoryBitMask) == shapesCategory { 

     print("contact") 
    } 

} 

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

Edit: исправлены некоторые ошибки в строке кода

+0

ваш код не так с самого начала идти, ваши формы не имеют физических тел, поэтому присвоение категории не делает ничего для них, вы не должны иметь контакт произойдет – Knight0fDragon

+0

Оформить заказ https://github.com/carlbutron/Swift В разделе AnimationWithCollision вы найдете то, что ищете. – mn1

+0

@ Knight0fDragon Да, вот что я думаю, но я пока не могу найти способ назначить им физическое тело в классе фигур. – Sharukh

ответ

1

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

Вместо объявить свое тело, как это:

can1.cY.physicsBody = SKPhysicsBody(circleOfRadius: can1.cy.size.width/2) 

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

can1.cY.physicsBody!.dynamic = false 

Наконец, у вас есть проблемы с вашим didBeginContact кодом, порядок не сохраняется, кто бьет, кто, так что вам нужно, чтобы убедиться, что вы проверяете ваши поля правильно.

То, что вы хотите что-то вроде этого:

func didBeginContact(contact: SKPhysicsContact) { 
    let bodyA = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyA : contact.bodyB 
    let bodyB = (contact.bodyA.categoryBitMask <= contact.bodyB.categoryBitMask) ? contact.bodyB : contact.bodyA 

    if ((bodyA.categoryBitMask == shapesCategory) && (bodyB.categoryBitMask == seaCategory)){ 

     print("contact") 
    } 

} 
Смежные вопросы